From edcd20f0782b089aa544b2a5486b37da567a973c Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 5 Nov 2026 11:07:58 -0500 Subject: [PATCH 1/4] wai: a later schedule adds passes, what a receiver needs rides on the bearer, and a node schedules its own one-way sending MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Carousel §4.5 and §6.2 step 4: along their chain, a later schedule of one instance that keeps every earlier entry, with at least its passes at the same instants sending the same symbols, extends the one before it and may add objects. The last stands and the earlier are labelled `extended`. A schedule that drops an object, or withdraws, moves or changes a pass, still sets aside every schedule of its instance. Timeliness plans read the same schedule. Carousel §8.1 and §8.2: on an instance whose schedule stands, the publisher sends the group receipt, its claims from the head of their chain to the instance's last schedule, and the head of its origin's key log, at least once per the schedule's interval. A verifier given what a receiver acquired checks that it suffices: inband_chain_incomplete, inband_not_scheduled or inband_key_log_missing otherwise. Cache-authority §5.6, §7.2 step 4, §7.3 and carousel §4.3 step 2: a node states its plan for its own cache instance in a schedule claim signed by its own key. The cache verdict reads schedules, publisher's and nodes', sets aside another key's schedule of a node's instance (cache_schedule_signer_mismatch), and holds a statement of carousel §6.4 to the schedule that stands. A node's schedule credits nothing. Vectors for each rule in the carousel, timeliness and cache-authority corpora, verified by wai-rs and by the Python verifiers, each with mutated copies and weakened checks for the new rules. On the timeliness ladder: a plan and a run take a rung over a schedule a later one extends, a plan loses it over the same two withdrawing a pass, and timeliness §7.5.1 says a run does not date its claims. Co-Authored-By: Claude Opus 5.5 --- ...rousel-extension-in-band-cache-schedule.md | 30 + wai/claim-conformance/claim_verify.py | 4 +- wai/extensions/cache-authority.md | 112 +- wai/extensions/carousel.md | 160 +- wai/extensions/jwp-receipts.md | 12 +- wai/extensions/timeliness.md | 14 +- .../cache-authority/README.md | 13 +- .../cache-authority/vectors.json | 3776 ++++++++++++++++- .../cache_authority_verify.py | 108 +- wai/live-conformance/carousel/README.md | 13 +- wai/live-conformance/carousel/vectors.json | 2407 ++++++++++- wai/live-conformance/carousel_verify.py | 220 +- wai/live-conformance/timeliness/README.md | 2 +- wai/live-conformance/timeliness/vectors.json | 1510 +++++++ wai/live-conformance/timeliness_verify.py | 30 +- wai/wai-rs/src/cache_authority.rs | 125 +- wai/wai-rs/src/cache_authority/corpus.rs | 377 +- wai/wai-rs/src/carousel.rs | 280 +- wai/wai-rs/src/carousel/corpus.rs | 469 +- wai/wai-rs/src/claim_receipt/schedule.rs | 84 +- wai/wai-rs/src/timeliness.rs | 13 +- wai/wai-rs/src/timeliness/corpus.rs | 105 +- wai/wai-rs/tests/carousel.rs | 3 +- 23 files changed, 9667 insertions(+), 200 deletions(-) create mode 100644 wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md diff --git a/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md b/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md new file mode 100644 index 000000000..6d98db698 --- /dev/null +++ b/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md @@ -0,0 +1,30 @@ +### A later schedule adds passes, what a receiver needs rides on the bearer, and a node schedules its own one-way sending + +- **Adding passes is no contradiction** ([extensions/carousel.md](extensions/carousel.md) §4.5, §6.2 step 4): along + their chain, a later schedule of one instance that keeps every earlier entry, with at least its passes at the same + instants sending the same symbols, extends the one before it, and may add objects. The last stands and the earlier + are labelled `extended`. An object available stays available at the same pass, a statement that held still holds, + and a plan listens to what it listened to and completes where it completed. A schedule that drops an object, or + withdraws, moves or changes a pass, still sets aside every schedule of its instance (`schedule_contradicted`). A + timeliness plan reads the same schedule, and labels it the same. A single pass's period, which is not read, may be + given by the schedule that extends it. +- **In-band repetition** (carousel §8.1, §8.2): on an instance whose schedule stands, the publisher sends on the + instance the group receipt, its claims from the head of their chain to the instance's last schedule, and the head + of its origin's key log, at least once per the schedule's interval: the least period of its entries of two passes or + more, or, where every entry has one pass, the least duration. A verifier given what a receiver acquired checks that + it suffices: `inband_chain_incomplete`, `inband_not_scheduled` or `inband_key_log_missing` otherwise, and the + interval as `inband_ms`. A log on the bearer still anchors nothing. +- **A node's schedule** ([extensions/cache-authority.md](extensions/cache-authority.md) §5.6, carousel §4.3): a node + states its plan for its own cache instance in a `schedule` claim signed by its own key, which needs `schedule` from + its operator. The verdict of cache-authority §7 now reads schedules: a publisher's by carousel §6.2 step 4, a node's + beside its own instance, and another key's schedule of that instance is set aside + (`cache_schedule_signer_mismatch`) and contradicts nothing. A statement of carousel §6.4 offered with a loss bound + and an overhead is held to the schedule that stands there. A node's schedule credits nothing, and carousel's verdict + and timeliness' plan read the publisher's schedules alone. +- **Breaking:** `api:rust:wai::carousel::ClaimVerdict::Extended` and `api:rust:wai::timeliness::ClaimVerdict::Extended`: a + schedule a later one extends is a new label, not `stands`. A match over either enum takes the new arm. +- **Breaking:** `api:rust:wai::cache_authority::ClaimVerdict::Stands` and `api:rust:wai::cache_authority::ClaimVerdict::Extended`: + the cache verdict now reads schedules. A match over the enum takes the new arms; a schedule that was `context_mismatch` + there now gets one of them. +- **Breaking:** `api:rust:wai::cache_authority::Inputs::held` and `api:rust:wai::cache_authority::Verdict::held`: the + statement of carousel §6.4 the verdict holds to a schedule. A caller that builds `Inputs` field by field sets `held: None`. diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 1404367f4..e18caea59 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -2479,8 +2479,8 @@ def carousel_claims(path): doc = json.load(f) fail = n = 0 checks = [] - for case in doc["verdicts"]: - if case["outcome"]["outcome"] != "verdict": + for case in doc["verdicts"] + doc["inband"]: + if case["outcome"]["outcome"] == "refuse": continue for wire, stated in zip(case["claims"], case["outcome"]["claims"]): m = re.fullmatch(r"reject step=(\d) reason=(\S+)", stated) diff --git a/wai/extensions/cache-authority.md b/wai/extensions/cache-authority.md index c59bc6641..742873515 100644 --- a/wai/extensions/cache-authority.md +++ b/wai/extensions/cache-authority.md @@ -15,7 +15,8 @@ > with the caches' instances beside the publisher's, crediting a cache per instance and only for > what it says it sent (§7); and counts, of a population of receiver keys stated for a region, how > many held an object by a deadline on their own signed word, with a miss rate in parts per million -> held to a target (§8). WAI defines no transport. The reference implementation is the +> held to a target (§8). A node states its plan for its own instance in a [carousel](carousel.md) +> `schedule` claim signed by its own key (§5.6). WAI defines no transport. The reference implementation is the > `cache_authority` module of `wai-rs` (feature `cache_authority`), with the class's body in > `claim_receipt::bearer`; the corpus is > [`live-conformance/cache-authority/`](../live-conformance/cache-authority/), and its second @@ -30,9 +31,10 @@ ## 1. Scope In scope: the authorities a node that serves from what it holds signs under, who gives them, and -how a verifier places a server key (§4); the cache-transmission claim (§5); what a receiver of a -peer-served object does (§6); the bearer verdict with a cache's instances (§7); and the count of a -stated population's receivers that held an object by a deadline (§8). +how a verifier places a server key (§4); the cache-transmission claim and a node's schedule of its +own instance (§5); what a receiver of a peer-served object does (§6); the bearer verdict with a +cache's instances and their schedules (§7); and the count of a stated population's receivers that +held an object by a deadline (§8). Out of scope: a transport; how a node chooses what to keep, or an asker whom to fetch from, which are [holdings](holdings.md) §5.4's; a record of service beside settlement's acknowledgement and @@ -95,7 +97,8 @@ another key signed. Under it the key signs its holdings records (holdings §4) a declarations of what it served (settlement §4), and is the `upstream` of the acknowledgements its receivers sign (settlement §3). A key that also holds `cache-transmission` signs cache-transmission claims (§5), each declaring a bearer instance of its own and the objects of one -group it sent over it. That is all either covers. +group it sent over it, and one that holds `schedule` as well schedules those instances (§5.6). That +is all either covers. ### 4.2 What neither lets a key claim @@ -117,9 +120,9 @@ when it stores and serves byte for byte. jwp-receipts §4.3 binds it either way. ### 4.3 Who gives them -The **node's operator's origin** lists, in its key log, the nodes it runs with `cache/serve`, and -with `cache-transmission` those that declare instances of their own, as it lists its relays with -`live/relay` and `delivery-gap`: +The **node's operator's origin** lists, in its key log, the nodes it runs with `cache/serve`, with +`cache-transmission` those that declare instances of their own, and with `schedule` those that +schedule them, as it lists its relays with `live/relay` and `delivery-gap`: - **Integrity needs no grant.** A node changes no byte, so jwp-receipts §3 verifies what it serves against the publisher's receipts, whoever it is. `edge/derive` comes from the source's origin @@ -292,6 +295,47 @@ nor `delivery`. Where `energy` is not `null`, its figure is a second item that n `cache-transmission` and `energy/`, as a transmission's does (bearer-receipts §4.4). The claim's signer is placed as a server by §4.4, reported beside. +### 5.6 A schedule of a cache instance + +A node that sends over a cache instance to a plan **MAY** state the plan in a `schedule` claim +(carousel §4), so that a receiver of its instance plans as a receiver of the publisher's does and +turns its radio off between the passes that add nothing (carousel §7). Its `subject` is the group +receipt's link hash and its `bearer_id` the instance's, and it is signed by the node's key, never +the group's. Its body, rules and blocks are carousel §4.1, §4.2 and §5's; a later schedule extends it +as carousel §4.5 says; and its availability and the statements held to it are carousel §6.3 and +§6.4's. It attests that the node scheduled the passes it names. It does not attest that they were +sent, which is its cache-transmission claim's, that any receiver heard them, or that the node had any +right of the publisher's to send them (§5.4). + +**Against the group.** At jwp-receipts §3.1 step 6 in the verdict of §7, a schedule signed by the +group's key is the publisher's and is checked by carousel §4.3. One signed by another key is a +node's and is checked by carousel §4.3 but for its step 2, raising that text's codes at its other +steps. Carousel's verdict and timeliness' plan read the publisher's schedules alone. + +**Where it stands.** At §7.2 step 4, in this order: + +1. every node's schedule of an instance is set aside `bearer_contradicted` when an accepted + transmission claim has that `bearer_id`, whether its declarations stand or were set aside, or when + the instance is a contradicted cache instance: it is not the node's to plan; +2. every node's schedule of an instance is set aside `bearer_not_declared` when no cache instance + stands with that `bearer_id`; +3. a schedule whose signer is not the instance's server is set aside + `cache_schedule_signer_mismatch`: a node schedules only the instance it declares, and another + key's schedule of it contradicts nothing; +4. of the server's schedules, in the order of its chain, when one does not extend the one before it + (carousel §4.5) every one of them is set aside `schedule_contradicted`, and the instance itself + stands. A node that withdraws, moves or changes a pass has stated neither plan. + +Otherwise the last of them **stands**, and each before it with another body is **extended**. + +A cache-transmission claim says what was sent and comes after it (§5), and a schedule says what will +be sent and may come before, so either may come first in the node's chain. A schedule may name +objects the node's claim does not. **It credits nothing**: a cache is credited only for what its +claim says it sent (§7.2 step 6), and a schedule changes no count, no status and no placement. + +**Authority.** Confirmed under jwp-receipts §7, the claim needs `schedule` (carousel §4.4), which the +node's operator gives beside `cache-transmission` (§4.3). + ## 6. A peer-served object at the receiver - **The verdict is unchanged.** The receiver verifies the object under its object receipt and the @@ -313,7 +357,8 @@ claim's signer is placed as a server by §4.4, reported beside. Bearer-receipts §6.1's — the group receipt, the object receipts with envelopes where held, the claims in each signer's chain order, optionally a sink's own class and instance, a statement -offered and `count_only` — with cache-transmission claims among the claims, and the heads of §4.4. +offered and `count_only` — with cache-transmission and schedule claims among the claims, the heads of +§4.4, and optionally a statement of carousel §6.4 with its loss bound and overhead (§7.3). A verifier that implements bearer-receipts and not this extension refuses a cache-transmission claim (`unknown_class` before this registration, `context_mismatch` at bearer-receipts §6.2 step 3 @@ -326,8 +371,8 @@ unknown class is reported, as jwp-receipts §2.4.4 requires, never counted. with its reason, and nothing is derived from it. 2. **The claims**, in order: jwp-receipts §3.1 steps 1 to 5, then step 6: a transmission claim by bearer-receipts §4.3, a reconciliation by bearer-receipts §5.3, a cache-transmission claim by - §5.3 here. A claim of any other class is `context_mismatch`. A refused claim takes no further - part. + §5.3 here, a schedule by carousel §4.3 or §5.6 here. A claim of any other class is + `context_mismatch`. A refused claim takes no further part. 3. **The publisher's declarations**: bearer-receipts §6.2 step 4. 4. **The caches' instances**: the accepted cache-transmission claims, by `bearer_id`. Every claim of an instance is set aside `bearer_contradicted` when: @@ -339,6 +384,9 @@ unknown class is reported, as jwp-receipts §2.4.4 requires, never counted. Two with the same signer and body are one, whatever their `issued_at` and `seq`. Otherwise the instance **stands**; its **server** is the claims' signer, placed by §4.4. + + Then the schedules: those signed by the group's key by carousel §6.2 step 4, over step 3's + declarations, and a node's by §5.6. 5. **The reconciliations**, each accepted one in order, are counted as bearer-receipts §6.2 step 5 counts them, over the publisher's declarations and the caches' instances that stand. One is set aside, and counted nowhere, at the first of these that holds: @@ -366,8 +414,8 @@ unknown class is reported, as jwp-receipts §2.4.4 requires, never counted. A claim's label is bearer-receipts §6.2's (`declared`, `counted`, `joined reason=reconciliation_duplicate_sink`, `set-aside reason=…`, -`reject step=N reason=…`), and `cache-declared` for a cache-transmission claim whose instance -stands. +`reject step=N reason=…`), `cache-declared` for a cache-transmission claim whose instance +stands, and `stands` or `extended` for a schedule. ### 7.3 Status, statements and a sink's own instance @@ -385,6 +433,13 @@ stands. declaration stands for it, `declared` when the classes agree and `bearer_contradicted` when they do not; where a cache instance stands for it, `cache-declared` when the classes agree and `bearer_contradicted` when they do not; otherwise `bearer_not_declared`. +- **A statement held to a schedule**: carousel §6.4's, that object *i* or the group is held by *t* on + an instance, offered with a loss bound *L* and an overhead *h*, is checked against the schedule that + stands on that instance, the publisher's or a node's. It holds, or it is refused with carousel + §6.4's reason, `object_not_scheduled` where no schedule stands there, and `loss_bound_invalid` or + `overhead_invalid` where *L* or *h* is out of range, as carousel §6.2 checks them; only the + statement is refused. On a node's instance it speaks for the node's schedule, and says no more than + carousel §6.4 says of the publisher's. Never delivered on the publisher's word (bearer-receipts §6.3) holds unchanged, and never delivered on a node's. @@ -555,9 +610,10 @@ a loss bound; a relying party may hold both. The asker's plan of whom to fetch f - **holdings**: a holder signs with the key its operator lists to be placed (§4.5; holdings §9). A record is the third kind of held-at statement §8.3 reads. - **carousel**: availability (carousel §6.3) is the publisher's plan for a receiver within a loss - bound; a node repairs what that plan did not cover, and §8 counts the outcome. A cache instance - has no schedule: a schedule is signed by the group's key (carousel §4.3 step 2), and a - cache-transmission claim and a schedule share no instance (§7.2 step 4). + bound; a node repairs what that plan did not cover, and §8 counts the outcome. A node's plan for + its own instance is a schedule of its own (§5.6), which shares no instance with the publisher's: a + publisher's schedule stands beside a publisher's declaration, and a node's beside its own + cache-transmission claim (§7.2 step 4). - **bearer-receipts**: the verdict extends its §6.2 here, as carousel's does. Its §7 bound applies to each cache instance, and its §8 holds for a node's key: a receiver with no path back places a node only by heads provisioned in advance, and a key log arriving over the node's instance @@ -628,6 +684,7 @@ The codes this extension adds, each with where it is raised: | `cache_transmission_leaf_count_mismatch` | §5.3 step 3 | | `cache_transmission_objects_not_held` | §5.3 step 4 | | `cache_transmission_root_mismatch` | §5.3 step 4 | +| `cache_schedule_signer_mismatch` | §5.6 | | `population_invalid` | §8.2 | | `target_invalid` | §8.2 | | `object_not_verified` | §8.2 | @@ -637,7 +694,9 @@ The extension also raises `key_revoked`, `key_retired` and `authority_not_grante §7.7), at the levels §4.4 gives them, and `key_log_not_held` (deriving-edge §9), at §4.4; `bearer_contradicted`, `bearer_not_declared`, `sink_not_confirmed`, `reconciliation_duplicate_sink`, `delivery_not_reconciled` and `delivery_exceeds_reconciled` -(bearer-receipts §10) at §7.2 and §7.3; `self_acknowledged` (settlement §11) at §7.2 step 5; +(bearer-receipts §10) at §7.2 and §7.3; a schedule's codes of carousel §4.2 and §4.3 at jwp-receipts +§3.1 steps 4 and 6, `schedule_contradicted` and `schedule_on_bidirectional` (carousel §9) at §7.2 step +4, and carousel §9's statement and bound codes at §7.3; `self_acknowledged` (settlement §11) at §7.2 step 5; `object_out_of_range` (holdings §7), `context_invalid` (jwp-receipts §3.1) and `deadline_not_stated` (timeliness §9) at §8.2; settlement §3.6's codes and `record_missing` for an acknowledgement, holdings §7's codes for a holdings record, and `held_before_group` (timeliness §9) @@ -656,8 +715,10 @@ regions are ISO 3166-1's user-assigned codes. It has: sent from a group, every object with no object receipt held, the last object of a group of nine, labelled leaves, a metered instance, a chained second claim; a chain broken and a parent not held; one negative control for each rule of §5.2 and each step of §5.3, an unknown bearer class, - an extra member and an energy figure of 0; a context that is not a group receipt; and a claim with - no group, which stops at step 5. + an extra member and an energy figure of 0; a context that is not a group receipt; a claim with + no group, which stops at step 5; and a node's schedule (§5.6) and a publisher's, a node's chained + after its claim, and one of a node's refused at each of carousel §4.3's steps it keeps and at + §4.2 rule 3.3. - **Placements**: each step of §4.4, the least origin, a serving role other than `cache/serve`, a retired key at its `until` and a millisecond past it, a revocation beating a confirmation and outliving another role, a head not held, a head under another origin, and a revocation beside a @@ -668,8 +729,11 @@ regions are ISO 3166-1's user-assigned codes. It has: standing and contradicted; two caches on one instance; one claim twice and a cache contradicting itself; each reason of §7.2 step 5; placements of every level beside unchanged counts, and a retired node's two claims of one instance on either side of its `until`; a sink on a cache - instance; the energy bound before and after keys are counted, and unmetered; another class; and a - group that fails. + instance; the energy bound before and after keys are counted, and unmetered; another class; a + group that fails; and a node's schedule that stands before and after its claim, is extended, is + contradicted by its own node, is set aside for each step of §5.6 and credits nothing, a stranger's + beside it, a publisher's that stands and one on a node's instance, with a statement held to each + that holds, comes too late, is not within the schedule, has no entry, and is out of bounds. - **Tallies**: a target met exactly and missed by one ppm, a rate rounded up; an acknowledgement ending at the deadline and one and two microseconds past it; a reconciliation signed at the deadline, a microsecond past it, below a second, with an offset and at second 60; evidence before @@ -699,7 +763,8 @@ appears, and that §11 lists exactly the reference's codes. `live-conformance/cache_authority_verify.py` is the second implementation, written from this text: it shares no code with `wai-rs`; it verifies groups and objects with the JWP corpus's second implementation (`jwp-conformance/jwp_verify.py`), claims through steps 1 to 5 with the claim -corpus's (`claim-conformance/claim_verify.py`), reconciliations with the bearer corpus's +corpus's (`claim-conformance/claim_verify.py`), schedules against their group and their extensions and +availability with the carousel corpus's (`live-conformance/carousel_verify.py`), reconciliations with the bearer corpus's (`live-conformance/bearer_verify.py`), acknowledgements with the settlement corpus's (`live-conformance/settlement_verify.py`), key logs with the signer corpus's (`signer-conformance/signer_verify.py`), held-at statements with the timeliness corpus's @@ -710,7 +775,8 @@ checks in turn and requires the corpus to catch the weakened verifier. ## 13. Security and privacy considerations -- **A node's claim is its word.** A false one is evidence against its key. +- **A node's claim is its word.** A false one is evidence against its key, and so is a schedule of + passes it did not send. - **A placement is as good as the heads named.** It is the relying party's choice of logs, held under jwp-receipts §7.2 rules 1 to 3 only; a head that is not the head of an origin it anchored (jwp-receipts §7.3) is its own say-so. A revocation the relying party has not retrieved is not in diff --git a/wai/extensions/carousel.md b/wai/extensions/carousel.md index 1748afc1a..a3fe35c57 100644 --- a/wai/extensions/carousel.md +++ b/wai/extensions/carousel.md @@ -9,7 +9,10 @@ > transmission claim of [bearer-receipts](bearer-receipts.md) §4. From it a verifier derives, > for each object, when a receiver whose losses stay within a stated bound holds it (§6): the > deadline a one-way bearer can promise, with the decoding failure the FEC code bounds. A -> receiver derives the passes it must listen to and when it may turn its radio off (§7). WAI +> receiver derives the passes it must listen to and when it may turn its radio off (§7). A later +> schedule adds passes to an earlier one without contradicting it (§4.5), and the receipts a +> receiver needs ride on the instance itself, so one that joins mid-carousel recovers them there +> (§8.1, §8.2). WAI > defines no transport and no code: the codes are RaptorQ (RFC 6330) and Compact No-Code > (RFC 5445), and the schedule declares their parameters. The reference implementation is the > `carousel` module of `wai-rs` (feature `carousel`), with the class's body in @@ -25,9 +28,11 @@ ## 1. Scope -In scope: the schedule claim (§4); how an object is divided into source blocks and symbols -under each code (§5); when an object is held by a receiver whose losses stay within a bound, -and the statements a verifier may check against it (§6); the passes a receiver listens to (§7). +In scope: the schedule claim and how a later one extends an earlier one (§4); how an object is +divided into source blocks and symbols under each code (§5); when an object is held by a receiver +whose losses stay within a bound, and the statements a verifier may check against it (§6); the +passes a receiver listens to (§7); and what a publisher repeats on the instance for a receiver +that joins mid-carousel, and whether what it acquired suffices (§8.1, §8.2). Out of scope: encoding and decoding symbols, which are the codes' own (RFC 6330 §5, RFC 5445 §3); a transport, and how symbols are packed into packets; a model of a channel. Every @@ -144,7 +149,9 @@ of those it holds. In order: 1. the group's link hash is the claim's `subject` (`schedule_subject_mismatch`); 2. the claim's `signer_pubkey` is the group's (`schedule_signer_mismatch`): only the publisher - schedules its own transmission; + schedules its own transmission. A node schedules the instance it declares as its own under + [cache-authority](cache-authority.md) §5.6, in the verdict that holds that instance, which + replaces this step and no other; every other verdict reads the publisher's schedules alone; 3. every `leaf_index` is less than the group's `leaf_count` (`schedule_leaf_out_of_range`); 4. no entry's first pass starts before the group does (`schedule_before_group`): ⌊`first_ms` / 1000⌋ is at least the seconds jwp-receipts §2.4.3 reads from `group_start`, its fraction @@ -159,7 +166,40 @@ A schedule checked without the group stops at step 5 and is not counted by §6. Confirmed under jwp-receipts §7, a schedule claim needs the authority `schedule`, which is not pinned-only and is not `delivery`. An origin gives it to the keys that publish its groups, as it -gives `transmission`. +gives `transmission`, and a node's operator to the nodes that schedule their own instances +(cache-authority §4.3). + +### 4.5 Extending a schedule + +A publisher **MAY** add to a schedule it has published, after a fade or for a longer transmission, +by signing a later schedule of the same instance that extends it. Schedule *B* **extends** schedule +*A* of one `bearer_id` when *B* has, for every entry of *A*, an entry of the same `leaf_index` that +extends it; and an entry extends another when its passes begin with the other's, at the same +instants and sending the same symbols: + +- its `count` is at least the other's; +- its `period_ms` is the other's, unless the other has one pass, whose period is not read (§4.2 + rule 3.3); +- each of its other members is the other's. + +*B* **MAY** also have entries for objects *A* has none for. Every schedule extends itself, and a +schedule that extends one that extends a third extends the third. *B* is held to §4.2 and §4.3 on +its own, so rule 3.3 and §5.4's bound on ESIs hold for its greater count. + +Nothing *A* states is weakened by *B*, at any loss bound and overhead: + +- each pass of *A* is a pass of *B*, and §5.4 gives it the same ESIs, which depend only on the + pass and on *m*; +- an entry available under *A* (§6.3) is available under *B* at the same pass. One not available + under *A* may be under *B*: by a later pass under `raptorq` and `advance`, while under `repeat` + and `no-code` the first pass decides and the answer is the same; +- a statement that holds under *A* (§6.4) holds under *B*, and one refused + `availability_not_within_schedule` or `object_not_scheduled` may hold; +- a plan under *B* (§7) listens to every pass a plan under *A* listens to from the same instant + with the same holding, and is complete at the same instant wherever that plan is. + +What does not extend an earlier schedule, and contradicts it, is §6.2 step 4's: a schedule that +drops an object, or withdraws, moves or changes a pass. ## 5. Blocks and symbols @@ -252,15 +292,20 @@ The loss bound and overhead are checked first: *L* above 999,999 is `loss_bound_ transmission claim by bearer-receipts §4.3 and a schedule by §4.3 here. A claim of another class is `context_mismatch` at step 6. A claim refused at any step takes no further part. 3. **The declarations**: bearer-receipts §6.2 step 4. -4. **The schedules**: the accepted schedule claims by `bearer_id`. Two with one `bearer_id` and - different bodies set aside every schedule of that instance (`schedule_contradicted`): a - publisher that changes its plan for one transmission has stated neither, and a relying - party holds no promise that can change under it. Two with the same body are one. A schedule - is then set aside at the first of these that holds: step 3 set aside the declarations of its - `bearer_id` (`bearer_contradicted`); no declaration has its `bearer_id` +4. **The schedules**: the accepted schedule claims by `bearer_id`, each instance's in the order + of their signer's chain (§6.1), which §4.3 step 2 makes one chain. When one of them does not + extend the one before it (§4.5), every schedule of that instance is set aside + (`schedule_contradicted`): a publisher that drops an object from its plan for one + transmission, or withdraws, moves or changes a pass, has stated neither plan, and a relying + party holds no promise that can change under it. Otherwise the last of them is the instance's + schedule, and each before it with another body is **extended**: its passes are the first of + the last one's, and it takes no further part. Two with the same body are one. The instance's + schedules are then set aside at the first of these that holds: step 3 set aside the + declarations of its `bearer_id` (`bearer_contradicted`); no declaration has its `bearer_id` (`bearer_not_declared`); its declaration's `bearer` is `bidirectional` (`schedule_on_bidirectional`), since a receiver with a path back asks for what it lacks and - is not served by a plan. Otherwise it **stands**. + is not served by a plan. Otherwise the instance's schedule **stands**, and so does each before + it with its body. 5. **Availability**, for each entry of each standing schedule, by §6.3. ### 6.3 Availability @@ -329,7 +374,8 @@ of their durations: the time the receiver's radio must be on. Outside those pass off. Under `repeat` and `no-code` at most one pass adds anything certain within *L*, since after it a block lacks only symbols the receiver may miss again: a receiver that one pass does not complete is not certain to be held after any number, and keeps listening, if it does, on its own -judgement of its channel. +judgement of its channel. A receiver that acquires a schedule extending the one it plans with plans +with the later from then on: what it holds still counts, since each pass sends what it did (§4.5). ## 8. Mappings @@ -342,6 +388,63 @@ both compares them; a difference is the bearer's, and the sink reports it rather one. The bearer's own repetition (its carousel of descriptions and files) is the schedule's passes: a pass is one transmission of the object's symbols, whatever the bearer calls it. +### 8.1 In-band repetition + +A receipt held only off the bearer reaches only a receiver that had another path to it, and a +receiver on a bearer with no return path cannot ask. On an instance whose schedule stands, the +publisher **MUST** send its **in-band set** on the instance itself, each part as bearer-receipts +§9.1 carries it: + +- the group receipt; +- its claims from the head of their chain (`seq` 0, `parent_receipt_hash` `null`) to the + instance's last schedule, in the order of the chain, among them the instance's declaration and + every schedule of it. A receiver that holds no claim of the signer then accepts each at + jwp-receipts §3.1 step 5, which refuses a claim whose parent it does not hold + (`parent_not_held`), a parent that on this bearer it cannot fetch; +- the head revision of the key log of the origin the schedule's `signer_id` names. It anchors + nothing (bearer-receipts §8.2): it carries a rotation or a revocation to a receiver that has the + origin anchored. + +A chain holds every claim its key has signed, so a publisher **SHOULD** sign the groups it schedules +with a key that signs little else, which its origin lists with `delivery`, `transmission` and +`schedule` (jwp-receipts §7). A claim of the chain about another group is refused at step 6 against +this group and breaks nothing: it is held, so the claims after it chain to it (jwp-receipts §3.1 +step 5). + +**How often.** A schedule's **interval** is the least `period_ms` of its entries of two passes or +more, or, where every entry has one pass, the least `duration_ms`. From the start of the schedule's +first pass to the end of its last, the publisher sends the whole set at least once in every span of +that length. A receiver that joins in that time, and misses nothing of the set, holds it no later +than one interval after it joins. The set's files are outside every entry: their octets are not in +`bytes_sent`, and the loss bound of §2 says nothing of them. A receiver that misses a copy takes the +next. + +**An extension.** A later schedule (§4.5) is in the set from when it is signed, chained after the +one it extends. A receiver that held the earlier and acquires the later reads one schedule that +stands, and one that joins afterwards reads both in the chain. + +### 8.2 What a receiver acquired + +A receiver that joined an instance, or a verifier given what it acquired, **MAY** check that it +suffices. The inputs are the instance's `bearer_id`, the group receipt, the claims in the order of +their chain, and the key logs acquired, each keyed by the origin it names. §6.2 steps 1 to 4 run over +the group receipt and the claims alone, with no object held and no claim held before the first; a +group that fails is refused with its reason, and nothing is derived. Then, at the first of these +that fails, the set is refused: + +1. no claim of it is refused at jwp-receipts §3.1 step 5 (`inband_chain_incomplete`), so it holds + each signer's chain from its head; +2. a schedule of the instance stands (`inband_not_scheduled`); +3. a key log acquired is held for the origin that schedule's `signer_id` names, under jwp-receipts + §7.2 rules 1 to 3, and lists the schedule's key (`inband_key_log_missing`). A `signer_id` that + names no origin has no log to carry, and is refused here. + +Otherwise the set **suffices**, and a verifier reports each claim's label and the interval of the +schedule that stands as `inband_ms`. A set that suffices holds what a receiver needs to plan (§7) and +to confirm. Confirming is bearer-receipts §8.3's, under anchors the receiver already holds, so a log +that lists the key as revoked still suffices here, and confirmation reports it. It does not say the +publisher sent the set as §8.1 asks. + ## 9. Reasons The codes this extension adds, each with where it is raised: @@ -367,6 +470,9 @@ The codes this extension adds, each with where it is raised: | `object_not_scheduled` | §6.4 | | `availability_not_within_schedule` | §6.4 | | `availability_after_deadline` | §6.4 | +| `inband_chain_incomplete` | §8.2 check 1 | +| `inband_not_scheduled` | §8.2 check 2 | +| `inband_key_log_missing` | §8.2 check 3 | A schedule also raises `bearer_contradicted` and `bearer_not_declared` (bearer-receipts §10) at §6.2 step 4; a group or object the codes of jwp-receipts §3.3; and a claim every code of @@ -386,6 +492,18 @@ fixed seeds by `wai_carousel_vectors gen` as `vectors.json`. It has: and not scheduled. - **Plans**: a receiver tuning in before the first pass, during one, between passes, holding part of an object, holding all of it, and one under `repeat` that one pass does not complete. +- **Extensions** (§4.5): passes added until an object not within the schedule is held; an object + added, and the later schedule repeated; one pass, its period not read, given a period; `repeat`, + to which more passes add nothing certain; and each thing that does not extend: a pass withdrawn, + the first pass, the period, the duration, the repair, the ESIs or the code changed, an object + dropped, and a schedule that extends the first and withdraws a pass of the second. A plan under an + extended entry, and a chain on an instance no declaration names. +- **In-band sets** (§8.2): a set that suffices, with the interval of a repeated schedule, of one of + single passes and of a mix of the two; with an extension; with a chain that holds a claim about + another group, without its head and out of order; with no schedule, no declaration, a schedule of + another instance and a contradicted one; a key log absent, of another origin, naming another + origin, with a broken signature, unreadable, not listing the key and revoking it; and a group that + fails. - **Negative controls**, one for each reason of §9 that a claim or a verdict raises, and the bounds of §5.1, §5.2 and §5.4 on both sides. @@ -400,9 +518,10 @@ first ⌊*L* · *m* / 1,000,000⌋ symbols of each block (in the first pass, sou decoder must decode), and requires the object back from what is left by that pass's end. `live-conformance/carousel_verify.py` is the second implementation, written from this text: it shares no code with `wai-rs`; it verifies groups and objects with the JWP corpus's second -implementation (`jwp-conformance/jwp_verify.py`), and claims through steps 1–5 with the claim +implementation (`jwp-conformance/jwp_verify.py`), claims through steps 1–5 with the claim corpus's (`claim-conformance/claim_verify.py`), whose step 4 holds §4.2 with §5.1, §5.2 and -§5.4; it reads Appendix A and §9 from this text, writes §4.3, §5.3, §6 and §7 itself, mutates +§5.4, and key logs with the signer corpus's (`signer-conformance/signer_verify.py`); it reads +Appendix A and §9 from this text, writes §4.3, §4.5, §5.3, §6, §7 and §8.2 itself, mutates copies of the corpus and requires every copy to fail, and drops each of its own checks in turn and requires the corpus to catch the weakened verifier. @@ -457,6 +576,12 @@ Therefore: a declaration attests transmission and no more, and a relying party that needs to know what receivers held counts reconciliations (bearer-receipts §6). A schedule that promises more than was sent is a false statement signed by the group's key, and is evidence of it. +- **An extension is the publisher's word too.** It adds to what the publisher said it would send, + and is evidence as the schedule it extends is. It changes no statement that held (§4.5), and a + later schedule that would is set aside with the rest of its instance's (§6.2 step 4). +- **What rides on the bearer is verified as anything is.** Whoever controls the bearer can withhold + the in-band set, and a receiver that does not acquire it holds nothing to plan with; it cannot + alter a signed claim, and a key log it carries anchors nothing (bearer-receipts §8.2). - **A loss bound is the relying party's.** Every statement holds for every pattern of loss within it (§2). A channel that exceeds it, in a fade or under interference, voids nothing in the schedule and nothing here predicts how often that happens. @@ -466,7 +591,8 @@ Therefore: the source learns nothing of its receivers (unidirectional-delivery §2) is kept. - **Bounded work.** An entry's arithmetic is a few products per source block, and an object has at most 255 RaptorQ blocks of two sizes or Compact No-Code blocks of two sizes; a schedule's - cost is linear in its entries, whatever the passes' count. + cost is linear in its entries, whatever the passes' count, and so is comparing it with the one + before it (§4.5). ## Appendix A. The values of K′ diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index 43ed16ebb..49182d497 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -418,7 +418,7 @@ key. | `consumption` | `claim` | `object` (the first object it names) | §2.4.13 | the agent that consumed the objects: its key, named by its `did:key` | | `transmission` | `claim` | `receipt` (the group transmitted) | §2.4.14 | the group's publisher: the key that signed the group | | `reconciliation` | `claim` | `receipt` (the group reconciled) | §2.4.15 | the sink that received the objects, never the publisher | -| `schedule` | `claim` | `receipt` (the group scheduled) | §2.4.16 | the group's publisher: the key that signed the group | +| `schedule` | `claim` | `receipt` (the group scheduled) | §2.4.16 | the group's publisher: the key that signed the group; or a node, of an instance of its own ([cache-authority](cache-authority.md) §5.6) | | `timeliness` | `claim` | `receipt` (the group whose objects it times) | §2.4.17 | the group's publisher: the key that signed the group | | `cache-transmission` | `claim` | `receipt` (the group sent again) | §2.4.18 | a node that sent the objects from what it held, never the group's publisher | @@ -1384,7 +1384,9 @@ unchanged. [carousel](carousel.md) defines it: its body's members are §4.1 ther (`bearer_id`, `objects` and `attests`), read at §3.1 step 2; its class rules are §4.2 there, with §5's bounds on each code's parameters, at step 4; and its context is §4.3 there, at step 6: the group receipt, whose link hash is its `subject` and whose key signs it, and the object receipts -and envelopes at the positions it names. +and envelopes at the positions it names. A node that declares an instance of its own states its +plan for it in the same class, signed by its own key: [cache-authority](cache-authority.md) §5.6 +replaces the check that the group's key signs it, in the verdict that holds that instance. #### 2.4.17. `class: "timeliness"` @@ -3777,8 +3779,10 @@ its keys is that party is the origin's decision, and its log records it: class, and the declaration stands without it. A sink with no return path confirms under anchors provisioned before it was cut off, and a key log that reaches it over the bearer anchors nothing ([bearer-receipts](bearer-receipts.md) §8). `schedule` lets a key state the - passes of a group it signed over an instance (§2.4.16); an origin gives it to its publishing - keys, as it gives `transmission`, and it is neither pinned-only nor `delivery`. `timeliness` + passes of a group it signed over an instance (§2.4.16), or of a group another key signed over + an instance it declares as its own ([cache-authority](cache-authority.md) §5.6); an origin gives + it to its publishing keys, as it gives `transmission`, a node's operator to the nodes that + schedule their instances, and it is neither pinned-only nor `delivery`. `timeliness` lets a key state when the objects of a group it signed are of use (§2.4.17); an origin gives it to its publishing keys, as it gives `schedule`, and it is neither pinned-only nor `delivery`. diff --git a/wai/extensions/timeliness.md b/wai/extensions/timeliness.md index 661b593d8..81d19037b 100644 --- a/wai/extensions/timeliness.md +++ b/wai/extensions/timeliness.md @@ -464,6 +464,11 @@ wanted objects; a group that fails refuses the run as it refuses a plan. The fir force** from its *t*, and each later one **replaces** the one before it at its own *t*, wholly: an object only an earlier plan wants is no longer run. +A run does not date its claims: every plan of it reads them all, and so reads the last schedule of an +instance (carousel §4.5), though that plan's *t* be before the schedule was signed. A sink that +acquires a later schedule during a run decided its earlier plans without it, and the run that +reproduces those decisions is the one given the claims it held then. + #### 7.5.2 State For each object, a group's link hash and a position, the run keeps whether it is **settled** @@ -703,13 +708,16 @@ fixed seeds by `wai_timeliness_vectors gen` as `vectors.json`. It has: refused on value, chosen at a value equal to the late primary's, from the first source in the asker's order before an earlier one, and arriving at the deadline, late sources chosen by value and order, an arrival only after the end, no source on a path with no return, the origin alone, a - schedule with no declaration and one on a two-way instance, every pass heard from the first, the + schedule with no declaration, one on a two-way instance, one a later schedule extends and one a + later schedule withdraws a pass of, every pass heard from the first, the publisher's check from `from_ms` passing and failing, an object with no deadline, an instant at and past the last instant, and each rule of §7.1. With a ladder: the first rung, both rungs in time, a lower rung when the first is late, no rung when the late primary is worth more, the first rung over a late primary worth less, a lower rung refused on value, the first source in - order, the primary on time over rungs, and no rung in time. -- **Runs** (§7.5): on time on the plan's own trace, over the origin and over a bearer; held at the + order, the primary on time over rungs, no rung in time, and a rung read over a schedule a later one + extends, over the same two withdrawing a pass, and over the earlier alone. +- **Runs** (§7.5): on time on the plan's own trace, over the origin and over a bearer; a rung over a + schedule a later one extends; held at the deadline and a millisecond after; a late object, presented at its value then; a hard deadline missed; every rung passed, with the primary later and with none; a rung chosen and presented, a lower rung held in its place, both rungs held, a rung at the deadline and a millisecond after diff --git a/wai/live-conformance/cache-authority/README.md b/wai/live-conformance/cache-authority/README.md index 9e2adb422..29e77c957 100644 --- a/wai/live-conformance/cache-authority/README.md +++ b/wai/live-conformance/cache-authority/README.md @@ -15,17 +15,20 @@ leaves), `GX` (a `group_start` that is not a date-time) and `GF` (four, its obje from its object 1). `heads` holds the two test logs' head revisions, of `https://operator.example` and `https://other.example`; `C2` is in neither. -- `claims` (§5) are each a `claim`, the signer's `earlier` claims in chain order, the `context` +- `claims` (§5, a cache-transmission claim or a schedule) are each a `claim`, the signer's `earlier` claims in chain order, the `context` it is checked against (a group receipt, another receipt, or `null`) and the `objects` held under it; `outcome` is `accept`, `unchecked` (no group: it stops at step 5) or `reject step=N reason=…`. - `placements` (§4.4) are each a `key`, an instant `at_ms` and the `heads` named, keyed by origin; `outcome` is the placement as §4.4 writes it. - `verdicts` (§7) are each the `group`, the `objects` (receipt, and envelope or `null`), the - `claims`, a `sink`'s own instance, a statement offered (`assertion`), `count_only` and the - `heads`; `outcome` gives each object's and each claim's label, the status, `sinks`, `whole`, - `received_by`, the publisher's `bearers` and the `caches` that stand, the sink's outcome and the - statement's (`holds` or `reject reason=…`), or `refuse reason=…` for a group that fails. + `claims`, a `sink`'s own instance, a statement offered (`assertion`), `count_only`, the + `heads`, and `held`: `null`, or carousel §6.4's statement with its bound and overhead, + `{"kind": "object", "bearer_id", "index", "by_ms", "loss_ppm", "overhead"}` or the same of + `"kind": "group"` with no `index`; `outcome` gives each object's and each claim's label, the + status, `sinks`, `whole`, `received_by`, the publisher's `bearers` and the `caches` that stand, the + sink's outcome, and each statement's (`holds` or `reject reason=…`), or `refuse reason=…` for a + group that fails. - `tallies` (§8) are a verdict's inputs, the `acknowledgements` (each a record and its item lists, in hexadecimal), the holdings `records`, the object's `index`, a `deadline_ms` or a timeliness `deadline_claim`, the `region`, the `population` and `miss_target_ppm`; `outcome` is `met` or diff --git a/wai/live-conformance/cache-authority/vectors.json b/wai/live-conformance/cache-authority/vectors.json index c8c72cdfb..41bcd17f5 100644 --- a/wai/live-conformance/cache-authority/vectors.json +++ b/wai/live-conformance/cache-authority/vectors.json @@ -1,5 +1,5 @@ { - "about": "Conformance corpus of extensions/cache-authority.md (wai.delivery.cache): the cache-transmission claim (jwp-receipts §2.4.18) through jwp-receipts §3.1 steps 1 to 6, placing a server key by the heads named (§4.4), the bearer verdict with a cache's instances beside the publisher's (§7), the count of a stated population that held an object by a deadline (§8), and timeliness lines from acknowledgements and reconciliations (§9). Every key is Ed25519 from a published seed of one byte repeated 32 times and attests nothing, and both key logs are test logs; envelopes carry opaque test payloads no case decodes; bearer instances and origins use reserved example domains, and regions ISO 3166-1's user-assigned codes. Each case states the outcome it was written to have, declared in the generator. Regenerate with `wai_cache_authority_vectors gen`.", + "about": "Conformance corpus of extensions/cache-authority.md (wai.delivery.cache): the cache-transmission claim (jwp-receipts §2.4.18) and a node's schedule of its own instance (§5.6) through jwp-receipts §3.1 steps 1 to 6, placing a server key by the heads named (§4.4), the bearer verdict with a cache's instances beside the publisher's (§7), the count of a stated population that held an object by a deadline (§8), and timeliness lines from acknowledgements and reconciliations (§9). Every key is Ed25519 from a published seed of one byte repeated 32 times and attests nothing, and both key logs are test logs; envelopes carry opaque test payloads no case decodes; bearer instances and origins use reserved example domains, and regions ISO 3166-1's user-assigned codes. Each case states the outcome it was written to have, declared in the generator. Regenerate with `wai_cache_authority_vectors gen`.", "keys": { "P": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", "C1": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", @@ -2464,6 +2464,736 @@ "context": null, "objects": [], "outcome": "unchecked" + }, + { + "name": "schedule_by_node", + "description": "C1 schedules objects 1 and 3 of G on its instance: its key is not the group's, and carousel §4.3 otherwise holds.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0ded225b1116dfcc1e8a96a85ba808a7ea333c774a8d379319d11a056b2f086770a007f71cacecbb84e4f6929eb54ac783901ddd1de432046fa4424b79b57706\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "accept" + }, + { + "name": "schedule_chained_after_its_claim", + "description": "The same schedule, chained after C1's cache-transmission claim.", + "earlier": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "accept" + }, + { + "name": "schedule_by_publisher", + "description": "P's schedule of G is checked by carousel §4.3 whole.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/sat\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"be029effb91604455dbef09817b4824656466e9f023415a3ae68e0617e6e6ab4b35806f84bce887c78a23e2a3d6bf15c3ddc189d13e4429d3ec0890750874c08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "accept" + }, + { + "name": "schedule_node_other_group", + "description": "C1's schedule names G9.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"1197877a948ab791a6d7b5083475f3e0b07a69e6b125b3658c349be274820f1d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"73f4f3e0a31246fb1ba7bec1843e5fb21cdabcbc34e9893a18ab7746e09e99bb\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fa36166294a3b6ad9400f5a5893cce98a42a456fc19ef0f912829c61b79ddb5a33592954f193ce695fe7eaa8aee7cf882686730a74a299fb3a68033cc3522402\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"20e9ad452eafb1db6a167c09e116a381ba58e7c0fb2093bccdf804df768940f4\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "reject step=6 reason=schedule_subject_mismatch" + }, + { + "name": "schedule_node_leaf_out_of_range", + "description": "An entry for object 4 of a group of four.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":4,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fb6a31b9bbf06ded398b117040bef6e1510ccde33e341002f37f84560b235ef6ead7e3abd296b67cc0464088d18faf28e22978dff8bf03a7e5207e98d1d65509\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "reject step=6 reason=schedule_leaf_out_of_range" + }, + { + "name": "schedule_node_before_group", + "description": "A first pass a second before the group starts.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793699999000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6d3a3215ac382bb47a846af292e9cda00b4f933d80fd5e495ac9a18d1a45a8b3681f7da77a0046ef2cf56107de3677b92833d6154db8b03915e54288bac47a01\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "reject step=6 reason=schedule_before_group" + }, + { + "name": "schedule_node_content", + "description": "An entry for object 1 with object 2's content hash, its receipt held.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0dcea220ce7562e3cc7786a4f61b6a8646fc2bbb1480cf4ff03468e2aad9d7db75616a8279248c6b11bfcae86cd30a5813c11a23949fb77fe2e43219d2df7a0c\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "reject step=6 reason=schedule_content_mismatch" + }, + { + "name": "schedule_node_no_passes", + "description": "An entry of no passes: carousel §4.2 rule 3.3 holds for a node's schedule too.", + "earlier": [], + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":0,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f15fbd9bb6542aaf49ebc6cb52d8e2cfc3b2f827f11b401bb4e5e9cf06bbe5988ac90cc186175bc9c86e9efedad8e49ae84f4c8a217262a86a6c4c34babd1309\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "context": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + } + ], + "outcome": "reject step=4 reason=schedule_passes_invalid" } ], "placements": [ @@ -2727,6 +3457,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -2786,7 +3517,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -2901,6 +3633,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -2958,7 +3691,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -3073,6 +3807,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -3130,7 +3865,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -3242,6 +3978,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -3288,7 +4025,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -3402,6 +4140,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -3448,7 +4187,8 @@ } ], "sink": null, - "assertion": "reject reason=bearer_not_declared" + "assertion": "reject reason=bearer_not_declared", + "held": null } }, { @@ -3562,6 +4302,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -3594,7 +4335,8 @@ ], "caches": [], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -3708,6 +4450,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -3732,7 +4475,8 @@ "bearers": [], "caches": [], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -3846,6 +4590,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -3870,7 +4615,8 @@ "bearers": [], "caches": [], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -3983,6 +4729,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4030,7 +4777,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -4143,6 +4891,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4166,7 +4915,8 @@ "bearers": [], "caches": [], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -4279,6 +5029,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4326,7 +5077,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -4439,6 +5191,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4486,7 +5239,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -4599,6 +5353,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4646,7 +5401,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -4760,6 +5516,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4808,7 +5565,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -4924,6 +5682,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -4972,7 +5731,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -5087,6 +5847,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -5167,7 +5928,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -5280,6 +6042,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -5322,7 +6085,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -5435,6 +6199,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"07561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -5482,7 +6247,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -5597,6 +6363,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -5643,7 +6410,8 @@ } ], "sink": "cache-declared", - "assertion": null + "assertion": null, + "held": null } }, { @@ -5755,6 +6523,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -5804,7 +6573,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -5919,6 +6689,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -5971,7 +6742,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -6084,6 +6856,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -6131,7 +6904,8 @@ } ], "sink": null, - "assertion": null + "assertion": null, + "held": null } }, { @@ -6243,6 +7017,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": { "objects": [ "inclusion-verified", @@ -6265,7 +7040,2959 @@ "bearers": [], "caches": [], "sink": null, - "assertion": null + "assertion": null, + "held": null + } + }, + { + "name": "node_schedule_stands", + "description": "C1 declares mesh-c1 and schedules objects 1 and 3 on it: its schedule stands, and at 30% object 1 is held at the end of the second pass.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703611000, + "loss_ppm": 300000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "holds" + } + }, + { + "name": "node_schedule_after_deadline", + "description": "The same statement a millisecond before that pass ends.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703610999, + "loss_ppm": 300000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=availability_after_deadline" + } + }, + { + "name": "node_schedule_not_within", + "description": "At 90% object 1 needs seven passes and the schedule has three.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703621000, + "loss_ppm": 900000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=availability_not_within_schedule" + } + }, + { + "name": "node_schedule_loss_bound_invalid", + "description": "A statement at a loss bound of a million: the statement is refused, and nothing else changes.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703621000, + "loss_ppm": 1000000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=loss_bound_invalid" + } + }, + { + "name": "node_schedule_overhead_invalid", + "description": "A statement at an overhead of 3.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703621000, + "loss_ppm": 0, + "overhead": 3 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=overhead_invalid" + } + }, + { + "name": "node_schedule_object_not_scheduled", + "description": "Object 0, which C1's schedule has no entry for.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 0, + "by_ms": 1793703621000, + "loss_ppm": 0, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=object_not_scheduled" + } + }, + { + "name": "node_schedule_before_its_claim", + "description": "A plan signed before the sending it plans, its cache-transmission claim after: one instance, and the schedule stands.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0ded225b1116dfcc1e8a96a85ba808a7ea333c774a8d379319d11a056b2f086770a007f71cacecbb84e4f6929eb54ac783901ddd1de432046fa4424b79b57706\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"228e72a440377abb86aeb795d2fa4525c9f38f593c2e27922f83cacc369706a3\",\"seq\":1,\"sig\":\"57048b2dad0297121add9d93a34cc0695715fbd1114fb7d2652282722dfb957b89719aa58eb9104b9c554b80c9efee44b36fb05f9608bc9e6411af5eb1484101\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 3, + "by_ms": 1793703601000, + "loss_ppm": 0, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "stands", + "cache-declared" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "holds" + } + }, + { + "name": "node_schedule_group", + "description": "Every object sent and scheduled: the group is held at the end of the second pass at 30%.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"f0\",\"sent_root\":\"e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b50b5e5ff12642e81f58165d45c55efac59bc56dd2569fc2b218aadc6842410b10e07238509c5e1cda6756eaf8f6476c9919e78a9838fb2586d59cf867d87e05\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"c6e1c5bca62ad3bdffb65833fb11c9838259be42556400d1537548059f9ed04d\",\"seq\":1,\"sig\":\"9a59b2e387a7cd85c31c38a9d1110d75fe9afc74612551a469737d5883441556ac127b3106d1b07c0671ea59bd559d07ef7ff9c7e7ce5a1c995d64c9d0cce202\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "group", + "bearer_id": "https://bearer.example/mesh-c1", + "by_ms": 1793703611000, + "loss_ppm": 300000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 0, + 1, + 2, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 0, + 0 + ], + [ + 1, + 0 + ], + [ + 2, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "holds" + } + }, + { + "name": "node_schedule_extended", + "description": "C1 adds passes: at 90% object 1 is held at the seventh's end, and the earlier schedule is extended (carousel §4.5).", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":7,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":7,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"18479163eb38bd33d295e707e0713a9a2ca1ad29380594736869d73b201a9862\",\"seq\":2,\"sig\":\"89a8479c8f86d081c912baf2130a6ee1ff6cee2d6de49c5e0ee27f400e172e96f6aead64b696d65524e26ae42fd8b0a8d64f38b9a5aeed8e340601c6d1c44804\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703661000, + "loss_ppm": 900000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "extended", + "stands" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "holds" + } + }, + { + "name": "node_schedule_contradicted", + "description": "C1 withdraws a pass: both schedules set aside, its instance stands, and no schedule is there to hold a statement.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"18479163eb38bd33d295e707e0713a9a2ca1ad29380594736869d73b201a9862\",\"seq\":2,\"sig\":\"4071db1e5771420000cccb71d9c5b6df11d44451aef62a3da5ab9271d2599d144af54fc0da8005ec775aabc42f5bf89f23716b63cdaf4e72af140abcbdb6b609\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703611000, + "loss_ppm": 0, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=object_not_scheduled" + } + }, + { + "name": "node_schedule_other_signer", + "description": "C2 schedules C1's instance: set aside, and no schedule stands there.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f990c1732bc1c32cc0ec80e0484bf4f5b7fc1b6cc4655e17b9f7e7b025c9aba61bdec9ca768c60359f07286c0b536ef666c2ca46d4d22b292c55bce78155b901\",\"signer_id\":\"did:key:z6MkqGC3nWZhYieEVTVDKW5v588CiGfsDSmRVG9ZwwWTvLSK\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703611000, + "loss_ppm": 0, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "set-aside reason=cache_schedule_signer_mismatch" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "reject reason=object_not_scheduled" + } + }, + { + "name": "node_schedule_stranger_contradicts_nothing", + "description": "C2's schedule of C1's instance, with fewer passes, beside C1's: set aside alone, and C1's stands.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"fabb0b9058f856aeec3949a927dd3c518151c42a81d55ced70a7a55a44ebc599cdd0fbe624161dbf0b330d773324161fb895f68d89bc53650e94c462b5381904\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e1999b176935c22f838543b32046948c8472174f7e4179eda35babe32e1fa27c0f143f49c7576aed5a093c61c722ef32e49176980442aa5e283c383999927f0a\",\"signer_id\":\"did:key:z6MkqGC3nWZhYieEVTVDKW5v588CiGfsDSmRVG9ZwwWTvLSK\",\"signer_pubkey\":\"a09aa5f47a6759802ff955f8dc2d2a14a5c99d23be97f864127ff9383455a4f0\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703601000, + "loss_ppm": 0, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands", + "set-aside reason=cache_schedule_signer_mismatch" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": "holds" + } + }, + { + "name": "node_schedule_on_publisher_instance", + "description": "C1 schedules sat, P's instance: set aside, as a cache-transmission claim of it would be, and P's declaration stands.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"https://bearer.example/sat\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T10:00:30Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"360d66b0e432505a085fd89d0a91113d2e551ec5b26a579d211a43af11380a2df22bf278a73c6d586c869ba65cc321fe3ba0839d6964da6e1fadffe8c5342c04\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/sat\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"45003356baa8efb453a34a4494e10a85d311f4ab0e466f11b882a3ede338a63de4ec3ad47d24a46fc1bac1225b079a5270cb9757f5b76e77058c7074b71dc302\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": null, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=bearer_contradicted" + ], + "status": "transmitted", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [ + { + "bearer_id": "https://bearer.example/sat", + "bearer": "unidirectional", + "sinks": 0, + "energy": null, + "per_receiver_upper_bound": null + } + ], + "caches": [], + "sink": null, + "assertion": null, + "held": null + } + }, + { + "name": "node_schedule_on_contradicted_instance", + "description": "C1's account of mesh-c1 contradicts itself: its schedule of it is set aside with its claims.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"40\",\"sent_root\":\"f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8260314c08c7f7a2d1d617f66c8950407d7a49b08f144505fcd14f918a7ef569672013ddc384825a3443c36e859dad45256e18a9284ec8978a359ea219700a0d\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"c2f39a782a1c202f109d8b4f8dceecd2d2a1e0b0f8573f39459841293f256fde\",\"seq\":1,\"sig\":\"06e44a9aad0dddc479111d6cda5d527ee56b0a9274aaadb6b061e99f0f93201d4dffec576e7eb6cdd5309d3b91f4e9f3868f4d3623d06303b6912d0bd4d1ef0f\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"917f83aef7a169a7772ca79dd57483acafab3b82a8ad1140cd5cf6f7669ad5f3\",\"seq\":2,\"sig\":\"512cb3c8884d3cdf3ecf300582710b012002a01978acdb1b9b133416419c36495efe90dfd2410bd69c46d8098e698ae35ae6b268fe349c8456c8049935383e05\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": null, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "set-aside reason=bearer_contradicted", + "set-aside reason=bearer_contradicted", + "set-aside reason=bearer_contradicted" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [], + "sink": null, + "assertion": null, + "held": null + } + }, + { + "name": "node_schedule_not_declared", + "description": "C1 schedules an instance it has not declared: set aside.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0ded225b1116dfcc1e8a96a85ba808a7ea333c774a8d379319d11a056b2f086770a007f71cacecbb84e4f6929eb54ac783901ddd1de432046fa4424b79b57706\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/mesh-c1", + "index": 1, + "by_ms": 1793703611000, + "loss_ppm": 0, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "set-aside reason=bearer_not_declared" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [], + "sink": null, + "assertion": null, + "held": "reject reason=object_not_scheduled" + } + }, + { + "name": "node_schedule_credits_nothing", + "description": "C1 schedules every object and says it sent 1 and 3: its instance is credited for those, whatever it scheduled.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"17d748e9d8a70aedb5255e96820ab199400901ce044161288e27a3bb2f0efca6\",\"seq\":1,\"sig\":\"55bda6542dd45fcc079b8b59d4dbf26112903a414fb0e559d15fc4e0ed45f5526dcc782c07b90b030c14d345ff517bc5585728d25dd34e72ee3a7edc6840ba0f\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"received\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"leaf_count\":4,\"received\":\"40\",\"received_root\":\"f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410\"},\"class\":\"reconciliation\",\"issued_at\":\"2026-11-03T11:30:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"099ecb7c231f4fb6cc3ef03f7f3964b24ddf4cdf498ffa7d8b42928fa5f15f824d88c477b6b29ae452e0e9f8964b88cc0438edf4014c8b6bacae5e2c9b36ec02\",\"signer_id\":\"did:key:z6MkjJRuJtMxfTErK55eWeV7FQLLxpsvzSUQ3AC6DmdNPFja\",\"signer_pubkey\":\"48075a597e721a156e2e0799de5cc0c5324dc6e7eaf1cdd46250868ec53215dd\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": null, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "stands", + "counted" + ], + "status": "reconciled", + "sinks": 1, + "whole": 0, + "received_by": [ + 0, + 1, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 1, + "received_by": [ + [ + 1, + 1 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": null + } + }, + { + "name": "publisher_schedule_stands", + "description": "P's schedule of sat stands by carousel §6.2 step 4, and the statement is held to it as to a node's.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"https://bearer.example/sat\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T10:00:30Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"360d66b0e432505a085fd89d0a91113d2e551ec5b26a579d211a43af11380a2df22bf278a73c6d586c869ba65cc321fe3ba0839d6964da6e1fadffe8c5342c04\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/sat\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"98ee50cbfc167271c63b819036bde11c7d586242039c27919cbc3ccfc3006004\",\"seq\":1,\"sig\":\"d94c8a33309d112eb60b9ffca4b9d8f48fdb816cb70f2ab0117c4b534d3b13f8b16993fd61e1e4b2ed5f22d7ab1a48ff841410a09b389cd0ed448b694f466f0c\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": { + "kind": "object", + "bearer_id": "https://bearer.example/sat", + "index": 1, + "by_ms": 1793703611000, + "loss_ppm": 300000, + "overhead": 2 + }, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "stands" + ], + "status": "transmitted", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [ + { + "bearer_id": "https://bearer.example/sat", + "bearer": "unidirectional", + "sinks": 0, + "energy": null, + "per_receiver_upper_bound": null + } + ], + "caches": [], + "sink": null, + "assertion": null, + "held": "holds" + } + }, + { + "name": "publisher_schedule_on_cache_instance", + "description": "P schedules C1's instance, which P has not declared: set aside, and C1's instance stands.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "e3db0ca41e53b12c8995b8ffa8fed2f6fb580999526d640a34cdebf5ac58deda", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "774690cb96fd4d27623a9b41772692cdcfbeb256b5880d718d33583d54806c7419873a1ec5120301c7df78eacabef473049bd919d29df3c0e2df5ddfc6c8e304", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "982fbf44c4243a2083ae9fa3c0a6334840be516ae8f73e0a59c4b647b4136288", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "f79c55b86a06c3dc8852c36cb730ed9794cd8961b5dbd7fe76fbc1eb049e5410", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "7a3fd2a50c4b5e40f836b9e01c9eef92dfea4d6191002fc2c807528f413e99d6", + "882a8d50f16c0caea26c61094097a24df9c01b584c5c76755ddda9b68c44d133" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "ec70245c54d48c5860bca85984b8e48868a83493623ebfaf569c778b94fc59d1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ed4fb79b72a19c52ec4991e9513b94b401d135e2c7f0cd9162b70dbaa26f24b5", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "587563c2a1c90c049033854701300050861feacf26c5f237d1f9af6e00611d98", + "d9715c5030bcb395cc839c321ef311230dce7643c0bf32c0cae5c5a0697ad9f1" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"multicast\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"energy\":null,\"leaf_count\":4,\"sent\":\"50\",\"sent_root\":\"bd8f0d5236c701c0569c9590e7f4b3e39412b177ec5aa2c64a793d2bb88dbba0\"},\"class\":\"cache-transmission\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"704faac5d091fad19619db816eb483c26d2f25fb49fa1b30aada79e24a039372d51e1b717c5572e48ce3dc60ed051dcab32c95a08039a075aaaacf5edfd4b10a\",\"signer_id\":\"did:web:operator.example#c1\",\"signer_pubkey\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"https://bearer.example/mesh-c1\",\"objects\":[{\"content_hash\":\"be608c9d8ee3565ad6746ef2bf5d5962ab21fb6e81d086627249c991a03e3f6d\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8},{\"content_hash\":\"f3c3ab5642e10d3329c3d0d09ec4bd5765885110725c5728a3fcb86afc1a86a1\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793703600000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":2000},\"period_ms\":10000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T11:00:05Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d28d8ff1e75344b6edc747dc15c7f078d2436256ee409b02ec144695c1438102956f0dca50bf3220d7b10a9681ed2ef009c5805fea725865f1d9a0b038aad20e\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8d6790600419c990abb9e277ef9da2a002ce0fdb4f9be9d4907a99a20aa61fa0\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "held": null, + "outcome": { + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "cache-declared", + "set-aside reason=bearer_not_declared" + ], + "status": "published", + "sinks": 0, + "whole": 0, + "received_by": [ + 0, + 0, + 0, + 0 + ], + "bearers": [], + "caches": [ + { + "bearer_id": "https://bearer.example/mesh-c1", + "bearer": "multicast", + "server": "884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b", + "placement": "confirmed origin=https://operator.example key_id=c1 role=cache/serve", + "sent": [ + 1, + 3 + ], + "sinks": 0, + "received_by": [ + [ + 1, + 0 + ], + [ + 3, + 0 + ] + ], + "energy": null, + "per_receiver_upper_bound": null + } + ], + "sink": null, + "assertion": null, + "held": null } }, { @@ -6377,6 +10104,7 @@ "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" }, + "held": null, "outcome": "refuse reason=signature_verify_failed" } ], diff --git a/wai/live-conformance/cache_authority_verify.py b/wai/live-conformance/cache_authority_verify.py index d2f28d2a0..4f8bd913c 100644 --- a/wai/live-conformance/cache_authority_verify.py +++ b/wai/live-conformance/cache_authority_verify.py @@ -56,6 +56,7 @@ import timeliness_verify as TV # noqa: E402 import rung_price_verify as RP # noqa: E402 HV = TV.HV # the holdings corpus's reader, which the timeliness verifier loads +KV = TV.KV # the carousel corpus's reader, which the timeliness verifier loads EXTENSION = os.path.join(HERE, "..", "extensions", "cache-authority.md") JWP_RECEIPTS = os.path.join(HERE, "..", "extensions", "jwp-receipts.md") @@ -223,6 +224,12 @@ def check_cache_transmission(c, g, objects): need(drops("ct_root") or root.hex() == b["sent_root"], "cache_transmission_root_mismatch") +def check_any_schedule(c, g, pairs): + """§5.6, §7.2 step 2: a schedule by the group's key is the publisher's, under carousel §4.3 whole; + by another key, a node's, under carousel §4.3 but for its step 2.""" + KV.check_schedule(c, g, pairs, node=c["signer_pubkey"] != g["signer_pubkey"] and not drops("schedule_step2")) + + def read_objects(receipts): """The object receipts given that read (jwp-receipts §2.4.2).""" out = [] @@ -261,6 +268,9 @@ def claim_outcome(case): CV.check_chain(c, held.get(c["signer_pubkey"])) if case["context"] is None and not drops("unchecked"): return "unchecked" + if c["class"] == "schedule": + check_any_schedule(c, context_group(case["context"]), [(o, None) for o in read_objects(case["objects"])]) + return "accept" if c["class"] != "cache-transmission": raise CV.Reject(6, "context_mismatch") check_cache_transmission(c, context_group(case["context"]), read_objects(case["objects"])) @@ -297,6 +307,8 @@ class Verdict: BV.check_reconciliation(c, gr, objs) elif c["class"] == "cache-transmission": check_cache_transmission(c, gr, objs) + elif c["class"] == "schedule": + check_any_schedule(c, gr, self.g.pairs) else: raise CV.Reject(6, "context_mismatch") except CV.Reject as r: @@ -343,6 +355,55 @@ class Verdict: "sent": positions(cs[0]["body"]["sent"])} for i in idx: labels[i] = "cache-declared" + # Step 4, the schedules: the publisher's by carousel §6.2 step 4, each node's by §5.6. + self.schedules = {} + + def settle(bid, idx): + """The schedules of one signer on one instance, each extending the one before it, or + set aside. The last stands and each before it with another body is extended.""" + bodies = [accepted[i]["body"] for i in idx] + if not KV.monotone(bodies) and not drops("schedule_monotone"): + for i in idx: + labels[i] = "set-aside reason=schedule_contradicted" + return False + last = bodies[0] if drops("schedule_last") else bodies[-1] + self.schedules[bid] = last + for i in idx: + labels[i] = "stands" if accepted[i]["body"] == last else "extended" + return True + + for bid, idx in by_instance("schedule").items(): + publisher = [i for i in idx if accepted[i]["signer_pubkey"] == gr["signer_pubkey"]] + nodes = [i for i in idx if accepted[i]["signer_pubkey"] != gr["signer_pubkey"]] + + def aside(group, reason): + for i in group: + labels[i] = "set-aside reason=" + reason + + if publisher: + if not KV.monotone([accepted[i]["body"] for i in publisher]): + aside(publisher, "schedule_contradicted") + elif bid in self.pub_aside: + aside(publisher, "bearer_contradicted") + elif bid not in self.pub and not drops("schedule_publisher_declared"): + aside(publisher, "bearer_not_declared") + elif bid in self.pub and self.pub[bid]["bearer"] == "bidirectional": + aside(publisher, "schedule_on_bidirectional") + else: + settle(bid, publisher) + if nodes: + if (bid in self.pub or bid in self.pub_aside or bid in self.cache_aside) and not drops("schedule_taken"): + aside(nodes, "bearer_contradicted") + elif bid not in self.caches and not drops("schedule_undeclared"): + aside(nodes, "bearer_not_declared") + elif bid in self.caches: + server = self.caches[bid]["server"] + mine = [i for i in nodes if accepted[i]["signer_pubkey"] == server or drops("schedule_signer")] + aside([i for i in nodes if i not in mine], "cache_schedule_signer_mismatch") + if mine: + settle(bid, mine) + else: + settle(bid, nodes) # Step 5: the reconciliations. counted, self.bits, self.instance_bits, self.counted = set(), {}, {}, [] for i, c in enumerate(accepted): @@ -442,7 +503,30 @@ class Verdict: assertion = "holds" return {"objects": g.verdicts, "claims": self.labels, "status": status, "sinks": sinks, "whole": whole, "received_by": received_by, "bearers": bearers, "caches": caches, "sink": sink, - "assertion": assertion} + "assertion": assertion, "held": self.held(case.get("held"), n)} + + def held(self, h, n): + """§7.3: carousel §6.4's statement against the schedule that stands on its instance.""" + if h is None: + return None + bad = None if drops("held_bounds") else KV.bounds(h["loss_ppm"], h["overhead"]) + if bad: + return "reject reason=" + bad + body = self.schedules.get(h["bearer_id"]) + entries = {} if body is None else {e["leaf_index"]: e for e in body["objects"]} + + def object_held(i): + e = entries.get(i) + if e is None: + return "object_not_scheduled" + at = KV.availability(e, h["loss_ppm"], h["overhead"])["available_ms"] + if at is None: + return "availability_not_within_schedule" + return "availability_after_deadline" if at > h["by_ms"] and not drops("held_deadline") else None + + wanted = [h["index"]] if h["kind"] == "object" else range(n) + reason = next((r for r in (object_held(i) for i in wanted) if r), None) + return "holds" if reason is None else "reject reason=" + reason def count_only_of(case): @@ -847,8 +931,24 @@ def mutations(doc): def m_reason_gone(d): d["claims"].remove(case(d, "leaf_count_wrong")) + def m_schedule_label(d): + case(d, "node_schedule_stands")["outcome"]["claims"][1] = "extended" + + def m_schedule_held(d): + # A millisecond earlier than the second pass's end. + case(d, "node_schedule_stands")["held"]["by_ms"] -= 1 + + def m_schedule_signer(d): + # Dropped from the stated claims: C1's instance then has no other signer to set aside. + c = case(d, "node_schedule_other_signer") + c["claims"].pop() + + def m_schedule_reason_gone(d): + d["verdicts"] = [c for c in d["verdicts"] if "cache_schedule_signer_mismatch" not in json.dumps(c["outcome"])] + return [m_until, m_least, m_receipt, m_credit, m_status, m_head, m_count_only, m_bound, m_population, m_region, - m_deadline, m_ppm, m_sole, m_items, m_claim_link, m_line, m_reason_gone] + m_deadline, m_ppm, m_sole, m_items, m_claim_link, m_line, m_reason_gone, m_schedule_label, m_schedule_held, + m_schedule_signer, m_schedule_reason_gone] WEAKENINGS = ["rec_second", "rec_round", "ack_last_us", "ack_round", "until_inclusive", "serving", "least_origin", @@ -861,7 +961,9 @@ WEAKENINGS = ["rec_second", "rec_round", "ack_last_us", "ack_round", "until_incl "target_bound", "count_only", "group_start", "out_of_range", "verified", "records", "hit_inclusive", "miss_ceil", "server_instant", "publisher", "target_inclusive", "line_keys", "deadline_envelopes", "ack_order", "ack_digest", "server_earliest", "cache_earliest", "rec_before_ms", "line_fallback_acks", - "line_records_verified", "line_fallback_holders"] + "line_records_verified", "line_fallback_holders", "schedule_step2", "schedule_monotone", "schedule_last", + "schedule_publisher_declared", "schedule_taken", "schedule_undeclared", "schedule_signer", "held_bounds", + "held_deadline"] def direct_checks(): diff --git a/wai/live-conformance/carousel/README.md b/wai/live-conformance/carousel/README.md index e0fa4d0b6..c298ed3dc 100644 --- a/wai/live-conformance/carousel/README.md +++ b/wai/live-conformance/carousel/README.md @@ -9,8 +9,9 @@ payloads are opaque test bytes written by the generator; no media and no input f repository. `keys` names every key by its role, as 64 lowercase hexadecimal digits: the publisher's -(`publisher`, `did:web:publisher.example#d1`), a second key of its origin (`publisher_d2`), and a -sink's (`sink`, signing under its `did:key`). +(`publisher`, `did:web:publisher.example#d1`), a second key of its origin (`publisher_d2`), a +sink's (`sink`, signing under its `did:key`), and the roots of the test key logs (`log_root`, +`other_log_root`). `verdicts` (§6) are each one group of four objects, of 3,200, 896, 288 and 200 octets, as a verifier holds it: @@ -23,7 +24,7 @@ verifier holds it: statement offered (§6.4): `{"kind": "object", "bearer_id", "index", "by_ms"}` or `{"kind": "group", "bearer_id", "by_ms"}`; - `outcome`: `refuse` and its `reason`; or `verdict` with each object's verdict, each claim's - (`declared`, `stands`, `set-aside reason=…`, or `reject step=… reason=…`), a line for each entry + (`declared`, `stands`, `extended`, `set-aside reason=…`, or `reject step=… reason=…`), a line for each entry of each schedule that stands — its `bearer_id`, `leaf_index`, `pass`, `available_ms`, `bytes_sent` and `failure_one_in` — and the statement's result. @@ -36,6 +37,12 @@ verifier holds it: `outcome`: `plan`, with the `passes` it listens to (each `pass`, `start_ms` and `end_ms`), `complete_ms` and `listen_ms`; or `refuse` and its `reason`. +`inband` (§8.2) are each what a receiver acquired on an instance: its `bearer_id`, the `group` +receipt, the `claims` in chain order, and the key `logs`, each a revision's text keyed by the origin +it was acquired for. `outcome`: `refuse` and its `reason`, for a group that fails; or `inband` with +each claim's label, `set` (`suffices`, or the reason it does not) and `inband_ms`, the interval of +the schedule that stands where the set suffices, `null` otherwise. + Everything is synthetic. Keys attest nothing; bearer instances use the example URN namespace (`urn:example:`) and origins a reserved example domain. Each case states the outcome it was written to have, declared in the generator, never copied from a verifier. diff --git a/wai/live-conformance/carousel/vectors.json b/wai/live-conformance/carousel/vectors.json index 5598ca664..84d56b550 100644 --- a/wai/live-conformance/carousel/vectors.json +++ b/wai/live-conformance/carousel/vectors.json @@ -1,9 +1,11 @@ { - "about": "Conformance corpus of extensions/carousel.md (wai.bearer.carousel): the schedule claim (jwp-receipts §2.4.16), when a receiver within a loss bound holds each object (§6), and the passes a receiver listens to (§7). Every key is Ed25519 from a fixed 32-byte seed and attests nothing; envelopes carry opaque test payloads of exact lengths; bearer instances use the example URN namespace and origins reserved example domains. Each case states the outcome it was written to have, declared in the generator. Regenerate with `wai_carousel_vectors gen`.", + "about": "Conformance corpus of extensions/carousel.md (wai.bearer.carousel): the schedule claim (jwp-receipts §2.4.16), a later schedule that extends an earlier one (§4.5), when a receiver within a loss bound holds each object (§6), the passes a receiver listens to (§7), and whether what a receiver acquired on an instance suffices (§8.2). Every key is Ed25519 from a fixed 32-byte seed and attests nothing; envelopes carry opaque test payloads of exact lengths; bearer instances use the example URN namespace and origins reserved example domains. Each case states the outcome it was written to have, declared in the generator. Regenerate with `wai_carousel_vectors gen`.", "keys": { "publisher": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", "publisher_d2": "204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21", - "sink": "db995fe25169d141cab9bbba92baa01f9f2e1ece7df4cb2ac05190f37fcc1f9d" + "sink": "db995fe25169d141cab9bbba92baa01f9f2e1ece7df4cb2ac05190f37fcc1f9d", + "log_root": "e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb", + "other_log_root": "fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f" }, "verdicts": [ { @@ -3384,6 +3386,1698 @@ "statement": null } }, + { + "name": "extension_adds_passes", + "description": "At 90% object 0 gains 3 a pass and needs 7 passes, and the first schedule has 5. A later one with 7 extends it: the first is extended, and the object is held at the end of the seventh.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":7,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"4032e266d81589707afab166cd281ee4bb3285d4cea6bc6d6a97637f53e1f9d6777dd8d2f06960a72f5c4919068c40c5a509060861fee0aa481db66636d33802\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 900000, + "overhead": 2, + "statement": { + "kind": "object", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "index": 0, + "by_ms": 1793620994000 + }, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "extended", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 7, + "available_ms": 1793620994000, + "bytes_sent": 33152, + "failure_one_in": 1000000 + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 3840, + "failure_one_in": 1000000 + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": null, + "available_ms": null, + "bytes_sent": 1152, + "failure_one_in": null + } + ], + "statement": "holds" + } + }, + { + "name": "extension_adds_an_object", + "description": "A later schedule adds an entry for object 2, and is repeated: the first is extended, both copies of the last stand, and a statement about the added object holds.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"f81fdf8d8d9647a65a4e0b3a3df3758af15c4846a640bbece4e82e3da7da0a3b5a5c2d18f50b42d64e38718570a1bdd5715e124f3fc003402d6233fd25586e06\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"e7e7335ae68ae4d06ab142f4c09560593010a68e2da92891b9627395881ee2d1\",\"seq\":2,\"sig\":\"f44bd49c4c2583c076dac8015df2a98b10a08b02184c2fb59eec51428a2c3f5f4bacc0d4e251f278834c5199f1df5f990b0c36d2700679adfa8489e55d2d9b03\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"3d7d0f60dffed417cb92d892315f37ab11454cc414593e9aff5db6c7bea04ef5\",\"seq\":3,\"sig\":\"d47d145aadb7329830382d8e88fb1c5cac10fa1757b3ca32ad1525a72f3f2ca8e5d3fec62d1877a1c30f13c0cac3e1b41c3c1d788e33fd0b97013cfedd280d0f\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 300000, + "overhead": 2, + "statement": { + "kind": "object", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "index": 2, + "by_ms": 1793620819000 + }, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "extended", + "stands", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 2, + "available_ms": 1793620844000, + "bytes_sent": 23680, + "failure_one_in": 1000000 + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 3840, + "failure_one_in": 1000000 + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 1, + "available_ms": 1793620819000, + "bytes_sent": 1152, + "failure_one_in": null + } + ], + "statement": "holds" + } + }, + { + "name": "extension_of_one_pass", + "description": "One pass, its period 0 and not read, then five passes with a period: the pass stated stays the first, and object 0 is held after the second at 30%.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":0,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"16ccd484b7611944cf3650cfb433ff9b5dbd29c28485a6afffec123ebe1be566a1f508226a4c5c5b9e3f051f057f83733fca484d6aaf7abacbc90a41c065870b\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"d64158c00bd30467c2bd0644f75fdbfb667abcc7d9bb5704d1de317479db1415\",\"seq\":2,\"sig\":\"e216133683fe9b99591d83bbee38cbb893f57023a4752ae438cb6d432731c0d4f253cc5ef227b68c900da04c1573cec0c71c07a6a2fd84f16921b8d1954eb80a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 300000, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "extended", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 2, + "available_ms": 1793620844000, + "bytes_sent": 23680, + "failure_one_in": 1000000 + } + ], + "statement": null + } + }, + { + "name": "extension_of_repeat", + "description": "Object 1 under `repeat` at 30%: three more passes of the same ESIs add nothing certain, so it is still not within the schedule, and the octets sent are the later schedule's.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"7247acca051dc1243dc74f14d91ebc9e31e3568496e34c3d344b3be9adeed2d4eab0da821752594182d9404001e120fe3ba784ce74930ed97129bb558c5fbf0d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":6,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"f9913358f92cc61462534e2451a4aa2a4be1a159e4a4c1061192cd2c0097668a\",\"seq\":2,\"sig\":\"b300d05cb1286e5c551357c5b28d433bd23017b3872e7cdfd9eb3c0709188e8bbb03c0d1a25ef3e226a67670ecec1dc353a6dc5e64ffc0616d4d98a55e566a0e\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 300000, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "extended", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 7680, + "failure_one_in": 1000000 + } + ], + "statement": null + } + }, + { + "name": "extension_withdraws_passes", + "description": "The schedules of extension_adds_passes in the other order: the later withdraws two passes.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":7,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"94d63dcd85e61effb91909cfb3cffd46e89d7d54d3d7253134023a0e58863136324590e97aa9c0fb5cb04d63ba9e263ea137a5a51033a4ab46f32786975acf00\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"96697c768c48fbcea5f9bf9959897f61e7c4f33f7e4ed62b28f65c7e2c333475\",\"seq\":2,\"sig\":\"14fb428867ea8be56a3cae73974cf4bc82435223abbd61bfdb3473c39846c10f5205daa9bb1a42be54e8fc5ba00f990179a4c3f0741a210c8d321b10ee19300c\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_moves_the_first_pass", + "description": "Six passes, each a second later.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":6,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620811000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"dd8ff476ff00db7887aa43c4d7efa28ffcd6d9f7658a0c507699bfc913c2f7f1f3c73e8fe1817e93470a8806a0ae17d90822ad6911d2d6c54976e9ea4244eb07\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_changes_the_period", + "description": "Six passes, a second further apart: every pass after the first moves.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":6,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":31000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"65afb347268071817d6c3cadeb45311b7bfc935458341c02cb283fdd6130f552484aabf15bc4eba2fee11e56395086f0aa8d55c11b1c9a72aa4bbdac30adf203\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_changes_the_duration", + "description": "Six passes, each a second longer.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":6,\"duration_ms\":5000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"dd2aac3ee184d88fcd3ca52f35ec1150492e1e4fc82f14da9697d8ca147b306568a8ddaea6c01be5b5ad9ccb2e3b066a4e15c0f22eeda584fed094fc86145903\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_changes_the_repair", + "description": "Six passes with a repair symbol more in each: every pass sends other symbols.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":6,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":9},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"b3064fa8a5e594d90d94818bbffcd86880db986606ab9b80ab0d212bf70dcfc08a617f5a2b6f73a9ccaa0a7b2d2c007b081fe5d77606bf5553ccc16a0237990a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_changes_the_esi", + "description": "Object 1 moved from `repeat` to `advance`.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":4,\"duration_ms\":2000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"34b470b70d481652bd771e196e04d761fec08d9e124a0b3a66f8ce74af969e0ac3c294e7f8c931bac237c83827a9fc4b1bebb9245c6e70f87cc7b831f4a34e0d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_changes_the_code", + "description": "Object 2's blocks of 3 stated as blocks of at most 2.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":2,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"31d8815e9fdd6dca69807304a4a187501d447c645474058b23e81e401ed5179ec6529bdde2f7ca4362a6e7ef361f97ee782e3d6598cd245a20b75b4f879b1400\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_falls_back", + "description": "Five passes, then seven, then six: the last extends the first and withdraws a pass of the second, and all three are set aside.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":7,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"4032e266d81589707afab166cd281ee4bb3285d4cea6bc6d6a97637f53e1f9d6777dd8d2f06960a72f5c4919068c40c5a509060861fee0aa481db66636d33802\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":6,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"310d40b6805e3e24526cca7f3664fbd04527869ed97a1324c9e89598bc9eb6fb\",\"seq\":3,\"sig\":\"63aa8078f9f2dc8ba18d27fb03de0498b1dd91d736a136d5809e1704b20be8375ff899d069ffe8bf76690a549d95a6098973f43bd84133da629b5bbc0714ae0d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "lines": [], + "statement": null + } + }, + { + "name": "extension_not_declared", + "description": "A schedule and its extension on an instance no declaration names: both set aside.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-9\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"165418e57dab7969beb1153612adb186ff124716cb6b44f34355750066890ecf463d4833081be8d461f5c17fa6022228f66c754a1a605f8146a27eefaba53a00\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-9\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":7,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"0f8ca90e36d8c67e2ba84b47cbfb46b9ad49a4d77525af4979bf0a367e0ee36f\",\"seq\":1,\"sig\":\"bc10ffb4d8e9f0fb4de80e540c8d38b2949eabe2d3d066878ac6fe377f6ad0c0e88a0cfb91d4d333012dc2c940131b7148fc2a0567eadacc27b40810e839dc0d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "set-aside reason=bearer_not_declared", + "set-aside reason=bearer_not_declared" + ], + "lines": [], + "statement": null + } + }, { "name": "subject_mismatch", "description": "A schedule naming another group.", @@ -5472,6 +7166,53 @@ "listen_ms": 0 } }, + { + "name": "too_late_extended", + "description": "The receiver of too_late under a schedule extended to seven passes: passes 5 and 6, and it is held.", + "entry": { + "leaf_index": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "fec": "raptorq", + "oti": { + "transfer_length": 3200, + "symbol_size": 64, + "source_blocks": 3, + "sub_blocks": 1, + "alignment": 4 + }, + "repair": 8, + "esi": "advance", + "first_ms": 1793620810000, + "period_ms": 30000, + "duration_ms": 4000, + "count": 7 + }, + "at_ms": 1793620910000, + "loss_ppm": 300000, + "overhead": 2, + "held": [ + 0, + 0, + 0 + ], + "outcome": { + "outcome": "plan", + "passes": [ + { + "pass": 5, + "start_ms": 1793620930000, + "end_ms": 1793620934000 + }, + { + "pass": 6, + "start_ms": 1793620960000, + "end_ms": 1793620964000 + } + ], + "complete_ms": 1793620964000, + "listen_ms": 8000 + } + }, { "name": "already_held", "description": "Holding 20 of every block: held now, nothing to listen to.", @@ -5793,5 +7534,667 @@ "reason": "overhead_invalid" } } + ], + "inband": [ + { + "name": "suffices", + "description": "The declaration and the schedule, from the chain's head, with the origin's key log: the interval is the least period, 30 s.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "suffices", + "inband_ms": 30000 + } + }, + { + "name": "interval_every_entry_one_pass", + "description": "Every entry has one pass, whose periods are not read: the interval is the least duration, 1 s.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":1,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":1,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"1bb306ceb3d1635954998dbf3ae44981742c1e7a4c1df26ba46a78a2f2eb658103860272ac737a85b1cae9e3f3e70b4f1bc90469f0b7b1e83c7cefa87f7efc06\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "suffices", + "inband_ms": 1000 + } + }, + { + "name": "interval_skips_one_pass", + "description": "Object 0 has one pass with a period of 0, object 2 repeats every 20 s and object 1 every 30 s: the least of the two read, 20 s.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":0,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":20000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"822ed96fd2bf1c3c95c1f94b34490a23957102935df29208b6baf6b6424540259e35e7ed9e093e0b6f43bbcb2c3a1f2bf7b8929b2302e2d70899c92af1f4ef0e\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "suffices", + "inband_ms": 20000 + } + }, + { + "name": "with_an_extension", + "description": "An earlier copy and the schedule that extends it, which adds object 3 every 20 s: one schedule stands, and the interval is the later one's.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":7,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0},{\"content_hash\":\"7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768\",\"count\":2,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620840000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":40,\"transfer_length\":200},\"period_ms\":20000,\"repair\":12}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"2d3e9b9d73ac2e459eee677243b37699767857a0862ff7842fa9585d69736b389515955212d93f74cb688b70632e976ba5e11d3eefdfe6dc5d4a120c62539c08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "extended", + "stands" + ], + "set": "suffices", + "inband_ms": 20000 + } + }, + { + "name": "chain_holds_another_group", + "description": "The chain from its head holds a claim about another group: refused at step 6 here, it breaks nothing, and the set suffices.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"aed597dda0639687d0c6c7eaaa7245f9b5cd368c7a26baf85b382c66a74afe8cfbac806d78c61f65423994224d664bdd448fef403ede7092b49cf48ce4762101\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"ed8a7ed9f5bcee831bb5ecc571560d361b1b8ee540b1d7286d5987215377e4c0\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"dd580c34435eb98370489d549fae978ab04ea777dedf29e1f4579a439819b082\",\"seq\":1,\"sig\":\"63b975c28b4b43bc7e129e10fbb12c494f8b5f5421aa05eb5eb18c939b067e2876773a155172c82f5c38682a514e2e1d9c1452f73f84d2b0d2a35a8bfec3cf0d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"e8f928b869726c7a9c825bddb80613d1487f314fa8dfa094e75285c1cb87b743\",\"seq\":2,\"sig\":\"3ea4b29ca3c0d7b2266272d8eb09343926e3922454c78e78d21b0e4a09143cc499ee2aa3cda6e044ae7465ad44613588bbe6e2d05cad60b460fdaa8e013c230b\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "reject step=6 reason=transmission_subject_mismatch", + "declared", + "stands" + ], + "set": "suffices", + "inband_ms": 30000 + } + }, + { + "name": "chain_without_its_head", + "description": "The same chain without its first claim: the declaration's parent is not held, so the set does not suffice.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"dd580c34435eb98370489d549fae978ab04ea777dedf29e1f4579a439819b082\",\"seq\":1,\"sig\":\"63b975c28b4b43bc7e129e10fbb12c494f8b5f5421aa05eb5eb18c939b067e2876773a155172c82f5c38682a514e2e1d9c1452f73f84d2b0d2a35a8bfec3cf0d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"e8f928b869726c7a9c825bddb80613d1487f314fa8dfa094e75285c1cb87b743\",\"seq\":2,\"sig\":\"3ea4b29ca3c0d7b2266272d8eb09343926e3922454c78e78d21b0e4a09143cc499ee2aa3cda6e044ae7465ad44613588bbe6e2d05cad60b460fdaa8e013c230b\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "reject step=5 reason=parent_not_held", + "set-aside reason=bearer_not_declared" + ], + "set": "inband_chain_incomplete", + "inband_ms": null + } + }, + { + "name": "chain_out_of_order", + "description": "The schedule given before the declaration it follows in the chain.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "reject step=5 reason=parent_not_held", + "reject step=5 reason=chain_break" + ], + "set": "inband_chain_incomplete", + "inband_ms": null + } + }, + { + "name": "no_schedule", + "description": "The declaration alone: there is nothing to plan with.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared" + ], + "set": "inband_not_scheduled", + "inband_ms": null + } + }, + { + "name": "schedule_of_another_instance", + "description": "The set of the broadcast, asked about the multicast the receiver joined.", + "bearer_id": "urn:example:wai-carousel:multicast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_not_scheduled", + "inband_ms": null + } + }, + { + "name": "no_declaration", + "description": "A schedule at its chain's head with no declaration: set aside, so none stands.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7687a0b1c75455943f9db533410b8a4d7d80185fa7351d05250673e595a05f57c3fd05aa444dd350904c8b5bcb8f7a7b047c72da3be912689feef7655b901e0a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "set-aside reason=bearer_not_declared" + ], + "set": "inband_not_scheduled", + "inband_ms": null + } + }, + { + "name": "contradicted", + "description": "A later schedule that withdraws a pass: both set aside, so none stands.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":4,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"886ca230c54dc5662c16175954296fb4ee3968000f6f651e4394548653df4fd3\",\"seq\":2,\"sig\":\"e4d2ccba1ddbf7bedaeaf794a69d601cf62cf9efc67912bda0c3d6ff00d442e123faf9de63fbc483812ebca650c3f7f4f2826f946b3d4eae24d3ac67324e2c0a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted" + ], + "set": "inband_not_scheduled", + "inband_ms": null + } + }, + { + "name": "key_log_absent", + "description": "No key log acquired.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": {}, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_key_log_missing", + "inband_ms": null + } + }, + { + "name": "key_log_of_another_origin", + "description": "A key log of another origin only, under its own name.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"1c59d283a0893516767e9a2683c580c11f729aea7ae6bb91ca247c287fc884c3dcbb732f736d505bd06401e6370f756b24fd0784f92df9e02947323a99489e0b\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_key_log_missing", + "inband_ms": null + } + }, + { + "name": "key_log_names_another_origin", + "description": "Another origin's revision acquired at the publisher's location: not held.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"1c59d283a0893516767e9a2683c580c11f729aea7ae6bb91ca247c287fc884c3dcbb732f736d505bd06401e6370f756b24fd0784f92df9e02947323a99489e0b\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_key_log_missing", + "inband_ms": null + } + }, + { + "name": "key_log_signature_broken", + "description": "The publisher's key log with its signature broken: not held.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"24748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_key_log_missing", + "inband_ms": null + } + }, + { + "name": "key_log_not_read", + "description": "A file at the key log's location that is no revision.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_key_log_missing", + "inband_ms": null + } + }, + { + "name": "key_log_lacks_the_key", + "description": "The publisher's key log, listing only its other key.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"a05839327d8bf5fbab25038a7a9251f36dcef8b2cff7f31d4503b9758cfbecb65847943092404874a211695a01c5183ad8655f019c3b387feaff9b3cdb2fda02\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "inband_key_log_missing", + "inband_ms": null + } + }, + { + "name": "key_log_revokes_the_key", + "description": "A held log that revokes the schedule's key lists it: the set suffices, and what the log says of the key is confirmation's (bearer-receipts §8.3).", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"schedule\"],\"status\":\"revoked\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"b1970f5e5d621d74af8a046998578ae411db4acc4302f0e44fad453ec93cf73aaa9ae107d41715360810682609aa15840c6dc99f866a1d1d488c0612917fa204\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "inband", + "claims": [ + "declared", + "stands" + ], + "set": "suffices", + "inband_ms": 30000 + } + }, + { + "name": "group_refused", + "description": "A group whose signature is broken: nothing is derived.", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "0ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptorq\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":6},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":4,\"duration_ms\":1000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"max_block_length\":4,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"001bdcd3dd132371691681e6dc50443b075ed17405e50882913c0c0740f4fbf7215431b06909cdc94f1e3a0a64abe2d5e5baba7c5f999e66b8a40d341604440d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "logs": { + "https://publisher.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"may_sign\":[\"delivery\",\"transmission\",\"schedule\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"d2\",\"key\":\"204040e364c10f2bec9c1fe500a1cd4c247c89d650a01ed7e82caba867877c21\",\"may_sign\":[\"delivery\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"25748bf2da9e8565aa963051719a742e0d72184735fa8d77403a269e47829952f966023d5cb8794b22caa71218876160b1cd27d9af69eef6d604cb15b42b910a\",\"status_max_age_s\":3600}" + }, + "outcome": { + "outcome": "refuse", + "reason": "signature_verify_failed" + } + } ] } diff --git a/wai/live-conformance/carousel_verify.py b/wai/live-conformance/carousel_verify.py index 393ce0d92..8e854f8a2 100644 --- a/wai/live-conformance/carousel_verify.py +++ b/wai/live-conformance/carousel_verify.py @@ -7,13 +7,16 @@ on what they define: group and object receipts from the JWP corpus's (`../jwp-conformance/jwp_verify.py`, jwp-receipts §2.2, §3), and a claim's steps 1 to 5 from the claim corpus's (`../claim-conformance/claim_verify.py`, jwp-receipts §3.1), whose step 4 holds the schedule class's rules with §5.1 and §5.2's division of an object into source blocks. -Everything else this extension adds is written here: +A key log's reading comes from the signer corpus's (`../signer-conformance/signer_verify.py`, +jwp-receipts §7.2). Everything else this extension adds is written here: - §4.3: a schedule against the group, its object receipts and their envelopes; +- §4.5: when a later schedule extends an earlier one; - §5.3: what a receiver needs of a block, K′ read from Appendix A of the extension's text; - §6: the declarations and schedules that stand, each entry's availability within a loss bound, and statements offered; -- §7: the passes a receiver listens to. +- §7: the passes a receiver listens to; +- §8.1 and §8.2: a schedule's interval, and whether what a receiver acquired suffices. For every case it requires the outcome the corpus states, field for field; that every reason of §9's table appears in the corpus; then it mutates copies of the corpus, one defect each, and @@ -33,10 +36,11 @@ import re import sys HERE = os.path.dirname(os.path.abspath(__file__)) -for d in ("claim-conformance", "jwp-conformance"): +for d in ("claim-conformance", "jwp-conformance", "signer-conformance"): sys.path.insert(0, os.path.join(HERE, "..", d)) import claim_verify as CV # noqa: E402 import jwp_verify as JV # noqa: E402 +import signer_verify as SG # noqa: E402 EXTENSION = os.path.join(HERE, "..", "extensions", "carousel.md") @@ -105,14 +109,15 @@ def check_transmission(c, g): need(g["signer_pubkey"] == c["signer_pubkey"], "transmission_signer_mismatch") -def check_schedule(c, g, objects): +def check_schedule(c, g, objects, node=False): """§4.3 against a group that passed jwp-receipts §3 steps 1 and 2, and the object receipts - held under it with their envelopes where held: [(object, envelope or None)].""" + held under it with their envelopes where held: [(object, envelope or None)]. A node's schedule + of its own instance (cache-authority §5.6) is checked in every step but step 2.""" start = JV.seconds(g["group_start"]) need(start is not None, "context_invalid") entries = c["body"]["objects"] need(drops("subject") or JV.link(g).hex() == c["subject"], "schedule_subject_mismatch") - need(drops("signer") or g["signer_pubkey"] == c["signer_pubkey"], "schedule_signer_mismatch") + need(node or drops("signer") or g["signer_pubkey"] == c["signer_pubkey"], "schedule_signer_mismatch") need(drops("range") or all(e["leaf_index"] < g["leaf_count"] for e in entries), "schedule_leaf_out_of_range") need(drops("before") or all(e["first_ms"] // 1000 >= start for e in entries), "schedule_before_group") for e in entries: @@ -124,6 +129,38 @@ def check_schedule(c, g, objects): need(drops("length") or len(envelope) == e["oti"]["transfer_length"], "schedule_length_mismatch") +# ------------------------------------------------------------------ §4.5 + +def entry_extends(b, a): + """§4.5: entry b's passes begin with entry a's: its members are a's but `count`, at least a's, + and `period_ms`, which may differ only where a has one pass.""" + if b["count"] < a["count"] and not drops("extension_count"): + return False + period_read = a["count"] >= 2 or drops("extension_one_pass") + if period_read and b["period_ms"] != a["period_ms"] and not drops("extension_period"): + return False + return drops("extension_members") or all(b[k] == v for k, v in a.items() if k not in ("count", "period_ms")) + + +def extends(b, a): + """§4.5: schedule b extends schedule a of its instance: for every entry of a, an entry of that + object that extends it. It may have entries for objects a has none for.""" + by_leaf = {e["leaf_index"]: e for e in b["objects"]} + + def covered(e): + later = by_leaf.get(e["leaf_index"]) + return drops("extension_drops") if later is None else entry_extends(later, e) + + return all(covered(e) for e in a["objects"]) + + +def monotone(bodies): + """§6.2 step 4: the schedules of one instance, in chain order: each extends the one before.""" + if drops("extension_chain"): + return all(extends(b, bodies[0]) for b in bodies[1:]) + return all(extends(b, a) for a, b in zip(bodies, bodies[1:])) + + # ------------------------------------------------------------------ §5.3, §6.3 def needed(e, k, h): @@ -176,39 +213,22 @@ def bounds(loss, h): return None -def verdict(case): - bad = bounds(case["loss_ppm"], case["overhead"]) - if bad: - return {"outcome": "refuse", "reason": bad} +def read_group(wire): + """§6.2 step 1's group, or the refusal the corpus states.""" try: - g = JV.read_group(case["group"]) + g = JV.read_group(wire) JV.verify_group(g) except JV.Refuse as r: - return {"outcome": "refuse", "reason": r.reason} + return None, {"outcome": "refuse", "reason": r.reason} + return g, None - # Step 1: the objects, the same on every bearer. - objs, overdicts = [], [] - for o in case["objects"]: - try: - ob = JV.read_object(o["receipt"]) - except JV.Refuse as r: - overdicts.append("reject reason=" + r.reason) - continue - env = None if o["envelope"] is None else bytes.fromhex(o["envelope"]) - objs.append((ob, env)) - try: - if env is None: - JV.inclusion(ob, g) - overdicts.append("inclusion-verified") - else: - JV.accept(ob, g, env) - overdicts.append("delivered-verified") - except JV.Refuse as r: - overdicts.append("reject reason=" + r.reason) +def judge(g, objs, wires): + """§6.2 steps 2 to 4 over a group and the object receipts held: the claims' labels, and the + claim that stands on each instance, by its `bearer_id`.""" # Step 2: each claim, §3.1 steps 1-5, then step 6. held, claims, standing_claims = {}, [], [] - for wire in case["claims"]: + for wire in wires: try: c = CV.verify_claim(wire) except CV.Reject as r: @@ -250,11 +270,11 @@ def verdict(case): for i in idx: claims[i] = "set-aside reason=bearer_contradicted" - # Step 4: the schedules. + # Step 4: the schedules, each instance's in the order of their signer's chain. schedules = {} for bid, idx in by_instance("schedule").items(): bodies = [standing_claims[i]["body"] for i in idx] - if not drops("schedule_contradiction") and any(b != bodies[0] for b in bodies): + if not drops("schedule_contradiction") and not monotone(bodies): aside = "schedule_contradicted" elif bid in contradicted: aside = "bearer_contradicted" @@ -268,13 +288,49 @@ def verdict(case): for i in idx: claims[i] = "set-aside reason=" + aside else: - schedules[bid] = bodies[0] + last = idx[0] if drops("extension_last") else idx[-1] + schedules[bid] = standing_claims[last] + for i in idx: + if standing_claims[i]["body"] != standing_claims[last]["body"]: + claims[i] = "extended" + return claims, schedules + + +def verdict(case): + bad = bounds(case["loss_ppm"], case["overhead"]) + if bad: + return {"outcome": "refuse", "reason": bad} + g, refused = read_group(case["group"]) + if refused: + return refused + + # Step 1: the objects, the same on every bearer. + objs, overdicts = [], [] + for o in case["objects"]: + try: + ob = JV.read_object(o["receipt"]) + except JV.Refuse as r: + overdicts.append("reject reason=" + r.reason) + continue + env = None if o["envelope"] is None else bytes.fromhex(o["envelope"]) + objs.append((ob, env)) + try: + if env is None: + JV.inclusion(ob, g) + overdicts.append("inclusion-verified") + else: + JV.accept(ob, g, env) + overdicts.append("delivered-verified") + except JV.Refuse as r: + overdicts.append("reject reason=" + r.reason) + + claims, schedules = judge(g, objs, case["claims"]) # Step 5. loss, h = case["loss_ppm"], case["overhead"] lines = [] for bid in sorted(schedules): - for e in schedules[bid]["objects"]: + for e in schedules[bid]["body"]["objects"]: lines.append({"bearer_id": bid, "leaf_index": e["leaf_index"], **availability(e, loss, h)}) # §6.4. @@ -353,6 +409,58 @@ def plan(case): } +# ------------------------------------------------------------------ §8.1, §8.2: what rides in-band + +def interval(body): + """§8.1: the least `period_ms` of the entries of two passes or more, or, where every entry has + one pass, the least `duration_ms`.""" + repeated = [e["period_ms"] for e in body["objects"] if e["count"] >= 2 or drops("interval_one_pass")] + if repeated: + return min(repeated) + return min(e["duration_ms"] for e in body["objects"]) + + +def key_log_held(c, logs): + """§8.2 check 3: a log acquired is held for the origin the claim's `signer_id` names + (jwp-receipts §7.2 rules 1 to 3) and lists the claim's key.""" + named = SG.classify(c["signer_id"]) + if named[0] != "origin": + return False + text = logs.get(named[1]) + if text is None: + return False + try: + r = SG.parse_revision(text) + if not drops("inband_log_held"): + SG.check_held(r, named[1]) + except SG.Stop: + return False + return drops("inband_log_lists") or any(e["key"] == c["signer_pubkey"] for e in r["keys"]) + + +def inband(case): + """§8.2: §6.2 over the group and the set's claims alone, then its three checks in order.""" + g, refused = read_group(case["group"]) + if refused: + return refused + claims, schedules = judge(g, [], case["claims"]) + c = schedules.get(case["bearer_id"]) + if any(label.startswith("reject step=5 ") for label in claims) and not drops("inband_chain"): + result = "inband_chain_incomplete" + elif c is None: + result = "inband_not_scheduled" + elif not drops("inband_log") and not key_log_held(c, case["logs"]): + result = "inband_key_log_missing" + else: + result = "suffices" + return { + "outcome": "inband", + "claims": claims, + "set": result, + "inband_ms": interval(c["body"]) if result == "suffices" else None, + } + + # ------------------------------------------------------------------ the corpus def strings(v, out): @@ -377,7 +485,7 @@ def claim_outcome(wire): def check(doc, quiet=False): """The failures of a corpus document: each case's outcome, and every reason of §9.""" fails = [] - for kind, run in (("verdicts", verdict), ("claims", lambda c: claim_outcome(c["claim"])), ("plans", plan)): + for kind, run in (("verdicts", verdict), ("claims", lambda c: claim_outcome(c["claim"])), ("plans", plan), ("inband", inband)): for c in doc[kind]: try: got = run(c) @@ -390,7 +498,7 @@ def check(doc, quiet=False): if not quiet: print(f"FAIL {c['name']}\n stated {json.dumps(c['outcome'])}\n got {json.dumps(got)}") stated = [] - for kind in ("verdicts", "claims", "plans"): + for kind in ("verdicts", "claims", "plans", "inband"): for c in doc[kind]: strings(c["outcome"], stated) for code in reasons_table(): @@ -402,7 +510,7 @@ def check(doc, quiet=False): def mutations(doc): """Copies of the corpus, one defect each, every one of which must fail.""" def case(d, name): - return next(c for k in ("verdicts", "claims", "plans") for c in d[k] if c["name"] == name) + return next(c for k in ("verdicts", "claims", "plans", "inband") for c in d[k] if c["name"] == name) def entry(c, i): w = json.loads(c["claims"][i]) @@ -443,11 +551,37 @@ def mutations(doc): def m_reason_gone(d): d["verdicts"].remove(case(d, "schedule_on_bidirectional")) - return [m_pass, m_bytes, m_failure, m_loss, m_repair, m_statement, m_plan, m_held, m_accept, m_reason_gone] + def m_extended_label(d): + case(d, "extension_adds_passes")["outcome"]["claims"][1] = "stands" + + def m_extended_pass(d): + # Under the first schedule's five passes the object is not within the schedule. + c = case(d, "extension_adds_passes") + c["claims"].pop() + + def m_withdrawn(d): + # The same schedules in the order that extends: nothing is contradicted. + c = case(d, "extension_withdraws_passes") + c["claims"][1], c["claims"][2] = c["claims"][2], c["claims"][1] + + def m_interval(d): + case(d, "suffices")["outcome"]["inband_ms"] = 20_000 + + def m_set(d): + case(d, "key_log_absent")["logs"] = case(d, "suffices")["logs"] + + def m_set_reason_gone(d): + d["inband"] = [c for c in d["inband"] if c["outcome"].get("set") != "inband_chain_incomplete"] + + return [m_pass, m_bytes, m_failure, m_loss, m_repair, m_statement, m_plan, m_held, m_accept, m_reason_gone, + m_extended_label, m_extended_pass, m_withdrawn, m_interval, m_set, m_set_reason_gone] WEAKENINGS = ["subject", "signer", "range", "before", "content", "length", "no_code_loss", "schedule_contradiction", - "undeclared", "bidirectional", "deadline", "holding", "late_pass", "again"] + "undeclared", "bidirectional", "deadline", "holding", "late_pass", "again", "extension_count", + "extension_one_pass", "extension_period", "extension_members", "extension_drops", "extension_chain", + "extension_last", "interval_one_pass", "inband_chain", "inband_log", "inband_log_held", + "inband_log_lists"] def main(argv): @@ -462,8 +596,8 @@ def main(argv): fails.append(f"files the corpus does not hold: {extra}") if len(K_PRIME) != 477 or any(a >= b for a, b in zip(K_PRIME, K_PRIME[1:])) or K_PRIME[-1] != CV.K_PRIME_MAX: fails.append("Appendix A is not 477 increasing values ending at K'max") - print(f"{len(doc['verdicts'])} verdict cases, {len(doc['claims'])} claim cases, {len(doc['plans'])} plans: " - f"{len(fails)} failure(s)") + print(f"{len(doc['verdicts'])} verdict cases, {len(doc['claims'])} claim cases, {len(doc['plans'])} plans, " + f"{len(doc['inband'])} in-band sets: {len(fails)} failure(s)") caught = 0 for m in mutations(doc): d = copy.deepcopy(doc) diff --git a/wai/live-conformance/timeliness/README.md b/wai/live-conformance/timeliness/README.md index 25ba2748a..97e96de5c 100644 --- a/wai/live-conformance/timeliness/README.md +++ b/wai/live-conformance/timeliness/README.md @@ -44,7 +44,7 @@ give entry 0 the ladder E's object 0 at 700,000, then F's object 0 at 400,000. string `from_ms`; the `sources` in the asker's order, each exactly `{kind: "bearer", bearer_id}`, `{kind: "holder", holder, fetch_ms}` or `{kind: "origin", fetch_ms}`; and the `wanted` objects, each `{group, index}`. `outcome` is `refuse reason=R`, or gives `claims` (`accepted`, - `declared`, `stands`, `set-aside reason=…`, `reject step=N reason=R`), `records` as a verdict's, + `declared`, `stands`, `extended`, `set-aside reason=…`, `reject step=N reason=R`), `records` as a verdict's, and `choices`, one for each wanted object: `{outcome, object, rung, source, arrival_ms, value_ppm}`, with `object` `primary`, `fallback` or `null`, `rung` the rung's index in the ladder or `null` unless `object` is `fallback`, and `source` an index into `sources` or `null`, or diff --git a/wai/live-conformance/timeliness/vectors.json b/wai/live-conformance/timeliness/vectors.json index 996367738..6e30a47ed 100644 --- a/wai/live-conformance/timeliness/vectors.json +++ b/wai/live-conformance/timeliness/vectors.json @@ -25138,6 +25138,500 @@ ] } }, + { + "name": "plan_bearer_extended", + "description": "Two passes on b2, too few for the 12 symbols a receiver needs, then a schedule that extends them to three (carousel §4.5): the plan reads the later, and its third pass delivers.", + "groups": [ + { + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "5116003ac503950c81dfc052a39bc612253c26c47365002c7e8cc4417d832854", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "d98365c5b17c464dd12fd265dafafd865e6bdb35cb2c8c74edde350141351b3d339fd1c0335284d8de6c732470a25fb50c3ba9de7e162fad3cbf27de2787ab0b", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b6cff9df0cc7e095f5a791af0005891f729d2ba6653329d54e43a50ee727dc2a", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ebb41fe2c242ef9ac96097b604f21edf4909c38c59de8acb7ee5ba3bf0a10f84", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9ed9722b13b5e402b6cf5470334373c69e98b67ec6585699bac138556185a676", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "8bb4da0c2cb426bd34587725eff2b74de6474a97c89c686c64da37fd78ac381c", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "a74ab6d28619c8f9e790515335203449d15bca68790a4f5f391948802c880598", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + }, + { + "group": { + "kind": "group", + "track_alias": 2, + "group_id": 1, + "root_hash": "ba334ac4d539a1c0427a40d60a74c810f49bd442713792413c3c548daa737895", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "f1fc64ae9d0c7e2ec48c7014bde8b3b2ae74534aa95a9b8f3425d7ed2b4cc9c48c22f38752768d20df46af61ea41af2d7db4d88723cb23092a05fb3728a8550f", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 0, + "content_hash": "88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "03f962e3d88a5020626189c6859faead4fff1e8aed23da07dc3cca73b9f9164c", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 1, + "content_hash": "e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d64c0598e9d303636a1027130702454185ec050052bafbad19832de1609fd519", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 2, + "content_hash": "72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d01cb552784a637f37f219adb1df04092b137f8cdc114c77500a71bdd3fcf1ab", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 3, + "content_hash": "fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "16b40b2636aa92631fc390988fde3d962498778aad3f5aa24e65df9e5488e442", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:bearer:b2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"58b54fd153243aedeefd82be37877fd57b643a11c9e21d55cfa83438e1b4c4b8a581b40a25fea15f914cec3a10177dde6f2bc92d99ca2cd0adc17c218db58503\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"de9e3cacab9cc54b987b3229c01bc94568b292c6abf3d518f2656d7b014a0fb1\",\"seq\":1,\"sig\":\"9ab19fba269c1f6fe3004413dae2607df0172111ebdb8cc86da7f2a615192678901ac3095c79b2fe85a44f5438e29fae1f0e4d02998a3764307d3f3fb0312c00\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"93a1d7834af759d94eede3072cf48a55fbe3882da57338ddbe53ffdfb1c0e306\",\"seq\":2,\"sig\":\"e4bd3f152bc34fadaefcb40395b252ebaab055a12d13197addb9ccf0e95c1f3f631c0e9fac3e095f37da6fa5dc8f040760974e849e241fcd4216f23486118a01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793664060000,\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"decay\":[{\"at_ms\":1793664062000,\"value_ppm\":600000},{\"at_ms\":1793664070000,\"value_ppm\":0}],\"fallback\":{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":0,\"value_ppm\":400000},\"from_ms\":1793664000000,\"leaf_index\":0},{\"by_ms\":1793664060000,\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"decay\":[{\"at_ms\":1793664060001,\"value_ppm\":0}],\"fallback\":null,\"from_ms\":1793664000000,\"leaf_index\":1},{\"by_ms\":1793664060000,\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"decay\":[{\"at_ms\":1793664061000,\"value_ppm\":700000},{\"at_ms\":1793664065000,\"value_ppm\":700000},{\"at_ms\":1793664066000,\"value_ppm\":0}],\"fallback\":{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":2,\"value_ppm\":1000000},\"from_ms\":1793664000000,\"leaf_index\":2}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"843018bba93161285f14877a0347d593730a2ac339a69ada9a4f5cee631893f0\",\"seq\":3,\"sig\":\"032a11d5c8d5ded7ab1c5007fe0e03699baec43b60209db987d0e4521954217feea70bf11f05e48bd4aa4b2dc446b0ccff9d6829b1f1e0c1d3808ae211899709\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}" + ], + "records": [ + "5748443101c050c5637a44fa8629fff3cccce2300cb362a63d99d95fc54145266f4332445a000001a19eb4a000000001a19eeb8e80000000010fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd000000000000000401e2cbf64f5bfcb254418b4aa615fa7ce4527285eeacb78f979bcd787e6ff469cc7b4a2997f7d225529191f11ad500e2a486ea46bb377a966cc1cacf768a75eb01" + ], + "loss_ppm": 500000, + "overhead": 2, + "at_ms": 1793664000000, + "sources": [ + { + "kind": "bearer", + "bearer_id": "urn:example:bearer:b2" + } + ], + "wanted": [ + { + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0 + } + ], + "outcome": { + "claims": [ + "declared", + "extended", + "stands", + "accepted" + ], + "records": [ + "stands" + ], + "choices": [ + { + "outcome": "on_time", + "object": "primary", + "rung": null, + "source": 0, + "arrival_ms": 1793664021000, + "value_ppm": 1000000 + } + ] + } + }, + { + "name": "plan_bearer_withdrawn", + "description": "The same two schedules in the other order: the later withdraws a pass, both are set aside, and no source.", + "groups": [ + { + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "5116003ac503950c81dfc052a39bc612253c26c47365002c7e8cc4417d832854", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "d98365c5b17c464dd12fd265dafafd865e6bdb35cb2c8c74edde350141351b3d339fd1c0335284d8de6c732470a25fb50c3ba9de7e162fad3cbf27de2787ab0b", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b6cff9df0cc7e095f5a791af0005891f729d2ba6653329d54e43a50ee727dc2a", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ebb41fe2c242ef9ac96097b604f21edf4909c38c59de8acb7ee5ba3bf0a10f84", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9ed9722b13b5e402b6cf5470334373c69e98b67ec6585699bac138556185a676", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "8bb4da0c2cb426bd34587725eff2b74de6474a97c89c686c64da37fd78ac381c", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "a74ab6d28619c8f9e790515335203449d15bca68790a4f5f391948802c880598", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + }, + { + "group": { + "kind": "group", + "track_alias": 2, + "group_id": 1, + "root_hash": "ba334ac4d539a1c0427a40d60a74c810f49bd442713792413c3c548daa737895", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "f1fc64ae9d0c7e2ec48c7014bde8b3b2ae74534aa95a9b8f3425d7ed2b4cc9c48c22f38752768d20df46af61ea41af2d7db4d88723cb23092a05fb3728a8550f", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 0, + "content_hash": "88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "03f962e3d88a5020626189c6859faead4fff1e8aed23da07dc3cca73b9f9164c", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 1, + "content_hash": "e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d64c0598e9d303636a1027130702454185ec050052bafbad19832de1609fd519", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 2, + "content_hash": "72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d01cb552784a637f37f219adb1df04092b137f8cdc114c77500a71bdd3fcf1ab", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 3, + "content_hash": "fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "16b40b2636aa92631fc390988fde3d962498778aad3f5aa24e65df9e5488e442", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:bearer:b2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"58b54fd153243aedeefd82be37877fd57b643a11c9e21d55cfa83438e1b4c4b8a581b40a25fea15f914cec3a10177dde6f2bc92d99ca2cd0adc17c218db58503\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"de9e3cacab9cc54b987b3229c01bc94568b292c6abf3d518f2656d7b014a0fb1\",\"seq\":1,\"sig\":\"6efa2675f4e7c6abf93ebb28347f0249af03429c23f4f8bf61a08ca567341c0db03c11cfd47a102ed1843a70c26be94407a4e2782b0bfb0ca0fa0d1520a36609\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"ef6316241cf79f75a69a671aa9dfdd8e0694d940d07bd4f915840382eaf42d80\",\"seq\":2,\"sig\":\"ebc7b60e032b4cf647ef8228ee3312b82078a96a3ffcbaf8200843cb90dd2bb87954878c67b89f2e987e97abd4fa0c5ad285d4e1bc6c310d3d3e84ed03717f08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793664060000,\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"decay\":[{\"at_ms\":1793664062000,\"value_ppm\":600000},{\"at_ms\":1793664070000,\"value_ppm\":0}],\"fallback\":{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":0,\"value_ppm\":400000},\"from_ms\":1793664000000,\"leaf_index\":0},{\"by_ms\":1793664060000,\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"decay\":[{\"at_ms\":1793664060001,\"value_ppm\":0}],\"fallback\":null,\"from_ms\":1793664000000,\"leaf_index\":1},{\"by_ms\":1793664060000,\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"decay\":[{\"at_ms\":1793664061000,\"value_ppm\":700000},{\"at_ms\":1793664065000,\"value_ppm\":700000},{\"at_ms\":1793664066000,\"value_ppm\":0}],\"fallback\":{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":2,\"value_ppm\":1000000},\"from_ms\":1793664000000,\"leaf_index\":2}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"bfca4a9ecab8cc6d7a377500f2a14d85422eb5eb4ec9f284b6698622274349b6\",\"seq\":3,\"sig\":\"b3a7c0888cc641123260956ef0cbeb6bcaff11063fffb9a3db35fbe5ce40b5e47be22c3209eb6df3bb37db05aeb23e4190ff86bea2a60fcabb5f6485ae66230c\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}" + ], + "records": [ + "5748443101c050c5637a44fa8629fff3cccce2300cb362a63d99d95fc54145266f4332445a000001a19eb4a000000001a19eeb8e80000000010fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd000000000000000401e2cbf64f5bfcb254418b4aa615fa7ce4527285eeacb78f979bcd787e6ff469cc7b4a2997f7d225529191f11ad500e2a486ea46bb377a966cc1cacf768a75eb01" + ], + "loss_ppm": 500000, + "overhead": 2, + "at_ms": 1793664000000, + "sources": [ + { + "kind": "bearer", + "bearer_id": "urn:example:bearer:b2" + } + ], + "wanted": [ + { + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0 + } + ], + "outcome": { + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted", + "accepted" + ], + "records": [ + "stands" + ], + "choices": [ + { + "outcome": "no_source", + "object": null, + "rung": null, + "source": null, + "arrival_ms": null, + "value_ppm": 0 + } + ] + } + }, { "name": "wanted_without_intent", "description": "Object 3, which no entry states.", @@ -28198,6 +28692,745 @@ ] } }, + { + "name": "ladder_rung_on_extended_schedule", + "description": "The primary six seconds late (300,000), no route to rung 0, and rung 1 on b2 under a schedule extended from two passes to three: the plan reads the later, and rung 1 arrives at T0 + 21 s.", + "groups": [ + { + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "5116003ac503950c81dfc052a39bc612253c26c47365002c7e8cc4417d832854", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "d98365c5b17c464dd12fd265dafafd865e6bdb35cb2c8c74edde350141351b3d339fd1c0335284d8de6c732470a25fb50c3ba9de7e162fad3cbf27de2787ab0b", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b6cff9df0cc7e095f5a791af0005891f729d2ba6653329d54e43a50ee727dc2a", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ebb41fe2c242ef9ac96097b604f21edf4909c38c59de8acb7ee5ba3bf0a10f84", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9ed9722b13b5e402b6cf5470334373c69e98b67ec6585699bac138556185a676", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "8bb4da0c2cb426bd34587725eff2b74de6474a97c89c686c64da37fd78ac381c", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "a74ab6d28619c8f9e790515335203449d15bca68790a4f5f391948802c880598", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + }, + { + "group": { + "kind": "group", + "track_alias": 2, + "group_id": 1, + "root_hash": "ba334ac4d539a1c0427a40d60a74c810f49bd442713792413c3c548daa737895", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "f1fc64ae9d0c7e2ec48c7014bde8b3b2ae74534aa95a9b8f3425d7ed2b4cc9c48c22f38752768d20df46af61ea41af2d7db4d88723cb23092a05fb3728a8550f", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 0, + "content_hash": "88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "03f962e3d88a5020626189c6859faead4fff1e8aed23da07dc3cca73b9f9164c", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 1, + "content_hash": "e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d64c0598e9d303636a1027130702454185ec050052bafbad19832de1609fd519", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 2, + "content_hash": "72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d01cb552784a637f37f219adb1df04092b137f8cdc114c77500a71bdd3fcf1ab", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 3, + "content_hash": "fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "16b40b2636aa92631fc390988fde3d962498778aad3f5aa24e65df9e5488e442", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:bearer:b2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6abf5ccd2727b43918ba2505a7351e6f54d5c3ea7796a4630c5697fbd877f91d11a57a8511734761e0bd49582812a17673ba064f5a89cde44664e97159a4030d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"af5eacf49d0b0c8822d1adee7999283fd4384be3ef8b401454be00a4f2741dee\",\"seq\":1,\"sig\":\"1a53aa110698113fea2fb1c67041da57b5ac707b42eb6d71beae7e2d49ccf802ef6499479636ad218991ef27658cf5c328a8b9ec938d71aab4401d1c6d876e07\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"11bdcd37fac44cf5bf80e4845ab1958e4cbf477505726bd733b21393a7edcf58\",\"seq\":2,\"sig\":\"c05564c6ed024f6b8f1c36bdc03dba672a4e1ef08cf450e05e25fcd393ac7596ee5728eeea066334f2a6421bfddb418abf1335242df319f85abdaa4565604c08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793664060000,\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"decay\":[{\"at_ms\":1793664062000,\"value_ppm\":600000},{\"at_ms\":1793664070000,\"value_ppm\":0}],\"fallback\":[{\"content_hash\":\"8ea69524a61cea107c409aae6154f9d0bcfd178ef2b5d6ec010cfdecf30cba9b\",\"group\":\"af51dc1032eea6acb074046899974c977e6c1ca0d2dd018ee80f75e2eb6fc4fd\",\"leaf_index\":0,\"value_ppm\":700000},{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":0,\"value_ppm\":400000}],\"from_ms\":1793664000000,\"leaf_index\":0}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"bc4d028f087179ad83296d85c9fbb9e2472f584007a03f8f1375dfa6fd2d4e72\",\"seq\":3,\"sig\":\"7520c76e3060fcaaaa50976d63f6e6c31089c5bf03f27b771c02d8d41f31ffccd170efda98eca769c2806ee24202b749ee3ea9ba881996812d4413261f1cf60a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}" + ], + "records": [], + "loss_ppm": 500000, + "overhead": 2, + "at_ms": 1793664000000, + "sources": [ + { + "kind": "origin", + "fetch_ms": 66000 + }, + { + "kind": "bearer", + "bearer_id": "urn:example:bearer:b2" + } + ], + "wanted": [ + { + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0 + } + ], + "outcome": { + "claims": [ + "declared", + "extended", + "stands", + "accepted" + ], + "records": [], + "choices": [ + { + "outcome": "replaced", + "object": "fallback", + "rung": 1, + "source": 1, + "arrival_ms": 1793664021000, + "value_ppm": 400000 + } + ] + } + }, + { + "name": "ladder_rung_on_withdrawn_schedule", + "description": "The same two schedules in the other order: the later withdraws a pass, both are set aside, b2 delivers no rung, and the late primary is taken.", + "groups": [ + { + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "5116003ac503950c81dfc052a39bc612253c26c47365002c7e8cc4417d832854", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "d98365c5b17c464dd12fd265dafafd865e6bdb35cb2c8c74edde350141351b3d339fd1c0335284d8de6c732470a25fb50c3ba9de7e162fad3cbf27de2787ab0b", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b6cff9df0cc7e095f5a791af0005891f729d2ba6653329d54e43a50ee727dc2a", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ebb41fe2c242ef9ac96097b604f21edf4909c38c59de8acb7ee5ba3bf0a10f84", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9ed9722b13b5e402b6cf5470334373c69e98b67ec6585699bac138556185a676", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "8bb4da0c2cb426bd34587725eff2b74de6474a97c89c686c64da37fd78ac381c", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "a74ab6d28619c8f9e790515335203449d15bca68790a4f5f391948802c880598", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + }, + { + "group": { + "kind": "group", + "track_alias": 2, + "group_id": 1, + "root_hash": "ba334ac4d539a1c0427a40d60a74c810f49bd442713792413c3c548daa737895", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "f1fc64ae9d0c7e2ec48c7014bde8b3b2ae74534aa95a9b8f3425d7ed2b4cc9c48c22f38752768d20df46af61ea41af2d7db4d88723cb23092a05fb3728a8550f", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 0, + "content_hash": "88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "03f962e3d88a5020626189c6859faead4fff1e8aed23da07dc3cca73b9f9164c", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 1, + "content_hash": "e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d64c0598e9d303636a1027130702454185ec050052bafbad19832de1609fd519", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 2, + "content_hash": "72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d01cb552784a637f37f219adb1df04092b137f8cdc114c77500a71bdd3fcf1ab", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 3, + "content_hash": "fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "16b40b2636aa92631fc390988fde3d962498778aad3f5aa24e65df9e5488e442", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:bearer:b2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6abf5ccd2727b43918ba2505a7351e6f54d5c3ea7796a4630c5697fbd877f91d11a57a8511734761e0bd49582812a17673ba064f5a89cde44664e97159a4030d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"af5eacf49d0b0c8822d1adee7999283fd4384be3ef8b401454be00a4f2741dee\",\"seq\":1,\"sig\":\"9b5a4590e81c4834995271bbe99420d37407d134219dc90fec2b7004052b8065223d2bb8fa94ca9b7d57954b390e56da00c932cd434c27b7909bf2df3341cc05\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"52861fd7ec290c74c18661a949567f67d7dc50519146f3ccb64416584b596605\",\"seq\":2,\"sig\":\"c3fa93763c60e58a368da97725144e812165b05831d95ef14adde2989e90f4f91e576762a45270cd32fbe3ec61cfdd59941b35822fba1e45ed46c9b6bfc03506\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793664060000,\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"decay\":[{\"at_ms\":1793664062000,\"value_ppm\":600000},{\"at_ms\":1793664070000,\"value_ppm\":0}],\"fallback\":[{\"content_hash\":\"8ea69524a61cea107c409aae6154f9d0bcfd178ef2b5d6ec010cfdecf30cba9b\",\"group\":\"af51dc1032eea6acb074046899974c977e6c1ca0d2dd018ee80f75e2eb6fc4fd\",\"leaf_index\":0,\"value_ppm\":700000},{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":0,\"value_ppm\":400000}],\"from_ms\":1793664000000,\"leaf_index\":0}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"494a9086ad7b4c15ec6b5b10b25a2c6d1618825e017d2e374413738beed800fb\",\"seq\":3,\"sig\":\"38700ae85ee1d7ccbcaa37022e0d34d68c14543a875c6661d440c7f3750da2b8c215b6cb17c136de295c5e131974f228aa709d3e1049346b6d5c67164f5d950d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}" + ], + "records": [], + "loss_ppm": 500000, + "overhead": 2, + "at_ms": 1793664000000, + "sources": [ + { + "kind": "origin", + "fetch_ms": 66000 + }, + { + "kind": "bearer", + "bearer_id": "urn:example:bearer:b2" + } + ], + "wanted": [ + { + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0 + } + ], + "outcome": { + "claims": [ + "declared", + "set-aside reason=schedule_contradicted", + "set-aside reason=schedule_contradicted", + "accepted" + ], + "records": [], + "choices": [ + { + "outcome": "after_deadline", + "object": "primary", + "rung": null, + "source": 0, + "arrival_ms": 1793664066000, + "value_ppm": 300000 + } + ] + } + }, + { + "name": "ladder_rung_before_extension", + "description": "The earlier schedule alone, its two passes too few: no rung arrives, so the extension above is what brings rung 1 in reach.", + "groups": [ + { + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "5116003ac503950c81dfc052a39bc612253c26c47365002c7e8cc4417d832854", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "d98365c5b17c464dd12fd265dafafd865e6bdb35cb2c8c74edde350141351b3d339fd1c0335284d8de6c732470a25fb50c3ba9de7e162fad3cbf27de2787ab0b", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b6cff9df0cc7e095f5a791af0005891f729d2ba6653329d54e43a50ee727dc2a", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ebb41fe2c242ef9ac96097b604f21edf4909c38c59de8acb7ee5ba3bf0a10f84", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9ed9722b13b5e402b6cf5470334373c69e98b67ec6585699bac138556185a676", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "8bb4da0c2cb426bd34587725eff2b74de6474a97c89c686c64da37fd78ac381c", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "a74ab6d28619c8f9e790515335203449d15bca68790a4f5f391948802c880598", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + }, + { + "group": { + "kind": "group", + "track_alias": 2, + "group_id": 1, + "root_hash": "ba334ac4d539a1c0427a40d60a74c810f49bd442713792413c3c548daa737895", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "f1fc64ae9d0c7e2ec48c7014bde8b3b2ae74534aa95a9b8f3425d7ed2b4cc9c48c22f38752768d20df46af61ea41af2d7db4d88723cb23092a05fb3728a8550f", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 0, + "content_hash": "88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "03f962e3d88a5020626189c6859faead4fff1e8aed23da07dc3cca73b9f9164c", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 1, + "content_hash": "e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d64c0598e9d303636a1027130702454185ec050052bafbad19832de1609fd519", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 2, + "content_hash": "72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d01cb552784a637f37f219adb1df04092b137f8cdc114c77500a71bdd3fcf1ab", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 3, + "content_hash": "fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "16b40b2636aa92631fc390988fde3d962498778aad3f5aa24e65df9e5488e442", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:bearer:b2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6abf5ccd2727b43918ba2505a7351e6f54d5c3ea7796a4630c5697fbd877f91d11a57a8511734761e0bd49582812a17673ba064f5a89cde44664e97159a4030d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"af5eacf49d0b0c8822d1adee7999283fd4384be3ef8b401454be00a4f2741dee\",\"seq\":1,\"sig\":\"1a53aa110698113fea2fb1c67041da57b5ac707b42eb6d71beae7e2d49ccf802ef6499479636ad218991ef27658cf5c328a8b9ec938d71aab4401d1c6d876e07\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793664060000,\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"decay\":[{\"at_ms\":1793664062000,\"value_ppm\":600000},{\"at_ms\":1793664070000,\"value_ppm\":0}],\"fallback\":[{\"content_hash\":\"8ea69524a61cea107c409aae6154f9d0bcfd178ef2b5d6ec010cfdecf30cba9b\",\"group\":\"af51dc1032eea6acb074046899974c977e6c1ca0d2dd018ee80f75e2eb6fc4fd\",\"leaf_index\":0,\"value_ppm\":700000},{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":0,\"value_ppm\":400000}],\"from_ms\":1793664000000,\"leaf_index\":0}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"11bdcd37fac44cf5bf80e4845ab1958e4cbf477505726bd733b21393a7edcf58\",\"seq\":2,\"sig\":\"2fba5711a65eec8bb322a2b6c685727cc7757640a39b1d30aa49d5644fc52ffa5893b179c057bd823efc60dc8ce0ba075519b647304949dcb696ec8613b19605\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}" + ], + "records": [], + "loss_ppm": 500000, + "overhead": 2, + "at_ms": 1793664000000, + "sources": [ + { + "kind": "origin", + "fetch_ms": 66000 + }, + { + "kind": "bearer", + "bearer_id": "urn:example:bearer:b2" + } + ], + "wanted": [ + { + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0 + } + ], + "outcome": { + "claims": [ + "declared", + "stands", + "accepted" + ], + "records": [], + "choices": [ + { + "outcome": "after_deadline", + "object": "primary", + "rung": null, + "source": 0, + "arrival_ms": 1793664066000, + "value_ppm": 300000 + } + ] + } + }, { "name": "sources_empty", "description": "No source.", @@ -37730,6 +38963,283 @@ ] } }, + { + "name": "run_ladder_rung_on_extended_schedule", + "description": "Rung 1 on b2 under a schedule extended from two passes to three: fetched from T0, held at the end of the third, presented at the deadline at 400,000.", + "groups": [ + { + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "5116003ac503950c81dfc052a39bc612253c26c47365002c7e8cc4417d832854", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "d98365c5b17c464dd12fd265dafafd865e6bdb35cb2c8c74edde350141351b3d339fd1c0335284d8de6c732470a25fb50c3ba9de7e162fad3cbf27de2787ab0b", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b6cff9df0cc7e095f5a791af0005891f729d2ba6653329d54e43a50ee727dc2a", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "ebb41fe2c242ef9ac96097b604f21edf4909c38c59de8acb7ee5ba3bf0a10f84", + "44947b3c416d6c6c25df1a61644b6e0f5c17e3dcb0656158148246f84ad6bfc6" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9ed9722b13b5e402b6cf5470334373c69e98b67ec6585699bac138556185a676", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "8bb4da0c2cb426bd34587725eff2b74de6474a97c89c686c64da37fd78ac381c", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "a74ab6d28619c8f9e790515335203449d15bca68790a4f5f391948802c880598", + "5321faf206eaac0f5311329de0719e62ad6f251872273fb558699b4ab5c5d501" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + }, + { + "group": { + "kind": "group", + "track_alias": 2, + "group_id": 1, + "root_hash": "ba334ac4d539a1c0427a40d60a74c810f49bd442713792413c3c548daa737895", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T00:00:00.500Z", + "group_end": "2026-11-03T00:01:00Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "f1fc64ae9d0c7e2ec48c7014bde8b3b2ae74534aa95a9b8f3425d7ed2b4cc9c48c22f38752768d20df46af61ea41af2d7db4d88723cb23092a05fb3728a8550f", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 0, + "content_hash": "88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "03f962e3d88a5020626189c6859faead4fff1e8aed23da07dc3cca73b9f9164c", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 1, + "content_hash": "e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d64c0598e9d303636a1027130702454185ec050052bafbad19832de1609fd519", + "12e951cc2da4d22bc13d31e861bd1ea3c1dd7d609de2b974727d382fb973e4bc" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 2, + "content_hash": "72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "d01cb552784a637f37f219adb1df04092b137f8cdc114c77500a71bdd3fcf1ab", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 2, + "group_id": 1, + "object_id": 3, + "content_hash": "fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "16b40b2636aa92631fc390988fde3d962498778aad3f5aa24e65df9e5488e442", + "7acc29c87b1f779c5086302849936c6a73fbe7ef78a815ab69617032265f301b" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ] + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:bearer:b2\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6abf5ccd2727b43918ba2505a7351e6f54d5c3ea7796a4630c5697fbd877f91d11a57a8511734761e0bd49582812a17673ba064f5a89cde44664e97159a4030d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":2,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"af5eacf49d0b0c8822d1adee7999283fd4384be3ef8b401454be00a4f2741dee\",\"seq\":1,\"sig\":\"1a53aa110698113fea2fb1c67041da57b5ac707b42eb6d71beae7e2d49ccf802ef6499479636ad218991ef27658cf5c328a8b9ec938d71aab4401d1c6d876e07\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:bearer:b2\",\"objects\":[{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"e47047301c6d03c8d51af5ba2e548f8cef04e1546166f3a379f338f1fb524233\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2},{\"content_hash\":\"fc2a85938172f09d90f53b6e69972be4355e6d6589bd8234e66256a481c4a468\",\"count\":3,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793664000000,\"leaf_index\":3,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":128,\"transfer_length\":1024},\"period_ms\":10000,\"repair\":2}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"11bdcd37fac44cf5bf80e4845ab1958e4cbf477505726bd733b21393a7edcf58\",\"seq\":2,\"sig\":\"c05564c6ed024f6b8f1c36bdc03dba672a4e1ef08cf450e05e25fcd393ac7596ee5728eeea066334f2a6421bfddb418abf1335242df319f85abdaa4565604c08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793664060000,\"content_hash\":\"fae6c4a5af86f9eb5c9e46fc70dcb54e54055973233d494c52a814dbc966d681\",\"decay\":[{\"at_ms\":1793664062000,\"value_ppm\":600000},{\"at_ms\":1793664070000,\"value_ppm\":0}],\"fallback\":[{\"content_hash\":\"8ea69524a61cea107c409aae6154f9d0bcfd178ef2b5d6ec010cfdecf30cba9b\",\"group\":\"af51dc1032eea6acb074046899974c977e6c1ca0d2dd018ee80f75e2eb6fc4fd\",\"leaf_index\":0,\"value_ppm\":700000},{\"content_hash\":\"88f129f8f4f586ce7c9f41e523f9da5b845184b140f834197163cbe4769f398b\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":0,\"value_ppm\":400000}],\"from_ms\":1793664000000,\"leaf_index\":0},{\"by_ms\":1793664060000,\"content_hash\":\"1505094533682ebdf34a75ad7885c2d47b7633893aca5518d8a283ca762a8fdb\",\"decay\":[{\"at_ms\":1793664060001,\"value_ppm\":0}],\"fallback\":null,\"from_ms\":1793664000000,\"leaf_index\":1},{\"by_ms\":1793664060000,\"content_hash\":\"60408416eb74524e26677b95ab8691d9304592c6c12e53ae335bed3c642a8cdd\",\"decay\":[{\"at_ms\":1793664061000,\"value_ppm\":700000},{\"at_ms\":1793664065000,\"value_ppm\":700000},{\"at_ms\":1793664066000,\"value_ppm\":0}],\"fallback\":{\"content_hash\":\"72af9b34c7bb604b4cb1b2de435852b7e7102a478a10bf49b6d0fcb44ebe196a\",\"group\":\"acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6\",\"leaf_index\":2,\"value_ppm\":1000000},\"from_ms\":1793664000000,\"leaf_index\":2}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T00:00:01Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"bc4d028f087179ad83296d85c9fbb9e2472f584007a03f8f1375dfa6fd2d4e72\",\"seq\":3,\"sig\":\"6cb95f207040dee8eeb49804fc0e87f06eb414e2d8eff7db03f73a3889e71405aeb017b12e99e120098c21c3ee397ed44c9555f4522597013b8b02bc0c78e001\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd\",\"subject_type\":\"receipt\"}" + ], + "records": [], + "loss_ppm": 500000, + "overhead": 2, + "plans": [ + { + "at_ms": 1793664000000, + "sources": [ + { + "kind": "origin", + "fetch_ms": 66000 + }, + { + "kind": "bearer", + "bearer_id": "urn:example:bearer:b2" + } + ], + "wanted": [ + { + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0 + } + ] + } + ], + "arrivals": [ + { + "group": "acad230ea19b86961195637127157e6eebff5603d0d5472c4df37f238045fcf6", + "index": 0, + "at_ms": 1793664021000 + } + ], + "outcome": { + "plans": [ + [ + { + "outcome": "replaced", + "object": "fallback", + "rung": 1, + "source": 1, + "arrival_ms": 1793664021000, + "value_ppm": 400000 + } + ] + ], + "decisions": [ + { + "at_ms": 1793664000000, + "plan": 0, + "action": "fetch", + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0, + "object": "fallback", + "rung": 1, + "source": 1, + "value_ppm": null + }, + { + "at_ms": 1793664060000, + "plan": 0, + "action": "present", + "group": "0fcab9a35f1480c3e84a4db478f3a6a69ebba9b0ef8541fe395c1382ede498bd", + "index": 0, + "object": "fallback", + "rung": 1, + "source": null, + "value_ppm": 400000 + } + ] + } + }, { "name": "run_no_plan", "description": "No plan.", diff --git a/wai/live-conformance/timeliness_verify.py b/wai/live-conformance/timeliness_verify.py index 9b6298e0e..136a1177a 100644 --- a/wai/live-conformance/timeliness_verify.py +++ b/wai/live-conformance/timeliness_verify.py @@ -573,7 +573,7 @@ def schedules_step(labels, accepted): schedules = {} for k, idx in by_instance("schedule").items(): bodies = [accepted[i]["body"] for i in idx] - if any(b != bodies[0] for b in bodies): + if not KV.monotone(bodies) and not drops("schedule_contradicted"): aside = "schedule_contradicted" elif k in contradicted: aside = "bearer_contradicted" @@ -583,10 +583,14 @@ def schedules_step(labels, accepted): aside = "schedule_on_bidirectional" else: aside = None + # The last of an instance's schedules is the one that stands (carousel §6.2 step 4). + last = bodies[0] if drops("schedule_last") else bodies[-1] for i in idx: - labels[i] = "stands" if aside is None else "set-aside reason=" + aside - if aside is None: - schedules[(accepted[i]["subject"], accepted[i]["body"]["bearer_id"])] = bodies[0] + if aside is not None: + labels[i] = "set-aside reason=" + aside + else: + labels[i] = "stands" if accepted[i]["body"] == last else "extended" + schedules[(accepted[i]["subject"], accepted[i]["body"]["bearer_id"])] = last return schedules @@ -991,6 +995,18 @@ def mutations(doc): def m_reason_gone(d): d["verdicts"].remove(case(d, "record_before_group")) + def m_extended(d): + case(d, "plan_bearer_extended")["outcome"]["claims"][1] = "stands" + + def m_withdrawn(d): + # The withdrawn pass's schedule given first and last alike: one body, which stands. + c = case(d, "plan_bearer_withdrawn") + c["claims"][2] = c["claims"][1] + + def m_rung_extended(d): + # The rung above the one the extended schedule reaches. + case(d, "ladder_rung_on_extended_schedule")["outcome"]["choices"][0]["rung"] = 0 + def m_rung_value(d): # The lower rung presented at the higher's value. case(d, "ladder_lower_rung_alone")["outcome"]["intents"][0]["lines"][0]["value_ppm"] = 700_000 @@ -1036,7 +1052,8 @@ def mutations(doc): d["runs"] = [c for c in d["runs"] if c["outcome"] != "refuse reason=arrivals_invalid"] return [m_instant, m_end, m_floor, m_accept, m_line, m_earliest, m_statement, m_envelope, m_order, m_deadline, - m_fetch, m_loss, m_from_ms, m_object, m_reason_gone, m_rung_value, m_rung_instant, m_rung_form, m_plan_rung, + m_fetch, m_loss, m_from_ms, m_object, m_reason_gone, m_extended, m_withdrawn, m_rung_extended, m_rung_value, + m_rung_instant, m_rung_form, m_plan_rung, m_arrival_late, m_arrival_gone, m_decision_value, m_decision_action, m_plan_dropped, m_plan_instant, m_decision_order, m_reason_gone_run] @@ -1046,7 +1063,8 @@ WEAKENINGS = ["subject", "signer", "range", "before", "same_second", "content", "least", "least_fallback", "own_statements", "key_order", "deadline_inclusive", "fallback_deadline", "sink_rule", "floor", "no_intent", "loss_bound", "overhead", "instant", "sources_empty", "sources_kind", "sources_uri", "sources_key", "sources_fetch", - "sources_twice", "sources_loss", "per_group", "undeclared", "bidirectional", "record_at_s", + "sources_twice", "sources_loss", "per_group", "schedule_contradicted", "schedule_last", "undeclared", + "bidirectional", "record_at_s", "holder_record", "plan_order", "fallback_value", "fallback_tie", "fallback_order", "plan_fallback_deadline", "late_zero", "late_tie", "rung_layer", "rung_position", "rung_derived", "rung_holders", "rung_order", diff --git a/wai/wai-rs/src/cache_authority.rs b/wai/wai-rs/src/cache_authority.rs index 4f63319f4..a0ef1ebdb 100644 --- a/wai/wai-rs/src/cache_authority.rs +++ b/wai/wai-rs/src/cache_authority.rs @@ -5,8 +5,9 @@ //! `cache/serve` in its operator's key log, and a node that declares a bearer instance of its own //! holds the class authority `cache-transmission`. This module places a server key by the heads a //! relying party names, in jwp-receipts' three levels ([`place`], §4.4); derives the bearer -//! verdict with the caches' instances beside the publisher's ([`verdict`], §7), the -//! `cache-transmission` claim's body and context checks being `crate::claim_receipt::bearer`'s; +//! verdict with the caches' instances and their schedules beside the publisher's ([`verdict`], +//! §5.6, §7), the `cache-transmission` claim's body and context checks being +//! `crate::claim_receipt::bearer`'s and a schedule's `crate::claim_receipt::schedule`'s; //! and counts, of a population of receiver keys stated for a region, how many held an object by a //! deadline on their own signed word ([`tally`], §8), read as timeliness' held-at statements. //! @@ -14,7 +15,9 @@ //! //! - A placement labels a server and never changes a verdict or a hit. //! - A cache's instance never makes a group `transmitted`, and a cache is credited per instance, -//! only for the objects it says it sent. +//! only for the objects it says it sent, whatever its schedule names. +//! - A node's schedule stands only beside the instance it declares, and another key's schedule of +//! that instance contradicts nothing. //! - Every instant a held-at statement gives is the latest its signed word allows, rounded up to //! the millisecond; a statement before its group is set aside, so a receiver whose clock was //! never set is never on time. @@ -29,6 +32,7 @@ use crate::bearer_receipts::{ self, per_receiver_upper_bound, Assertion, BearerLine, ClaimVerdict as BearerVerdict, Instance, Status, BEARER_CONTRADICTED, BEARER_NOT_DECLARED, DELIVERY_EXCEEDS_RECONCILED, DELIVERY_NOT_RECONCILED, }; +use crate::carousel::Statement; use crate::claim_receipt::schedule::LAST_INSTANT_MS; use crate::claim_receipt::{hex, Bearer, ClaimBody, ClaimReceipt, HeldGroup, Reason as ClaimReason, Rejection, TimelinessEntry}; use crate::holdings::{self, Holdings, RecordVerdict}; @@ -50,6 +54,7 @@ pub const CODES: &[&str] = &[ "cache_transmission_leaf_count_mismatch", "cache_transmission_objects_not_held", "cache_transmission_root_mismatch", + CACHE_SCHEDULE_SIGNER_MISMATCH, POPULATION_INVALID, TARGET_INVALID, OBJECT_NOT_VERIFIED, @@ -57,6 +62,7 @@ pub const CODES: &[&str] = &[ ]; pub const SERVER_NOT_LISTED: &str = "server_not_listed"; +pub const CACHE_SCHEDULE_SIGNER_MISMATCH: &str = "cache_schedule_signer_mismatch"; pub const POPULATION_INVALID: &str = "population_invalid"; pub const TARGET_INVALID: &str = "target_invalid"; pub const OBJECT_NOT_VERIFIED: &str = "object_not_verified"; @@ -211,12 +217,22 @@ pub fn window_instant(end_us: u64) -> (u64, u64) { // ───────────────────────────── §7: the verdict ───────────────────────────── -/// The inputs of §7.1: bearer-receipts §6.1's, with cache-transmission claims among the claims, -/// and the heads of §4.4, keyed by origin. +/// The inputs of §7.1: bearer-receipts §6.1's, with cache-transmission and schedule claims among +/// the claims, the heads of §4.4, keyed by origin, and optionally a statement of carousel §6.4. #[derive(Clone, Debug, Default)] pub struct Inputs { pub bearer: bearer_receipts::Inputs, pub heads: BTreeMap, + pub held: Option, +} + +/// A statement of carousel §6.4 offered about an instance, publisher's or node's, at a loss bound +/// and an overhead (§7.3). +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Held { + pub statement: Statement, + pub loss_ppm: u64, + pub overhead: u64, } /// What became of one claim (§7.2). @@ -226,6 +242,12 @@ pub enum ClaimVerdict { Bearer(BearerVerdict), /// A cache-transmission claim whose instance stands. CacheDeclared, + /// A schedule that stands: the publisher's beside its declaration (carousel §6.2 step 4), a + /// node's beside its own instance (§5.6). + Stands, + /// A schedule a later schedule of its instance, by the same signer, extends (carousel §4.5) + /// with another body. + Extended, } impl ClaimVerdict { @@ -233,6 +255,8 @@ impl ClaimVerdict { match self { ClaimVerdict::Bearer(v) => v.label(), ClaimVerdict::CacheDeclared => "cache-declared".into(), + ClaimVerdict::Stands => "stands".into(), + ClaimVerdict::Extended => "extended".into(), } } } @@ -276,6 +300,9 @@ pub struct Verdict { pub sink: Option<&'static str>, /// bearer-receipts §6.4: `Ok` when the statement holds. pub assertion: Option>, + /// Carousel §6.4 against the schedule that stands on the statement's instance (§7.3): `Ok` + /// when it holds. + pub held: Option>, } /// What [`judge`] keeps for the tally: the group, the accepted claims and the instances. @@ -320,11 +347,16 @@ fn judge(inp: &Inputs, count_only: Option<&[[u8; 32]]>) -> Result = receipts.iter().collect(); - // Step 2. + // Step 2. A schedule is checked against the object receipts and the envelopes held. + let parsed: Vec<(ObjectReceipt, Option<&[u8]>)> = + b.objects.iter().filter_map(|o| ObjectReceipt::from_json(&o.receipt).ok().map(|r| (r, o.envelope.as_deref()))).collect(); + let with_bytes: Vec<(&ObjectReceipt, Option<&[u8]>)> = parsed.iter().map(|(r, e)| (r, *e)).collect(); let checked = check_claims(&b.claims, |c| match &c.body { ClaimBody::Transmission(_) => c.check_transmission_against(&group), ClaimBody::Reconciliation(_) => c.check_reconciliation_against(&group, &refs), ClaimBody::CacheTransmission(_) => c.check_cache_transmission_against(&group, &refs), + ClaimBody::Schedule(_) if c.signer_pubkey == group.signer_pubkey => c.check_schedule_against(&group, &with_bytes), + ClaimBody::Schedule(_) => c.check_node_schedule_against(&group, &with_bytes), _ => Err(Rejection { step: 6, reason: ClaimReason::ContextMismatch }), }); let mut claims: Vec = Vec::with_capacity(checked.len()); @@ -334,6 +366,7 @@ fn judge(inp: &Inputs, count_only: Option<&[[u8; 32]]>) -> Result { claims.push(match &c.body { ClaimBody::CacheTransmission(_) => ClaimVerdict::CacheDeclared, + ClaimBody::Schedule(_) => ClaimVerdict::Stands, _ => ClaimVerdict::Bearer(BearerVerdict::Declared), }); accepted.push(Some(c)); @@ -394,6 +427,64 @@ fn judge(inp: &Inputs, count_only: Option<&[[u8; 32]]>) -> Result> = accepted + .iter() + .map(|c| { + c.as_ref() + .filter(|c| c.transmission().is_some() || (c.schedule().is_some() && c.signer_pubkey == group.signer_pubkey)) + .cloned() + }) + .collect(); + let of_publisher = crate::carousel::standing(&publisher); + let mut schedules: BTreeMap = of_publisher.schedules.clone(); + for (&i, &reason) in &of_publisher.aside { + if publisher[i].as_ref().and_then(ClaimReceipt::schedule).is_some() { + claims[i] = ClaimVerdict::Bearer(BearerVerdict::SetAside(reason)); + } + } + for &i in &of_publisher.extended { + claims[i] = ClaimVerdict::Extended; + } + let mut nodes: BTreeMap> = BTreeMap::new(); + for (i, c) in accepted.iter().enumerate() { + if let Some(s) = c.as_ref().filter(|c| c.signer_pubkey != group.signer_pubkey).and_then(ClaimReceipt::schedule) { + nodes.entry(s.bearer_id.clone()).or_default().push(i); + } + } + for (id, idx) in &nodes { + let aside = |claims: &mut Vec, idx: &[usize], reason: &'static str| { + for &i in idx { + claims[i] = ClaimVerdict::Bearer(BearerVerdict::SetAside(reason)); + } + }; + if by_instance.contains_key(id) || contradicted.contains(id) { + aside(&mut claims, idx, BEARER_CONTRADICTED); + continue; + } + let Some(of) = cache_standing.get(id) else { + aside(&mut claims, idx, BEARER_NOT_DECLARED); + continue; + }; + let server = accepted[of[0]].as_ref().expect("an accepted claim").signer_pubkey; + let (mine, others): (Vec, Vec) = + idx.iter().partition(|&&i| accepted[i].as_ref().is_some_and(|c| c.signer_pubkey == server)); + aside(&mut claims, &others, CACHE_SCHEDULE_SIGNER_MISMATCH); + if mine.is_empty() { + continue; + } + match crate::carousel::monotone(&accepted, &mine) { + Err(reason) => aside(&mut claims, &mine, reason), + Ok((last, extended)) => { + schedules.insert(id.clone(), last); + for i in extended { + claims[i] = ClaimVerdict::Extended; + } + } + } + } + // Step 5: the reconciliations, over the instances that stand. let mut instances: BTreeMap>)> = BTreeMap::new(); for (id, &i) in &standing { @@ -489,6 +580,12 @@ fn judge(inp: &Inputs, count_only: Option<&[[u8; 32]]>) -> Result) -> Result, obje }; let receipts: Vec = objects.iter().filter_map(|o| ObjectReceipt::from_json(o).ok()).collect(); let refs: Vec<&ObjectReceipt> = receipts.iter().collect(); - match c.check_cache_transmission_against(&group, &refs) { + let checked = match &c.body { + // A schedule by the group's key is the publisher's (carousel §4.3); by another, a node's + // (§5.6). No envelope is held here. + ClaimBody::Schedule(_) => { + let held: Vec<(&ObjectReceipt, Option<&[u8]>)> = refs.iter().map(|r| (*r, None)).collect(); + if c.signer_pubkey == group.signer_pubkey { + c.check_schedule_against(&group, &held) + } else { + c.check_node_schedule_against(&group, &held) + } + } + _ => c.check_cache_transmission_against(&group, &refs), + }; + match checked { Ok(()) => "accept".into(), Err(r) => reject(r), } diff --git a/wai/wai-rs/src/cache_authority/corpus.rs b/wai/wai-rs/src/cache_authority/corpus.rs index 07c15a1ce..f9f58df93 100644 --- a/wai/wai-rs/src/cache_authority/corpus.rs +++ b/wai/wai-rs/src/cache_authority/corpus.rs @@ -12,10 +12,11 @@ use super::*; use crate::bearer_receipts::HeldObject; use crate::claim_receipt::bearer::{ATTESTS_RECEIVED, ATTESTS_TRANSMITTED}; +use crate::claim_receipt::schedule::ATTESTS_SCHEDULED; use crate::claim_receipt::timeliness::ATTESTS_VALUED; use crate::claim_receipt::{ - unhex, CacheTransmissionClaim, DecayPoint, Fallback, ReconciliationClaim, SessionEnergy, SubjectType, TimelinessClaim, - TransmissionClaim, + unhex, CacheTransmissionClaim, DecayPoint, Esi, Fallback, Oti, ReconciliationClaim, ScheduleClaim, ScheduleEntry, SessionEnergy, SubjectType, + TimelinessClaim, TransmissionClaim, }; use crate::container::{Conditioning, DerivedFrom, Manifest, ModelRequirement, Wai}; use crate::energy_class::{CounterFiltering, EnergyProvenance, Uncertainty}; @@ -340,6 +341,41 @@ fn reconciliation(p: &Publication, bearer: Bearer, id: &str, idx: &[u64]) -> Cla }) } +/// When a schedule's first pass starts here: an hour after the group's. +const PASSES_FROM: u64 = START_MS + HOUR; + +/// An entry for object `i` of `p`: RaptorQ in one block of 16 source symbols of 128 octets (K′ 18) +/// and 8 repair symbols a pass, fresh symbols each pass, a pass of a second every ten seconds. A +/// receiver at overhead 2 needs 20 symbols, and within 30% gets 17 a pass (two passes), within 90% +/// gets 3 (seven passes). +fn schedule_entry(p: &Publication, i: usize, count: u64) -> ScheduleEntry { + ScheduleEntry { + leaf_index: i as u64, + content_hash: p.objects[i].1.content_hash, + oti: Oti::RaptorQ { transfer_length: LENGTH, symbol_size: 128, source_blocks: 1, sub_blocks: 1, alignment: 4 }, + repair: 8, + esi: Esi::Advance, + first_ms: PASSES_FROM, + period_ms: 10_000, + duration_ms: 1_000, + count, + } +} + +/// The end of pass `j` (from 1) of a [`schedule_entry`]. +fn pass_end(j: u64) -> u64 { + PASSES_FROM + (j - 1) * 10_000 + 1_000 +} + +fn schedule_body(id: &str, objects: Vec) -> ClaimBody { + ClaimBody::Schedule(ScheduleClaim { bearer_id: id.into(), objects, attests: ATTESTS_SCHEDULED.into() }) +} + +/// A schedule on `id` of the given objects of `p`, with `count` passes each. +fn schedule(p: &Publication, id: &str, objects: &[usize], count: u64) -> ClaimBody { + schedule_body(id, objects.iter().map(|&i| schedule_entry(p, i, count)).collect()) +} + /// P's timeliness claim about G: entries for `objects`, each of use from the group's start, by /// `by_ms`, a hard deadline. fn timeliness_claim(g: &Publication, objects: &[usize], by_ms: u64) -> String { @@ -379,7 +415,7 @@ impl Chains { fn time(body: &ClaimBody) -> &'static str { match body { ClaimBody::Transmission(_) => TRANSMITTED, - ClaimBody::CacheTransmission(_) => CACHE_SENT, + ClaimBody::CacheTransmission(_) | ClaimBody::Schedule(_) => CACHE_SENT, _ => RECONCILED, } } @@ -606,6 +642,89 @@ fn claim_cases(g: &Groups) -> Vec { vec![], "unchecked", ); + + // §5.6: a node's schedule of its own instance. + push( + "schedule_by_node", + "C1 schedules objects 1 and 3 of G on its instance: its key is not the group's, and carousel §4.3 otherwise holds.", + vec![], + one(C1, &g.g, schedule(&g.g, MESH_C1, &[1, 3], 3)), + ctx(&g.g), + all(&g.g), + "accept", + ); + let mut ch = Chains::default(); + let first = ch.sign(C1, g.g.link(), cache(&g.g, mc, MESH_C1, &[1, 3], None)); + let second = ch.sign(C1, g.g.link(), schedule(&g.g, MESH_C1, &[1, 3], 3)); + push( + "schedule_chained_after_its_claim", + "The same schedule, chained after C1's cache-transmission claim.", + vec![first], + second, + ctx(&g.g), + all(&g.g), + "accept", + ); + push( + "schedule_by_publisher", + "P's schedule of G is checked by carousel §4.3 whole.", + vec![], + one(P, &g.g, schedule(&g.g, SAT, &[1, 3], 3)), + ctx(&g.g), + all(&g.g), + "accept", + ); + push( + "schedule_node_other_group", + "C1's schedule names G9.", + vec![], + one(C1, &g.g9, schedule(&g.g9, MESH_C1, &[1, 3], 3)), + ctx(&g.g), + all(&g.g), + "reject step=6 reason=schedule_subject_mismatch", + ); + let mut past = schedule_entry(&g.g, 3, 3); + past.leaf_index = 4; + push( + "schedule_node_leaf_out_of_range", + "An entry for object 4 of a group of four.", + vec![], + one(C1, &g.g, schedule_body(MESH_C1, vec![past])), + ctx(&g.g), + all(&g.g), + "reject step=6 reason=schedule_leaf_out_of_range", + ); + let mut early = schedule_entry(&g.g, 1, 3); + early.first_ms = START_MS - 1_000; + push( + "schedule_node_before_group", + "A first pass a second before the group starts.", + vec![], + one(C1, &g.g, schedule_body(MESH_C1, vec![early])), + ctx(&g.g), + all(&g.g), + "reject step=6 reason=schedule_before_group", + ); + let mut wrong = schedule_entry(&g.g, 1, 3); + wrong.content_hash = g.g.objects[2].1.content_hash; + push( + "schedule_node_content", + "An entry for object 1 with object 2's content hash, its receipt held.", + vec![], + one(C1, &g.g, schedule_body(MESH_C1, vec![wrong])), + ctx(&g.g), + all(&g.g), + "reject step=6 reason=schedule_content_mismatch", + ); + push( + "schedule_node_no_passes", + "An entry of no passes: carousel §4.2 rule 3.3 holds for a node's schedule too.", + vec![], + bad(C1, &g.g, schedule(&g.g, MESH_C1, &[1], 0)), + ctx(&g.g), + all(&g.g), + "reject step=4 reason=schedule_passes_invalid", + ); out } @@ -697,10 +816,11 @@ struct Exp { caches: Vec, sink: Option<&'static str>, assertion: Option<&'static str>, + held: Option<&'static str>, } fn exp(claims: &[&'static str], status: &'static str) -> Exp { - Exp { claims: claims.to_vec(), status, sinks: 0, whole: 0, received_by: [0; 4], bearers: vec![], caches: vec![], sink: None, assertion: None } + Exp { claims: claims.to_vec(), status, sinks: 0, whole: 0, received_by: [0; 4], bearers: vec![], caches: vec![], sink: None, assertion: None, held: None } } impl Exp { @@ -718,6 +838,10 @@ impl Exp { self.caches.push(l); self } + fn held(mut self, h: &'static str) -> Exp { + self.held = Some(h); + self + } fn value(&self) -> Value { json!({ "objects": [IV, IV, IV, IV], @@ -738,6 +862,7 @@ impl Exp { })).collect::>(), "sink": self.sink, "assertion": self.assertion, + "held": self.held, }) } } @@ -760,6 +885,7 @@ fn verdict_cases(g: &Groups) -> Vec { let inputs = |claims: Vec| Inputs { bearer: bearer_receipts::Inputs { group: gg.group.to_json(), objects: gg.held(&[]), claims, ..Default::default() }, heads: both(), + held: None, }; let mut push = |name, description, inputs: Inputs, outcome: Value| out.push(VerdictCase { name, description, inputs, outcome }); let (mc, uni) = (Bearer::Multicast, Bearer::Unidirectional); @@ -1012,6 +1138,207 @@ fn verdict_cases(g: &Groups) -> Vec { inputs(vec![timeliness_claim(gg, &[1], D)]), exp(&["reject step=6 reason=context_mismatch"], "published").value(), ); + + // §5.6: a node's schedule of its own instance, and §7.3's statement against it. + let of_object = |id: &str, index: u64, by_ms: u64, loss_ppm: u64| { + Some(Held { statement: Statement::Object { bearer_id: id.into(), index, by_ms }, loss_ppm, overhead: 2 }) + }; + let with_held = |claims: Vec, held: Option| { + let mut i = inputs(claims); + i.held = held; + i + }; + let mesh_line = || cline(MESH_C1, mc, C1, c1_confirmed(), &[1, 3], 0, &[(1, 0), (3, 0)]); + let mesh_plan = |ch: &mut Chains, count: u64| ch.sign(C1, link, schedule(gg, MESH_C1, &[1, 3], count)); + let scheduled = |by_ms: u64, loss_ppm: u64| { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1, 3]), mesh_plan(&mut ch, 3)]; + with_held(claims, of_object(MESH_C1, 1, by_ms, loss_ppm)) + }; + push( + "node_schedule_stands", + "C1 declares mesh-c1 and schedules objects 1 and 3 on it: its schedule stands, and at 30% object 1 is held at the end of the second pass.", + scheduled(pass_end(2), 300_000), + exp(&["cache-declared", "stands"], "published").cache(mesh_line()).held("holds").value(), + ); + push( + "node_schedule_after_deadline", + "The same statement a millisecond before that pass ends.", + scheduled(pass_end(2) - 1, 300_000), + exp(&["cache-declared", "stands"], "published").cache(mesh_line()).held("reject reason=availability_after_deadline").value(), + ); + push( + "node_schedule_not_within", + "At 90% object 1 needs seven passes and the schedule has three.", + scheduled(pass_end(3), 900_000), + exp(&["cache-declared", "stands"], "published").cache(mesh_line()).held("reject reason=availability_not_within_schedule").value(), + ); + push( + "node_schedule_loss_bound_invalid", + "A statement at a loss bound of a million: the statement is refused, and nothing else changes.", + scheduled(pass_end(3), 1_000_000), + exp(&["cache-declared", "stands"], "published").cache(mesh_line()).held("reject reason=loss_bound_invalid").value(), + ); + { + let mut i = scheduled(pass_end(3), 0); + i.held.as_mut().expect("a statement").overhead = 3; + push( + "node_schedule_overhead_invalid", + "A statement at an overhead of 3.", + i, + exp(&["cache-declared", "stands"], "published").cache(mesh_line()).held("reject reason=overhead_invalid").value(), + ); + } + { + let mut i = scheduled(pass_end(3), 0); + i.held = of_object(MESH_C1, 0, pass_end(3), 0); + push( + "node_schedule_object_not_scheduled", + "Object 0, which C1's schedule has no entry for.", + i, + exp(&["cache-declared", "stands"], "published").cache(mesh_line()).held("reject reason=object_not_scheduled").value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh_plan(&mut ch, 3), mesh(&mut ch, &[1, 3])]; + push( + "node_schedule_before_its_claim", + "A plan signed before the sending it plans, its cache-transmission claim after: one instance, and the schedule stands.", + with_held(claims, of_object(MESH_C1, 3, pass_end(1), 0)), + exp(&["stands", "cache-declared"], "published").cache(mesh_line()).held("holds").value(), + ); + } + { + let mut ch = Chains::default(); + let every = vec![ + mesh(&mut ch, &[0, 1, 2, 3]), + ch.sign(C1, link, schedule(gg, MESH_C1, &[0, 1, 2, 3], 3)), + ]; + let mut i = inputs(every); + i.held = Some(Held { statement: Statement::Group { bearer_id: MESH_C1.into(), by_ms: pass_end(2) }, loss_ppm: 300_000, overhead: 2 }); + push( + "node_schedule_group", + "Every object sent and scheduled: the group is held at the end of the second pass at 30%.", + i, + exp(&["cache-declared", "stands"], "published") + .cache(cline(MESH_C1, mc, C1, c1_confirmed(), &[0, 1, 2, 3], 0, &[(0, 0), (1, 0), (2, 0), (3, 0)])) + .held("holds") + .value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1, 3]), mesh_plan(&mut ch, 3), mesh_plan(&mut ch, 7)]; + push( + "node_schedule_extended", + "C1 adds passes: at 90% object 1 is held at the seventh's end, and the earlier schedule is extended (carousel §4.5).", + with_held(claims, of_object(MESH_C1, 1, pass_end(7), 900_000)), + exp(&["cache-declared", "extended", "stands"], "published").cache(mesh_line()).held("holds").value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1, 3]), mesh_plan(&mut ch, 3), mesh_plan(&mut ch, 2)]; + push( + "node_schedule_contradicted", + "C1 withdraws a pass: both schedules set aside, its instance stands, and no schedule is there to hold a statement.", + with_held(claims, of_object(MESH_C1, 1, pass_end(2), 0)), + exp(&["cache-declared", "set-aside reason=schedule_contradicted", "set-aside reason=schedule_contradicted"], "published") + .cache(mesh_line()) + .held("reject reason=object_not_scheduled") + .value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1, 3]), ch.sign(C2, link, schedule(gg, MESH_C1, &[1, 3], 3))]; + push( + "node_schedule_other_signer", + "C2 schedules C1's instance: set aside, and no schedule stands there.", + with_held(claims, of_object(MESH_C1, 1, pass_end(2), 0)), + exp(&["cache-declared", "set-aside reason=cache_schedule_signer_mismatch"], "published") + .cache(mesh_line()) + .held("reject reason=object_not_scheduled") + .value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1, 3]), mesh_plan(&mut ch, 3), ch.sign(C2, link, schedule(gg, MESH_C1, &[1, 3], 2))]; + push( + "node_schedule_stranger_contradicts_nothing", + "C2's schedule of C1's instance, with fewer passes, beside C1's: set aside alone, and C1's stands.", + with_held(claims, of_object(MESH_C1, 1, pass_end(1), 0)), + exp(&["cache-declared", "stands", "set-aside reason=cache_schedule_signer_mismatch"], "published").cache(mesh_line()).held("holds").value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![sat(&mut ch), ch.sign(C1, link, schedule(gg, SAT, &[1, 3], 3))]; + push( + "node_schedule_on_publisher_instance", + "C1 schedules sat, P's instance: set aside, as a cache-transmission claim of it would be, and P's declaration stands.", + inputs(claims), + exp(&["declared", "set-aside reason=bearer_contradicted"], "transmitted").bearer((SAT, uni, 0, None, None)).value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1]), mesh(&mut ch, &[1, 3]), mesh_plan(&mut ch, 3)]; + push( + "node_schedule_on_contradicted_instance", + "C1's account of mesh-c1 contradicts itself: its schedule of it is set aside with its claims.", + inputs(claims), + exp(&["set-aside reason=bearer_contradicted", "set-aside reason=bearer_contradicted", "set-aside reason=bearer_contradicted"], "published").value(), + ); + } + { + let claims = vec![Chains::default().sign(C1, link, schedule(gg, MESH_C1, &[1, 3], 3))]; + push( + "node_schedule_not_declared", + "C1 schedules an instance it has not declared: set aside.", + with_held(claims, of_object(MESH_C1, 1, pass_end(2), 0)), + exp(&["set-aside reason=bearer_not_declared"], "published").held("reject reason=object_not_scheduled").value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![ + mesh(&mut ch, &[1, 3]), + ch.sign(C1, link, schedule(gg, MESH_C1, &[0, 1, 2, 3], 3)), + rec(&mut ch, R1, mc, MESH_C1, &[1]), + ]; + push( + "node_schedule_credits_nothing", + "C1 schedules every object and says it sent 1 and 3: its instance is credited for those, whatever it scheduled.", + inputs(claims), + exp(&["cache-declared", "stands", "counted"], "reconciled") + .counts(1, 0, [0, 1, 0, 0]) + .cache(cline(MESH_C1, mc, C1, c1_confirmed(), &[1, 3], 1, &[(1, 1), (3, 0)])) + .value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![sat(&mut ch), ch.sign(P, link, schedule(gg, SAT, &[1, 3], 3))]; + push( + "publisher_schedule_stands", + "P's schedule of sat stands by carousel §6.2 step 4, and the statement is held to it as to a node's.", + with_held(claims, of_object(SAT, 1, pass_end(2), 300_000)), + exp(&["declared", "stands"], "transmitted").bearer((SAT, uni, 0, None, None)).held("holds").value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![mesh(&mut ch, &[1, 3]), ch.sign(P, link, schedule(gg, MESH_C1, &[1, 3], 3))]; + push( + "publisher_schedule_on_cache_instance", + "P schedules C1's instance, which P has not declared: set aside, and C1's instance stands.", + inputs(claims), + exp(&["cache-declared", "set-aside reason=bearer_not_declared"], "published").cache(mesh_line()).value(), + ); + } let mut i = inputs(only()); i.bearer.group = broken_group(gg); push("group_refused", "The group's signature is broken: nothing is derived.", i, json!("refuse reason=signature_verify_failed")); @@ -1148,6 +1475,7 @@ fn tally_cases(g: &Groups) -> Vec { let inputs = |claims: Vec| Inputs { bearer: bearer_receipts::Inputs { group: gg.group.to_json(), objects: gg.held(&[1]), claims, ..Default::default() }, heads: both(), + held: None, }; let target = |pop: &[[u8; 32]], region: &str, deadline: u64, miss: u64| Target { index: 1, @@ -1704,6 +2032,7 @@ fn lines_cases(g: &Groups) -> Vec { let inputs = |claims: Vec| Inputs { bearer: bearer_receipts::Inputs { group: gg.group.to_json(), objects: gg.held(&[1]), claims, ..Default::default() }, heads: both(), + held: None, }; let on_time = |seed: u8, at: u64| json!({"holder": h(seed), "held_ms": at, "fallback_ms": null, "outcome": "on_time", "value_ppm": 1_000_000}); let replaced = |seed: u8, at: u64| json!({"holder": h(seed), "held_ms": null, "fallback_ms": at, "outcome": "replaced", "value_ppm": 400_000}); @@ -1741,7 +2070,7 @@ fn lines_cases(g: &Groups) -> Vec { LinesCase { name: "timeliness_line_record_without_envelope", description: "No envelope held: R4's holdings record of object 1, a second before the deadline, is on time, as timeliness §6 reads it; R3's acknowledgement of object 1 gives no statement, the object's length unknown.", - inputs: Inputs { bearer: bearer_receipts::Inputs { objects: gg.held(&[]), ..inputs(vec![]).bearer }, heads: both() }, + inputs: Inputs { bearer: bearer_receipts::Inputs { objects: gg.held(&[]), ..inputs(vec![]).bearer }, heads: both(), held: None }, acks: vec![ack(gg, C1, R3, E)], records: vec![record(gg, R4, D - 1_000, &[1])], claim: timeliness_claim(gg, &[1], D), @@ -1762,6 +2091,7 @@ fn lines_cases(g: &Groups) -> Vec { inputs: Inputs { bearer: bearer_receipts::Inputs { group: gf.group.to_json(), objects: gf.held(&[1, 2]), claims: gf_claims, ..Default::default() }, heads: both(), + held: None, }, acks: vec![ack_of(gf, 2, C1, R3, E)], records: vec![], @@ -1799,6 +2129,18 @@ fn inputs_value(i: &Inputs) -> Map { m } +fn held_value(held: &Option) -> Value { + match held { + None => Value::Null, + Some(Held { statement: Statement::Object { bearer_id, index, by_ms }, loss_ppm, overhead }) => { + json!({"kind": "object", "bearer_id": bearer_id, "index": index, "by_ms": by_ms, "loss_ppm": loss_ppm, "overhead": overhead}) + } + Some(Held { statement: Statement::Group { bearer_id, by_ms }, loss_ppm, overhead }) => { + json!({"kind": "group", "bearer_id": bearer_id, "by_ms": by_ms, "loss_ppm": loss_ppm, "overhead": overhead}) + } + } +} + fn acks_value(acks: &[Given]) -> Value { json!(acks.iter().map(|a| json!({"record": hex(&a.record), "items": a.items.iter().map(|l| hex(l)).collect::>()})).collect::>()) } @@ -1830,8 +2172,9 @@ pub fn generate() -> Vec<(String, String)> { } let doc = json!({ "about": "Conformance corpus of extensions/cache-authority.md (wai.delivery.cache): the cache-transmission claim \ - (jwp-receipts §2.4.18) through jwp-receipts §3.1 steps 1 to 6, placing a server key by the heads named (§4.4), \ - the bearer verdict with a cache's instances beside the publisher's (§7), the count of a stated population that \ + (jwp-receipts §2.4.18) and a node's schedule of its own instance (§5.6) through jwp-receipts §3.1 steps 1 to 6, \ + placing a server key by the heads named (§4.4), the bearer verdict with a cache's instances beside the \ + publisher's (§7), the count of a stated population that \ held an object by a deadline (§8), and timeliness lines from acknowledgements and reconciliations (§9). Every \ key is Ed25519 from a published seed of one byte repeated 32 times and attests nothing, and both key logs are \ test logs; envelopes carry opaque test payloads no case decodes; bearer instances and origins use reserved \ @@ -1862,6 +2205,7 @@ pub fn generate() -> Vec<(String, String)> { m.insert("name".into(), c.name.into()); m.insert("description".into(), c.description.into()); m.extend(inputs_value(&c.inputs)); + m.insert("held".into(), held_value(&c.inputs.held)); m.insert("outcome".into(), c.outcome.clone()); Value::Object(m) }).collect::>(), @@ -1956,9 +2300,24 @@ pub fn inputs_of(c: &Value) -> Result { Value::Null => None, v => Some(v.as_array().ok_or("count_only")?.iter().map(key_of).collect::>()?), }; + // Only a verdict case states `held`. + let held = match c.get("held") { + None | Some(Value::Null) => None, + Some(h) => { + let id = h["bearer_id"].as_str().ok_or("held bearer_id")?.to_owned(); + let by_ms = h["by_ms"].as_u64().ok_or("held by_ms")?; + let statement = match h["kind"].as_str() { + Some("object") => Statement::Object { bearer_id: id, index: h["index"].as_u64().ok_or("held index")?, by_ms }, + Some("group") => Statement::Group { bearer_id: id, by_ms }, + _ => return Err("held kind".into()), + }; + Some(Held { statement, loss_ppm: h["loss_ppm"].as_u64().ok_or("held loss_ppm")?, overhead: h["overhead"].as_u64().ok_or("held overhead")? }) + } + }; Ok(Inputs { bearer: bearer_receipts::Inputs { group: c["group"].clone(), objects, claims, sink, assertion, count_only }, heads: heads_of(&c["heads"])?, + held, }) } @@ -2023,6 +2382,10 @@ fn verdict_outcome(v: &Result) -> Value { Ok(()) => "holds".to_string(), Err(r) => format!("reject reason={r}"), }), + "held": v.held.map(|a| match a { + Ok(()) => "holds".to_string(), + Err(r) => format!("reject reason={r}"), + }), }), } } diff --git a/wai/wai-rs/src/carousel.rs b/wai/wai-rs/src/carousel.rs index 0df893602..c97103761 100644 --- a/wai/wai-rs/src/carousel.rs +++ b/wai/wai-rs/src/carousel.rs @@ -4,8 +4,9 @@ //! A publisher's `schedule` claim, whose body and context checks are //! `crate::claim_receipt::schedule`'s, states a plan beside the group receipt and the //! transmission claim of bearer-receipts. This module derives from it when each object is held -//! by a receiver whose losses stay within a bound ([`verdict`], §6) and the passes a receiver -//! listens to ([`plan`], §7). +//! by a receiver whose losses stay within a bound ([`verdict`], §6), the passes a receiver +//! listens to ([`plan`], §7), and whether what a receiver acquired on an instance suffices +//! ([`inband`], §8.2). //! //! # Rules enforced here rather than only documented //! @@ -14,8 +15,9 @@ //! receiver missed before. //! - A RaptorQ block is held at K′ + h distinct encoding symbols, the count RFC 6330 §5.8 //! states its bound at, never fewer. -//! - A schedule stands only beside a declaration of its instance that is not `bidirectional`; -//! two schedules of one instance that differ set both aside. +//! - A schedule stands only beside a declaration of its instance that is not `bidirectional`. +//! - Along their chain, each schedule of an instance extends the one before it, or every +//! schedule of the instance is set aside: passes are added, never withdrawn, moved or changed. //! - All arithmetic is on integers, and an entry's cost is a few products per block size, //! whatever its count of passes. @@ -24,8 +26,10 @@ use std::collections::{BTreeMap, BTreeSet}; use serde_json::Value; use crate::bearer_receipts::{HeldObject, BEARER_CONTRADICTED, BEARER_NOT_DECLARED}; -use crate::claim_receipt::{Bearer, ClaimBody, ClaimReceipt, Esi, Fec, Reason as ClaimReason, Rejection, ScheduleEntry}; +use crate::claim_receipt::{Bearer, ClaimBody, ClaimReceipt, Esi, Fec, Reason as ClaimReason, Rejection, ScheduleClaim, ScheduleEntry}; use crate::jwp_delivery::{DeliveryError, GroupReceipt, ObjectReceipt}; +use crate::key_log::Revision; +use crate::signer_id::SignerIdForm; pub mod corpus; @@ -50,6 +54,9 @@ pub const CODES: &[&str] = &[ OBJECT_NOT_SCHEDULED, NOT_WITHIN_SCHEDULE, AFTER_DEADLINE, + INBAND_CHAIN_INCOMPLETE, + INBAND_NOT_SCHEDULED, + INBAND_KEY_LOG_MISSING, ]; pub const SCHEDULE_CONTRADICTED: &str = "schedule_contradicted"; @@ -60,6 +67,9 @@ pub const HOLDING_INVALID: &str = "holding_invalid"; pub const OBJECT_NOT_SCHEDULED: &str = "object_not_scheduled"; pub const NOT_WITHIN_SCHEDULE: &str = "availability_not_within_schedule"; pub const AFTER_DEADLINE: &str = "availability_after_deadline"; +pub const INBAND_CHAIN_INCOMPLETE: &str = "inband_chain_incomplete"; +pub const INBAND_NOT_SCHEDULED: &str = "inband_not_scheduled"; +pub const INBAND_KEY_LOG_MISSING: &str = "inband_key_log_missing"; /// The greatest loss bound, in parts per million (carousel §2). pub const MAX_LOSS_PPM: u64 = 999_999; @@ -284,6 +294,8 @@ pub enum ClaimVerdict { Declared, /// A schedule that stands. Stands, + /// A schedule a later schedule of its instance extends (§4.5), with another body. + Extended, /// Accepted, and set aside for the reason given. SetAside(&'static str), } @@ -294,6 +306,7 @@ impl ClaimVerdict { ClaimVerdict::Refused(r) => format!("reject step={} reason={}", r.step, r.reason.label()), ClaimVerdict::Declared => "declared".into(), ClaimVerdict::Stands => "stands".into(), + ClaimVerdict::Extended => "extended".into(), ClaimVerdict::SetAside(r) => format!("set-aside reason={r}"), } } @@ -336,13 +349,40 @@ impl Refusal { } } +/// What §6.2 steps 3 and 4 make of the claims accepted about one group. +#[derive(Clone, Debug, Default)] +pub(crate) struct Standing { + /// The reason each claim set aside is set aside for, by its position. + pub aside: BTreeMap, + /// The schedules a later schedule of their instance extends with another body (§4.5), by + /// position: accepted, and taking no further part. + pub extended: BTreeSet, + /// The position of the schedule that stands on each instance, the last of its chain, by its + /// `bearer_id`. + pub schedules: BTreeMap, +} + +/// §6.2 step 4 for the schedules of one instance, by their positions in the order of their +/// signer's chain: `Err(schedule_contradicted)` when one does not extend the one before it +/// (§4.5); otherwise the position of the last, which extends every one before it, and those +/// before it with another body, which it extends. Extension is transitive, so each extending +/// the one before it is each extending every one before it. +pub(crate) fn monotone(accepted: &[Option], idx: &[usize]) -> Result<(usize, Vec), &'static str> { + let body = |i: usize| accepted[i].as_ref().and_then(ClaimReceipt::schedule).expect("a schedule"); + if idx.windows(2).any(|w| !body(w[1]).extends(body(w[0]))) { + return Err(SCHEDULE_CONTRADICTED); + } + let last = *idx.last().expect("an instance has a schedule"); + Ok((last, idx.iter().copied().filter(|&i| body(i) != body(last)).collect())) +} + /// §6.2 steps 3 and 4 over the claims accepted about one group, each at its position (`None` /// for one refused): the declarations by instance (bearer-receipts §6.2 step 4), then the -/// schedules by instance. Returns the reason each claim set aside is set aside for, by its -/// position, and the position of each standing schedule by its `bearer_id`. A timeliness plan +/// schedules by instance, each instance's in the order given, which is their signer's chain's +/// (§6.1; §4.3 step 2 makes the group's key the only signer). A timeliness plan /// (`crate::timeliness`) reads the schedules that stand here. -pub(crate) fn standing(accepted: &[Option]) -> (BTreeMap, BTreeMap) { - let mut aside: BTreeMap = BTreeMap::new(); +pub(crate) fn standing(accepted: &[Option]) -> Standing { + let mut out = Standing::default(); // Step 3: the declarations, by instance (bearer-receipts §6.2 step 4). let mut declared: BTreeMap> = BTreeMap::new(); for (i, c) in accepted.iter().enumerate() { @@ -359,7 +399,7 @@ pub(crate) fn standing(accepted: &[Option]) -> (BTreeMap]) -> (BTreeMap = BTreeMap::new(); for (id, idx) in &scheduled { - let first = accepted[idx[0]].as_ref().and_then(ClaimReceipt::schedule); - let reason = if idx.iter().any(|&i| accepted[i].as_ref().and_then(ClaimReceipt::schedule) != first) { - Some(SCHEDULE_CONTRADICTED) - } else if contradicted.contains(id) { - Some(BEARER_CONTRADICTED) - } else { - match declaration.get(id) { - None => Some(BEARER_NOT_DECLARED), - Some(Bearer::Bidirectional) => Some(SCHEDULE_ON_BIDIRECTIONAL), - Some(_) => None, + let reason = monotone(accepted, idx).and_then(|v| { + if contradicted.contains(id) { + return Err(BEARER_CONTRADICTED); } - }; + match declaration.get(id) { + None => Err(BEARER_NOT_DECLARED), + Some(Bearer::Bidirectional) => Err(SCHEDULE_ON_BIDIRECTIONAL), + Some(_) => Ok(v), + } + }); match reason { - Some(reason) => { + Err(reason) => { for &i in idx { - aside.insert(i, reason); + out.aside.insert(i, reason); } } - None => { - standing.insert(id.clone(), idx[0]); + Ok((last, extended)) => { + out.schedules.insert(id.clone(), last); + out.extended.extend(extended); } } } - (aside, standing) + out } -/// §6.2: the verdict over one group. -pub fn verdict(inp: &Inputs) -> Result { - check_bounds(inp.loss_ppm, inp.overhead).map_err(Refusal::Input)?; +/// What §6.2 steps 1 to 4 give: the objects' verdicts, the claims' and the claims accepted, and +/// the schedules that stand. +struct Judged { + group: GroupReceipt, + objects: Vec, + claims: Vec, + accepted: Vec>, + standing: Standing, +} + +/// §6.2 steps 1 to 4, the loss bound and overhead aside. +fn judge(group: &Value, held_objects: &[HeldObject], wires: &[String]) -> Result { // Step 1: the group, and its objects the same whatever the bearer. - let group = GroupReceipt::from_json(&inp.group).map_err(Refusal::Group)?; + let group = GroupReceipt::from_json(group).map_err(Refusal::Group)?; group.verify().map_err(Refusal::Group)?; let mut receipts: Vec<(ObjectReceipt, Option<&[u8]>)> = Vec::new(); - let objects: Vec = inp - .objects + let objects: Vec = held_objects .iter() .map(|o| { let r = match ObjectReceipt::from_json(&o.receipt) { @@ -426,9 +472,9 @@ pub fn verdict(inp: &Inputs) -> Result { // Step 2. let mut held: BTreeMap<[u8; 32], ClaimReceipt> = BTreeMap::new(); - let mut claims: Vec = Vec::with_capacity(inp.claims.len()); - let mut accepted: Vec> = Vec::with_capacity(inp.claims.len()); - for wire in &inp.claims { + let mut claims: Vec = Vec::with_capacity(wires.len()); + let mut accepted: Vec> = Vec::with_capacity(wires.len()); + for wire in wires { let checked = (|| { let c = ClaimReceipt::from_json(wire)?; c.verify()?; @@ -454,14 +500,24 @@ pub fn verdict(inp: &Inputs) -> Result { } // Steps 3 and 4. - let (aside, standing) = self::standing(&accepted); - for (&i, &reason) in &aside { + let standing = self::standing(&accepted); + for (&i, &reason) in &standing.aside { claims[i] = ClaimVerdict::SetAside(reason); } + for &i in &standing.extended { + claims[i] = ClaimVerdict::Extended; + } + Ok(Judged { group, objects, claims, accepted, standing }) +} + +/// §6.2: the verdict over one group. +pub fn verdict(inp: &Inputs) -> Result { + check_bounds(inp.loss_ppm, inp.overhead).map_err(Refusal::Input)?; + let Judged { group, objects, claims, accepted, standing } = judge(&inp.group, &inp.objects, &inp.claims)?; // Step 5. let mut lines = Vec::new(); - for (id, &i) in &standing { + for (id, &i) in &standing.schedules { let s = accepted[i].as_ref().and_then(ClaimReceipt::schedule).expect("a schedule"); for e in &s.objects { lines.push(Line { @@ -488,6 +544,91 @@ pub fn verdict(inp: &Inputs) -> Result { Ok(Verdict { objects, claims, lines, statement }) } +/// §6.4 on one schedule, for a verdict that holds the schedule standing on the statement's +/// instance (`None` when none stands there): `Ok` when the statement holds. A node's schedule of +/// its own instance (cache-authority §5.6) is held to it as a publisher's is. +pub fn statement_holds(schedule: Option<&ScheduleClaim>, leaf_count: u64, statement: &Statement, loss_ppm: u64, h: u64) -> Result<(), &'static str> { + check_bounds(loss_ppm, h)?; + let held_by = |index: u64, by: u64| -> Result<(), &'static str> { + let e = schedule.and_then(|s| s.entry(index)).ok_or(OBJECT_NOT_SCHEDULED)?; + match availability(e, loss_ppm, h).available_ms { + None => Err(NOT_WITHIN_SCHEDULE), + Some(t) if t > by => Err(AFTER_DEADLINE), + Some(_) => Ok(()), + } + }; + match statement { + Statement::Object { index, by_ms, .. } => held_by(*index, *by_ms), + Statement::Group { by_ms, .. } => (0..leaf_count).try_for_each(|i| held_by(i, *by_ms)), + } +} + +// ───────────────────────────── §8.1, §8.2: what rides in-band ───────────────────────────── + +/// §8.1: the interval of a schedule, the least `period_ms` of its entries of two passes or +/// more, or, where every entry has one pass, the least `duration_ms`. The publisher sends the +/// in-band set at least once in every interval of it, from its first pass's start to its last +/// pass's end. +pub fn inband_interval(s: &ScheduleClaim) -> u64 { + let repeated = s.objects.iter().filter(|e| e.count >= 2).map(|e| e.period_ms).min(); + repeated.or_else(|| s.objects.iter().map(|e| e.duration_ms).min()).expect("a schedule has an entry") +} + +/// The inputs of §8.2: what a receiver acquired on an instance. +#[derive(Clone, Debug, Default)] +pub struct InbandInputs { + /// The instance the receiver joined. + pub bearer_id: String, + /// The group receipt, in its JSON form. + pub group: Value, + /// The set's claims, in the order of their signer's chain. + pub claims: Vec, + /// The key logs acquired with them, each the text of a revision, keyed by the origin it names. + pub logs: BTreeMap, +} + +/// §8.2's verdict on what a receiver acquired. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Inband { + /// Each claim's label, as §6.2 gives it over the set alone. + pub claims: Vec, + /// `Ok` with the standing schedule's interval (§8.1) when the set suffices; the reason + /// otherwise. + pub set: Result, +} + +/// §8.2: whether what a receiver acquired on an instance suffices: §6.2 steps 1 to 4 over the +/// group receipt and the set's claims alone, with no claim held before them; then, at the first +/// of these that fails, refused: no claim of it is refused at jwp-receipts §3.1 step 5 +/// (`inband_chain_incomplete`); a schedule of the instance stands (`inband_not_scheduled`); a +/// key log of the set is held for the origin that schedule's `signer_id` names (jwp-receipts §7.2 +/// rules 1 to 3) and lists the schedule's key (`inband_key_log_missing`). Only the group refuses +/// it outright. +pub fn inband(inp: &InbandInputs) -> Result { + let j = judge(&inp.group, &[], &inp.claims)?; + let set = (|| { + if j.claims.iter().any(|c| matches!(c, ClaimVerdict::Refused(r) if r.step == 5)) { + return Err(INBAND_CHAIN_INCOMPLETE); + } + let &i = j.standing.schedules.get(&inp.bearer_id).ok_or(INBAND_NOT_SCHEDULED)?; + let c = j.accepted[i].as_ref().expect("a schedule that stands"); + let s = c.schedule().expect("a schedule"); + let SignerIdForm::OriginBound { origin, .. } = crate::signer_id::classify(&c.signer_id) else { + return Err(INBAND_KEY_LOG_MISSING); + }; + let held = inp + .logs + .get(&origin) + .and_then(|t| Revision::from_json(t).ok()) + .filter(|r| r.check_held(&origin).is_ok() && r.keys.iter().any(|e| e.key == c.signer_pubkey)); + if held.is_none() { + return Err(INBAND_KEY_LOG_MISSING); + } + Ok(inband_interval(s)) + })(); + Ok(Inband { claims: j.claims, set }) +} + #[cfg(test)] mod tests { use super::*; @@ -569,6 +710,67 @@ mod tests { assert_eq!(plan(&e, 0, 0, 3, &[0, 0, 0]), Err(OVERHEAD_INVALID)); } + fn claim(seq: u64, parent: Option<[u8; 32]>, objects: Vec) -> ClaimReceipt { + use crate::claim_receipt::schedule::ATTESTS_SCHEDULED; + use crate::claim_receipt::SubjectType; + let key = ed25519_dalek::SigningKey::from_bytes(&[0x11; 32]); + let body = ClaimBody::Schedule(ScheduleClaim { bearer_id: "urn:example:b".into(), objects, attests: ATTESTS_SCHEDULED.into() }); + ClaimReceipt::seal(&key, "did:web:publisher.example#d1", SubjectType::Receipt, [0; 32], seq, "2026-11-02T12:00:03Z", body, parent).unwrap() + } + + #[test] + fn schedules_are_monotone_along_their_chain_or_set_aside() { + let e = |count| entry(rq(3_072, 64, 3), 8, Esi::Advance, count); + let of = |counts: &[u64]| -> Vec> { + let mut parent = None; + counts + .iter() + .enumerate() + .map(|(i, &n)| { + let c = claim(i as u64, parent, vec![e(n)]); + parent = Some(c.link_hash()); + Some(c) + }) + .collect() + }; + let mono = |counts: &[u64]| { + let accepted = of(counts); + monotone(&accepted, &(0..counts.len()).collect::>()) + }; + assert_eq!(mono(&[5]), Ok((0, vec![]))); + assert_eq!(mono(&[5, 5]), Ok((1, vec![])), "one body, no schedule extended"); + assert_eq!(mono(&[5, 7]), Ok((1, vec![0]))); + assert_eq!(mono(&[5, 5, 7, 9, 9]), Ok((4, vec![0, 1, 2])), "the last's copy is not extended"); + assert_eq!(mono(&[7, 5]), Err(SCHEDULE_CONTRADICTED), "a pass withdrawn"); + assert_eq!(mono(&[5, 7, 6]), Err(SCHEDULE_CONTRADICTED), "the last extends the first, not the one before it"); + } + + #[test] + fn the_interval_is_the_least_period_read() { + let s = |objects| ScheduleClaim { bearer_id: "urn:example:b".into(), objects, attests: "scheduled".into() }; + let mut one_pass = entry(rq(3_072, 64, 3), 8, Esi::Advance, 1); + one_pass.period_ms = 0; + one_pass.duration_ms = 500; + let repeated = entry(rq(3_072, 64, 3), 8, Esi::Advance, 5); + assert_eq!(inband_interval(&s(vec![repeated.clone()])), 10_000); + assert_eq!(inband_interval(&s(vec![one_pass.clone(), repeated])), 10_000, "a period of one pass is not read"); + assert_eq!(inband_interval(&s(vec![one_pass])), 500, "with no period to read, the least duration"); + } + + #[test] + fn a_statement_is_held_to_the_schedule_it_is_given() { + let e = entry(rq(3_072, 64, 3), 8, Esi::Advance, 5); + let s = ScheduleClaim { bearer_id: "urn:example:b".into(), objects: vec![e.clone()], attests: "scheduled".into() }; + let at = |by_ms| Statement::Object { bearer_id: "urn:example:b".into(), index: 0, by_ms }; + assert_eq!(statement_holds(Some(&s), 1, &at(e.pass_end(2)), 300_000, 2), Ok(())); + assert_eq!(statement_holds(Some(&s), 1, &at(e.pass_end(2) - 1), 300_000, 2), Err(AFTER_DEADLINE)); + assert_eq!(statement_holds(Some(&s), 1, &at(e.pass_end(5)), 900_000, 2), Err(NOT_WITHIN_SCHEDULE)); + assert_eq!(statement_holds(None, 1, &at(e.pass_end(5)), 0, 2), Err(OBJECT_NOT_SCHEDULED)); + assert_eq!(statement_holds(Some(&s), 2, &Statement::Group { bearer_id: "urn:example:b".into(), by_ms: e.pass_end(5) }, 0, 2), Err(OBJECT_NOT_SCHEDULED)); + assert_eq!(statement_holds(Some(&s), 1, &at(0), 1_000_000, 2), Err(LOSS_BOUND_INVALID)); + assert_eq!(statement_holds(Some(&s), 1, &at(0), 0, 3), Err(OVERHEAD_INVALID)); + } + #[test] fn a_repeat_plan_takes_at_most_one_pass() { let e = entry(rq(3_072, 64, 3), 8, Esi::Repeat, 5); diff --git a/wai/wai-rs/src/carousel/corpus.rs b/wai/wai-rs/src/carousel/corpus.rs index d001449ed..27f2afda2 100644 --- a/wai/wai-rs/src/carousel/corpus.rs +++ b/wai/wai-rs/src/carousel/corpus.rs @@ -15,12 +15,17 @@ use crate::claim_receipt::schedule::ATTESTS_SCHEDULED; use crate::claim_receipt::{hex, unhex, Oti, ReconciliationClaim, ScheduleClaim, SubjectType, TransmissionClaim}; use crate::container::{Conditioning, Manifest, ModelRequirement, Wai}; use crate::jwp_delivery::GroupBuilder; +use crate::key_log::{commitment, EntryStatus, KeyEntry}; use ed25519_dalek::SigningKey; use serde_json::{json, Map}; const PUBLISHER: u8 = 0x11; const OTHER_KEY: u8 = 0x12; const SINK: u8 = 0x41; +const LOG_ROOT: u8 = 0x71; +const LOG_NEXT: u8 = 0x72; +const OTHER_ROOT: u8 = 0x73; +const OTHER_NEXT: u8 = 0x74; const D1: &str = "did:web:publisher.example#d1"; const D2: &str = "did:web:publisher.example#d2"; @@ -33,6 +38,11 @@ const UNDECLARED: &str = "urn:example:wai-carousel:broadcast-9"; const GROUP_START: &str = "2026-11-02T12:00:00Z"; const GROUP_END: &str = "2026-11-02T12:00:02Z"; const SENT: &str = "2026-11-02T12:00:03Z"; +/// The origin `D1` and `D2` name, and another. +const ORIGIN: &str = "https://publisher.example"; +const OTHER_ORIGIN: &str = "https://other.example"; +const LOG_TIME: &str = "2026-11-01T00:00:00Z"; +const COMPROMISED: &str = "2026-11-01T06:00:00Z"; /// `GROUP_START` as an instant. const START_MS: u64 = 1_793_620_800_000; /// The first pass of the broadcast schedule: ten seconds after the group starts. @@ -558,6 +568,156 @@ fn verdict_cases(p: &Publication) -> Vec { ); } + // §4.5: a later schedule that extends an earlier one. + let changed = |i: usize, f: &dyn Fn(&mut ScheduleEntry)| { + let mut v = bc.clone(); + f(&mut v[i]); + v + }; + let seven = changed(0, &|e| e.count = 7); + { + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), + ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), + ch.sign(PUBLISHER, link, schedule(BCAST, seven.clone())), + ]; + let mut inp = inputs(p, true, claims, 900_000, 2); + inp.statement = object_statement(BCAST, 0, end(&seven[0], 7)); + push( + "extension_adds_passes", + "At 90% object 0 gains 3 a pass and needs 7 passes, and the first schedule has 5. A later one with 7 extends it: the first is \ + extended, and the object is held at the end of the seventh.", + inp, + Exp::new(&ALL_D, &["declared", "extended", "stands"]) + .line(BCAST, &seven[0], Some(7), 2) + .line(BCAST, &seven[1], None, 2) + .line(BCAST, &seven[2], None, 2) + .statement(Ok(())) + .to_value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), + ch.sign(PUBLISHER, link, schedule(BCAST, bc[..2].to_vec())), + ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), + ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), + ]; + let mut inp = inputs(p, false, claims, 300_000, 2); + inp.statement = object_statement(BCAST, 2, end(&bc[2], 1)); + push( + "extension_adds_an_object", + "A later schedule adds an entry for object 2, and is repeated: the first is extended, both copies of the last stand, and a \ + statement about the added object holds.", + inp, + Exp::new(&ALL_I, &["declared", "extended", "stands", "stands"]) + .line(BCAST, &bc[0], Some(2), 2) + .line(BCAST, &bc[1], None, 2) + .line(BCAST, &bc[2], Some(1), 2) + .statement(Ok(())) + .to_value(), + ); + } + { + let mut single = bc[0].clone(); + single.count = 1; + single.period_ms = 0; + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), + ch.sign(PUBLISHER, link, schedule(BCAST, vec![single])), + ch.sign(PUBLISHER, link, schedule(BCAST, bc[..1].to_vec())), + ]; + push( + "extension_of_one_pass", + "One pass, its period 0 and not read, then five passes with a period: the pass stated stays the first, and object 0 is held \ + after the second at 30%.", + inputs(p, true, claims, 300_000, 2), + Exp::new(&ALL_D, &["declared", "extended", "stands"]).line(BCAST, &bc[0], Some(2), 2).to_value(), + ); + } + { + let more = changed(1, &|e| e.count = 6); + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), + ch.sign(PUBLISHER, link, schedule(BCAST, bc[1..2].to_vec())), + ch.sign(PUBLISHER, link, schedule(BCAST, more[1..2].to_vec())), + ]; + push( + "extension_of_repeat", + "Object 1 under `repeat` at 30%: three more passes of the same ESIs add nothing certain, so it is still not within the schedule, \ + and the octets sent are the later schedule's.", + inputs(p, true, claims, 300_000, 2), + Exp::new(&ALL_D, &["declared", "extended", "stands"]).line(BCAST, &more[1], None, 2).to_value(), + ); + } + let contradicted = format!("set-aside reason={SCHEDULE_CONTRADICTED}"); + for (name, description, earlier, later) in [ + ("extension_withdraws_passes", "The schedules of extension_adds_passes in the other order: the later withdraws two passes.", seven.clone(), bc.clone()), + ("extension_moves_the_first_pass", "Six passes, each a second later.", bc.clone(), changed(0, &|e| { + e.count = 6; + e.first_ms += 1_000; + })), + ("extension_changes_the_period", "Six passes, a second further apart: every pass after the first moves.", bc.clone(), changed(0, &|e| { + e.count = 6; + e.period_ms += 1_000; + })), + ("extension_changes_the_duration", "Six passes, each a second longer.", bc.clone(), changed(0, &|e| { + e.count = 6; + e.duration_ms += 1_000; + })), + ("extension_changes_the_repair", "Six passes with a repair symbol more in each: every pass sends other symbols.", bc.clone(), changed(0, &|e| { + e.count = 6; + e.repair += 1; + })), + ("extension_changes_the_esi", "Object 1 moved from `repeat` to `advance`.", bc.clone(), changed(1, &|e| { + e.count = 4; + e.esi = Esi::Advance; + })), + ("extension_changes_the_code", "Object 2's blocks of 3 stated as blocks of at most 2.", bc.clone(), changed(2, &|e| { + e.count = 5; + e.oti = nc(288, 32, 2); + })), + ] { + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), + ch.sign(PUBLISHER, link, schedule(BCAST, earlier)), + ch.sign(PUBLISHER, link, schedule(BCAST, later)), + ]; + push(name, description, inputs(p, false, claims, 0, 2), Exp::new(&ALL_I, &["declared", &contradicted, &contradicted]).to_value()); + } + { + let six = changed(0, &|e| e.count = 6); + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), + ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), + ch.sign(PUBLISHER, link, schedule(BCAST, seven.clone())), + ch.sign(PUBLISHER, link, schedule(BCAST, six)), + ]; + push( + "extension_falls_back", + "Five passes, then seven, then six: the last extends the first and withdraws a pass of the second, and all three are set aside.", + inputs(p, false, claims, 0, 2), + Exp::new(&ALL_I, &["declared", &contradicted, &contradicted, &contradicted]).to_value(), + ); + } + { + let mut ch = Chains::default(); + let claims = vec![ch.sign(PUBLISHER, link, schedule(UNDECLARED, bc.clone())), ch.sign(PUBLISHER, link, schedule(UNDECLARED, seven.clone()))]; + let aside = format!("set-aside reason={BEARER_NOT_DECLARED}"); + push( + "extension_not_declared", + "A schedule and its extension on an instance no declaration names: both set aside.", + inputs(p, false, claims, 0, 2), + Exp::new(&ALL_I, &[&aside, &aside]).to_value(), + ); + } + // Step 6. let step6 = |reason: &str| format!("reject step=6 reason={reason}"); let mut context = |name: &'static str, description: &'static str, bytes: bool, signer: u8, subject: [u8; 32], objects: Vec, reason: &str| { @@ -865,6 +1025,7 @@ const BIG_OBJECT: u64 = 1_416_003_655_831; fn plan_cases(p: &Publication) -> Vec { let bc = broadcast(p); let (e0, e1, e2) = (bc[0].clone(), bc[1].clone(), bc[2].clone()); + let e0_seven = ScheduleEntry { count: 7, ..e0.clone() }; let ok = |passes: &[u64], e: &ScheduleEntry, complete: Option| { json!({ "outcome": "plan", @@ -891,6 +1052,7 @@ fn plan_cases(p: &Publication) -> Vec { case("holding_unevenly", "One block held, one a symbol short and one 19 short: two passes, for the second.", &e0, T0 + 29_000, 300_000, 2, &[20, 1, 19], ok(&[2, 3], &e0, Some(end(&e0, 3)))), case("too_late", "After pass 4 starts: one pass left and two wanted; it listens to the one, and is not held.", &e0, T0 + 100_000, 300_000, 2, &[0, 0, 0], ok(&[5], &e0, None)), case("after_the_last", "After the last pass starts: nothing left.", &e0, T0 + 120_001, 300_000, 2, &[0, 0, 0], ok(&[], &e0, None)), + case("too_late_extended", "The receiver of too_late under a schedule extended to seven passes: passes 5 and 6, and it is held.", &e0_seven, T0 + 100_000, 300_000, 2, &[0, 0, 0], ok(&[5, 6], &e0_seven, Some(end(&e0_seven, 6)))), case("already_held", "Holding 20 of every block: held now, nothing to listen to.", &e0, T0 + 50_000, 300_000, 2, &[20, 20, 20], ok(&[], &e0, Some(T0 + 50_000))), case("repeat_one_pass", "Object 1 with no loss: the first pass sends 20, all it needs.", &e1, T0, 0, 2, &[0], ok(&[1], &e1, Some(end(&e1, 1)))), case("repeat_short", "Object 1 at 10%: one pass leaves 18 of 20, and no later pass is certain to add.", &e1, T0, 100_000, 2, &[0], ok(&[1], &e1, None)), @@ -903,6 +1065,275 @@ fn plan_cases(p: &Publication) -> Vec { ] } +/// A key log's head revision (jwp-receipts §7.2), for the corpus's origins. +fn log(origin: &str, root: u8, next: u8, keys: Vec) -> Revision { + let r = Revision { + origin: origin.into(), + seq: 0, + prev: None, + issued_at: LOG_TIME.into(), + root: [0; 32], + next_root: commitment(&pk(next)), + keys, + revoked_modules: vec![], + grant_max_s: 86_400, + status_max_age_s: 3_600, + sig: [0; 64], + hybrid: None, + }; + Revision::seal(&key(root), r).expect("a well-formed revision") +} + +/// The publisher's key log: both its keys, in force. +fn publisher_log() -> Revision { + log( + ORIGIN, + LOG_ROOT, + LOG_NEXT, + vec![KeyEntry::active("d1", pk(PUBLISHER), &["delivery", "transmission", "schedule"]), KeyEntry::active("d2", pk(OTHER_KEY), &["delivery"])], + ) +} + +fn logs(list: &[(&str, String)]) -> BTreeMap { + list.iter().map(|(o, t)| ((*o).to_owned(), t.clone())).collect() +} + +/// An in-band case: §8.2 over what a receiver acquired. +struct InbandCase { + name: &'static str, + description: &'static str, + inputs: InbandInputs, + outcome: Value, +} + +fn inband_exp(claims: &[&str], set: Result) -> Value { + json!({ + "outcome": "inband", + "claims": claims, + "set": match set { Ok(_) => "suffices", Err(r) => r }, + "inband_ms": set.ok(), + }) +} + +fn inband_outcome(r: &Result) -> Value { + match r { + Err(e) => refuse(e.label()), + Ok(i) => json!({ + "outcome": "inband", + "claims": i.claims.iter().map(ClaimVerdict::label).collect::>(), + "set": match i.set { Ok(_) => "suffices", Err(r) => r }, + "inband_ms": i.set.ok(), + }), + } +} + +fn inband_cases(p: &Publication) -> Vec { + let bc = broadcast(p); + let link = p.link(); + let head = || logs(&[(ORIGIN, publisher_log().to_json())]); + let case = |name, description, bearer_id: &str, claims: Vec, logs: BTreeMap, outcome| InbandCase { + name, + description, + inputs: InbandInputs { bearer_id: bearer_id.into(), group: p.group.to_json(), claims, logs }, + outcome, + }; + let declared = |ch: &mut Chains| ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)); + let set = |objects: Vec| { + let mut ch = Chains::default(); + vec![declared(&mut ch), ch.sign(PUBLISHER, link, schedule(BCAST, objects))] + }; + let one_pass = |e: &ScheduleEntry| ScheduleEntry { count: 1, ..e.clone() }; + // An earlier claim of the publisher's about another group, then the declaration and schedule. + let long_chain = || { + let mut ch = Chains::default(); + vec![ + ch.sign(PUBLISHER, other_group().link_hash(), transmission(Bearer::Unidirectional, BCAST2)), + declared(&mut ch), + ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), + ] + }; + let stands = ["declared", "stands"]; + let missing = inband_exp(&stands, Err(INBAND_KEY_LOG_MISSING)); + let mut out = vec![ + case( + "suffices", + "The declaration and the schedule, from the chain's head, with the origin's key log: the interval is the least period, 30 s.", + BCAST, + set(bc.clone()), + head(), + inband_exp(&stands, Ok(30_000)), + ), + case( + "interval_every_entry_one_pass", + "Every entry has one pass, whose periods are not read: the interval is the least duration, 1 s.", + BCAST, + set(bc.iter().map(one_pass).collect()), + head(), + inband_exp(&stands, Ok(1_000)), + ), + case( + "interval_skips_one_pass", + "Object 0 has one pass with a period of 0, object 2 repeats every 20 s and object 1 every 30 s: the least of the two read, 20 s.", + BCAST, + set(vec![ + ScheduleEntry { count: 1, period_ms: 0, ..bc[0].clone() }, + bc[1].clone(), + ScheduleEntry { period_ms: 20_000, ..bc[2].clone() }, + ]), + head(), + inband_exp(&stands, Ok(20_000)), + ), + case( + "with_an_extension", + "An earlier copy and the schedule that extends it, which adds object 3 every 20 s: one schedule stands, and the interval is the later one's.", + BCAST, + { + let mut later = bc.clone(); + later[0].count = 7; + later.push(entry(p, 3, rq(200, 40, 1), 12, Esi::Repeat, T0 + 30_000, 20_000, 1_000, 2)); + let mut ch = Chains::default(); + vec![declared(&mut ch), ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), ch.sign(PUBLISHER, link, schedule(BCAST, later))] + }, + head(), + inband_exp(&["declared", "extended", "stands"], Ok(20_000)), + ), + case( + "chain_holds_another_group", + "The chain from its head holds a claim about another group: refused at step 6 here, it breaks nothing, and the set suffices.", + BCAST, + long_chain(), + head(), + inband_exp(&["reject step=6 reason=transmission_subject_mismatch", "declared", "stands"], Ok(30_000)), + ), + case( + "chain_without_its_head", + "The same chain without its first claim: the declaration's parent is not held, so the set does not suffice.", + BCAST, + long_chain()[1..].to_vec(), + head(), + inband_exp(&["reject step=5 reason=parent_not_held", "set-aside reason=bearer_not_declared"], Err(INBAND_CHAIN_INCOMPLETE)), + ), + case( + "chain_out_of_order", + "The schedule given before the declaration it follows in the chain.", + BCAST, + { + let mut c = set(bc.clone()); + c.reverse(); + c + }, + head(), + inband_exp(&["reject step=5 reason=parent_not_held", "reject step=5 reason=chain_break"], Err(INBAND_CHAIN_INCOMPLETE)), + ), + case( + "no_schedule", + "The declaration alone: there is nothing to plan with.", + BCAST, + vec![declared(&mut Chains::default())], + head(), + inband_exp(&["declared"], Err(INBAND_NOT_SCHEDULED)), + ), + case( + "schedule_of_another_instance", + "The set of the broadcast, asked about the multicast the receiver joined.", + MCAST, + set(bc.clone()), + head(), + inband_exp(&stands, Err(INBAND_NOT_SCHEDULED)), + ), + case( + "no_declaration", + "A schedule at its chain's head with no declaration: set aside, so none stands.", + BCAST, + vec![Chains::default().sign(PUBLISHER, link, schedule(BCAST, bc.clone()))], + head(), + inband_exp(&[&format!("set-aside reason={BEARER_NOT_DECLARED}")], Err(INBAND_NOT_SCHEDULED)), + ), + case( + "contradicted", + "A later schedule that withdraws a pass: both set aside, so none stands.", + BCAST, + { + let mut ch = Chains::default(); + let mut fewer = bc.clone(); + fewer[0].count = 4; + vec![declared(&mut ch), ch.sign(PUBLISHER, link, schedule(BCAST, bc.clone())), ch.sign(PUBLISHER, link, schedule(BCAST, fewer))] + }, + head(), + { + let c = format!("set-aside reason={SCHEDULE_CONTRADICTED}"); + inband_exp(&["declared", &c, &c], Err(INBAND_NOT_SCHEDULED)) + }, + ), + case("key_log_absent", "No key log acquired.", BCAST, set(bc.clone()), logs(&[]), missing.clone()), + case( + "key_log_of_another_origin", + "A key log of another origin only, under its own name.", + BCAST, + set(bc.clone()), + logs(&[(OTHER_ORIGIN, log(OTHER_ORIGIN, OTHER_ROOT, OTHER_NEXT, vec![KeyEntry::active("d1", pk(PUBLISHER), &["delivery"])]).to_json())]), + missing.clone(), + ), + case( + "key_log_names_another_origin", + "Another origin's revision acquired at the publisher's location: not held.", + BCAST, + set(bc.clone()), + logs(&[(ORIGIN, log(OTHER_ORIGIN, OTHER_ROOT, OTHER_NEXT, vec![KeyEntry::active("d1", pk(PUBLISHER), &["delivery"])]).to_json())]), + missing.clone(), + ), + case( + "key_log_signature_broken", + "The publisher's key log with its signature broken: not held.", + BCAST, + set(bc.clone()), + { + let mut r = publisher_log(); + r.sig[0] ^= 1; + logs(&[(ORIGIN, r.to_json())]) + }, + missing.clone(), + ), + case("key_log_not_read", "A file at the key log's location that is no revision.", BCAST, set(bc.clone()), logs(&[(ORIGIN, "{}".into())]), missing.clone()), + case( + "key_log_lacks_the_key", + "The publisher's key log, listing only its other key.", + BCAST, + set(bc.clone()), + logs(&[(ORIGIN, log(ORIGIN, LOG_ROOT, LOG_NEXT, vec![KeyEntry::active("d2", pk(OTHER_KEY), &["delivery"])]).to_json())]), + missing, + ), + case( + "key_log_revokes_the_key", + "A held log that revokes the schedule's key lists it: the set suffices, and what the log says of the key is confirmation's (bearer-receipts §8.3).", + BCAST, + set(bc.clone()), + logs(&[( + ORIGIN, + log( + ORIGIN, + LOG_ROOT, + LOG_NEXT, + vec![KeyEntry { status: EntryStatus::Revoked, compromised_since: Some(COMPROMISED.into()), ..KeyEntry::active("d1", pk(PUBLISHER), &["delivery", "schedule"]) }], + ) + .to_json(), + )]), + inband_exp(&stands, Ok(30_000)), + ), + ]; + let mut broken = p.group.to_json(); + let sig = broken["sig"].as_str().expect("a group signature"); + let flipped = format!("{}{}", if sig.starts_with('0') { '1' } else { '0' }, &sig[1..]); + broken["sig"] = flipped.into(); + out.push(InbandCase { + name: "group_refused", + description: "A group whose signature is broken: nothing is derived.", + inputs: InbandInputs { bearer_id: BCAST.into(), group: broken, claims: set(bc.clone()), logs: head() }, + outcome: refuse("signature_verify_failed"), + }); + out +} + fn statement_value(s: &Option) -> Value { match s { None => Value::Null, @@ -930,12 +1361,13 @@ fn verdict_value(c: &VerdictCase) -> Value { pub fn generate() -> Vec<(String, String)> { let p = publish(); let mut keys = Map::new(); - for (name, seed) in [("publisher", PUBLISHER), ("publisher_d2", OTHER_KEY), ("sink", SINK)] { + for (name, seed) in [("publisher", PUBLISHER), ("publisher_d2", OTHER_KEY), ("sink", SINK), ("log_root", LOG_ROOT), ("other_log_root", OTHER_ROOT)] { keys.insert(name.into(), hex(&pk(seed)).into()); } let doc = json!({ "about": "Conformance corpus of extensions/carousel.md (wai.bearer.carousel): the schedule claim (jwp-receipts §2.4.16), \ - when a receiver within a loss bound holds each object (§6), and the passes a receiver listens to (§7). Every \ + a later schedule that extends an earlier one (§4.5), when a receiver within a loss bound holds each object (§6), \ + the passes a receiver listens to (§7), and whether what a receiver acquired on an instance suffices (§8.2). Every \ key is Ed25519 from a fixed 32-byte seed and attests nothing; envelopes carry opaque test payloads of exact \ lengths; bearer instances use the example URN namespace and origins reserved example domains. Each case \ states the outcome it was written to have, declared in the generator. Regenerate with `wai_carousel_vectors gen`.", @@ -952,6 +1384,15 @@ pub fn generate() -> Vec<(String, String)> { "held": c.held, "outcome": c.outcome, })).collect::>(), + "inband": inband_cases(&p).iter().map(|c| json!({ + "name": c.name, + "description": c.description, + "bearer_id": c.inputs.bearer_id, + "group": c.inputs.group, + "claims": c.inputs.claims, + "logs": Value::Object(c.inputs.logs.iter().map(|(o, t)| (o.clone(), Value::String(t.clone()))).collect()), + "outcome": c.outcome, + })).collect::>(), }); let mut s = serde_json::to_string_pretty(&doc).expect("serialises"); s.push('\n'); @@ -1007,6 +1448,13 @@ fn plan_of(c: &Value) -> Result, String> { Ok(plan(&e, n("at_ms")?, n("loss_ppm")?, n("overhead")?, &held)) } +/// An in-band case's inputs, as the corpus writes them. +fn inband_inputs_of(c: &Value) -> Result { + let claims = c["claims"].as_array().ok_or("claims")?.iter().map(|w| w.as_str().map(str::to_owned).ok_or("claim")).collect::>()?; + let logs = c["logs"].as_object().ok_or("logs")?.iter().map(|(o, t)| Ok((o.clone(), t.as_str().ok_or("a log")?.to_owned()))).collect::>()?; + Ok(InbandInputs { bearer_id: c["bearer_id"].as_str().ok_or("bearer_id")?.to_owned(), group: c["group"].clone(), claims, logs }) +} + fn strings(v: &Value, out: &mut Vec) { match v { Value::String(s) => out.push(s.clone()), @@ -1026,8 +1474,8 @@ pub fn verify(files: &BTreeMap) -> Vec { Err(e) => return vec![format!("vectors.json: {e}")], }; let empty = Vec::new(); - let [verdicts, claims, plans] = ["verdicts", "claims", "plans"].map(|k| doc[k].as_array().unwrap_or(&empty)); - if verdicts.is_empty() || claims.is_empty() || plans.is_empty() { + let [verdicts, claims, plans, sets] = ["verdicts", "claims", "plans", "inband"].map(|k| doc[k].as_array().unwrap_or(&empty)); + if verdicts.is_empty() || claims.is_empty() || plans.is_empty() || sets.is_empty() { fails.push("the corpus lacks a kind of case".into()); } let mut stated = Vec::new(); @@ -1065,6 +1513,19 @@ pub fn verify(files: &BTreeMap) -> Vec { } strings(&c["outcome"], &mut stated); } + for c in sets { + let name = c["name"].as_str().unwrap_or("?"); + match inband_inputs_of(c) { + Err(e) => fails.push(format!("{name}: {e}")), + Ok(i) => { + let got = inband_outcome(&inband(&i)); + if got != c["outcome"] { + fails.push(format!("{name}: stated {} got {got}", c["outcome"])); + } + } + } + strings(&c["outcome"], &mut stated); + } for code in CODES { if !stated.iter().any(|s| s == code || s.ends_with(&format!("reason={code}"))) { fails.push(format!("no case gives {code}")); diff --git a/wai/wai-rs/src/claim_receipt/schedule.rs b/wai/wai-rs/src/claim_receipt/schedule.rs index 1722b9bf0..12e374d27 100644 --- a/wai/wai-rs/src/claim_receipt/schedule.rs +++ b/wai/wai-rs/src/claim_receipt/schedule.rs @@ -4,7 +4,8 @@ //! //! This file holds steps 2 and 4 of jwp-receipts §3.1 for the class — its body's members and //! types, and carousel §4.2 with §5's admissibility of each code's parameters — and step 6, -//! its checks against the group receipt and the object receipts (§4.3). What a verifier +//! its checks against the group receipt and the object receipts (§4.3, and cache-authority §5.6 +//! for a node's own schedule), and when one schedule extends another (§4.5). What a verifier //! derives from a schedule, and what a receiver plans with one, is `crate::carousel`'s. use super::*; @@ -317,6 +318,16 @@ impl ScheduleEntry { self.to_value() } + /// Carousel §4.5: whether this entry's passes begin with `earlier`'s, at the same instants and + /// sending the same symbols. Its members are `earlier`'s but `count`, which is at least + /// `earlier`'s, and `period_ms`, which may differ only where `earlier` has one pass, whose + /// period is not read. + pub fn extends(&self, earlier: &ScheduleEntry) -> bool { + self.count >= earlier.count + && (earlier.count == 1 || self.period_ms == earlier.period_ms) + && ScheduleEntry { count: earlier.count, period_ms: earlier.period_ms, ..self.clone() } == *earlier + } + /// Step 2: the members, then each one's type in the table's order, `oti`'s members as the /// code `fec` names reads them. fn read(v: &Value) -> Result { @@ -422,6 +433,16 @@ impl ScheduleClaim { pub fn entry(&self, i: u64) -> Option<&ScheduleEntry> { self.objects.iter().find(|e| e.leaf_index == i) } + + /// Carousel §4.5: whether this schedule extends `earlier`, of the same instance: for every + /// entry of `earlier` it has an entry of that object that extends it + /// ([`ScheduleEntry::extends`]). It may have entries for objects `earlier` has none for. + /// Every schedule extends itself. + pub fn extends(&self, earlier: &ScheduleClaim) -> bool { + self.bearer_id == earlier.bearer_id + && self.attests == earlier.attests + && earlier.objects.iter().all(|a| self.entry(a.leaf_index).is_some_and(|b| b.extends(a))) + } } impl ClaimReceipt { @@ -437,6 +458,18 @@ impl ClaimReceipt { /// entry's content hash (`schedule_content_mismatch`) and, where its bytes are held, the /// entry's transfer length (`schedule_length_mismatch`). pub fn check_schedule_against(&self, group: &GroupReceipt, objects: &[(&ObjectReceipt, Option<&[u8]>)]) -> Result<(), Rejection> { + self.check_schedule_context(group, objects, true) + } + + /// Step 6 for a node's schedule of its own instance (cache-authority §5.6): carousel §4.3 + /// but for its step 2, since a node's key, not the group's, signs it. Whose schedule it is, + /// and where it stands, is `crate::cache_authority`'s; this checks it against the group as + /// [`ClaimReceipt::check_schedule_against`] does in every other step. + pub fn check_node_schedule_against(&self, group: &GroupReceipt, objects: &[(&ObjectReceipt, Option<&[u8]>)]) -> Result<(), Rejection> { + self.check_schedule_context(group, objects, false) + } + + fn check_schedule_context(&self, group: &GroupReceipt, objects: &[(&ObjectReceipt, Option<&[u8]>)], publisher: bool) -> Result<(), Rejection> { let ClaimBody::Schedule(s) = &self.body else { return Err(Rejection::at(6, Reason::ContextMismatch)); }; @@ -449,7 +482,7 @@ impl ClaimReceipt { if group.link_hash() != self.subject { return at(Reason::ScheduleSubjectMismatch); } - if group.signer_pubkey != self.signer_pubkey { + if publisher && group.signer_pubkey != self.signer_pubkey { return at(Reason::ScheduleSignerMismatch); } if s.objects.iter().any(|e| e.leaf_index >= group.leaf_count) { @@ -553,4 +586,51 @@ mod tests { assert!(nc(NO_CODE_FIELD, 1, 1).admitted(), "65,536 blocks"); assert!(!nc(NO_CODE_FIELD + 1, 1, 1).admitted(), "a block past the SBN field"); } + + fn entry(leaf_index: u64, count: u64, period_ms: u64) -> ScheduleEntry { + ScheduleEntry { + leaf_index, + content_hash: [leaf_index as u8; 32], + oti: rq(1000, 64, 2, 1, 4), + repair: 4, + esi: Esi::Advance, + first_ms: 1_000_000, + period_ms, + duration_ms: 2_000, + count, + } + } + + fn sched(objects: Vec) -> ScheduleClaim { + ScheduleClaim { bearer_id: "urn:example:b".into(), objects, attests: ATTESTS_SCHEDULED.into() } + } + + #[test] + fn an_entry_extends_one_whose_passes_it_begins_with() { + let a = entry(0, 3, 10_000); + assert!(a.extends(&a), "itself"); + assert!(entry(0, 5, 10_000).extends(&a), "more passes"); + assert!(!a.extends(&entry(0, 5, 10_000)), "fewer passes"); + assert!(!entry(0, 5, 12_000).extends(&a), "a later pass moved"); + assert!(entry(0, 4, 12_000).extends(&entry(0, 1, 0)), "one pass: its period is not read"); + assert!(!entry(0, 4, 12_000).extends(&entry(0, 2, 0)), "two passes: the period is read"); + let moved = ScheduleEntry { first_ms: 1_000_001, ..entry(0, 5, 10_000) }; + assert!(!moved.extends(&a), "the first pass moved"); + let more_repair = ScheduleEntry { repair: 5, ..entry(0, 5, 10_000) }; + assert!(!more_repair.extends(&a), "other symbols"); + let longer = ScheduleEntry { duration_ms: 2_001, ..entry(0, 5, 10_000) }; + assert!(!longer.extends(&a), "a longer pass"); + } + + #[test] + fn a_schedule_extends_one_whose_every_entry_it_extends() { + let a = sched(vec![entry(0, 3, 10_000)]); + assert!(a.extends(&a)); + assert!(sched(vec![entry(0, 3, 10_000), entry(2, 1, 0)]).extends(&a), "an object added"); + assert!(sched(vec![entry(0, 4, 10_000), entry(2, 1, 0)]).extends(&a), "an object added and a pass"); + assert!(!sched(vec![entry(2, 1, 0)]).extends(&a), "an object dropped"); + assert!(!sched(vec![entry(0, 3, 10_000), entry(2, 1, 0)]).extends(&sched(vec![entry(0, 4, 10_000)])), "a pass withdrawn"); + let other = ScheduleClaim { bearer_id: "urn:example:c".into(), ..a.clone() }; + assert!(!other.extends(&a), "another instance"); + } } diff --git a/wai/wai-rs/src/timeliness.rs b/wai/wai-rs/src/timeliness.rs index eae3bb583..8f2e0fa21 100644 --- a/wai/wai-rs/src/timeliness.rs +++ b/wai/wai-rs/src/timeliness.rs @@ -217,6 +217,9 @@ pub enum ClaimVerdict { Declared, /// A schedule that stands (a plan's). Stands, + /// A schedule a later schedule of its instance extends (carousel §4.5), with another body (a + /// plan's). + Extended, /// A declaration or a schedule accepted and set aside for the reason given (a plan's). SetAside(&'static str), } @@ -228,6 +231,7 @@ impl ClaimVerdict { ClaimVerdict::Accepted => "accepted".into(), ClaimVerdict::Declared => "declared".into(), ClaimVerdict::Stands => "stands".into(), + ClaimVerdict::Extended => "extended".into(), ClaimVerdict::SetAside(r) => format!("set-aside reason={r}"), } } @@ -624,11 +628,14 @@ pub(crate) fn planned(inp: &PlanInputs) -> Result<(PlanVerdict, Vec Option { diff --git a/wai/wai-rs/src/timeliness/corpus.rs b/wai/wai-rs/src/timeliness/corpus.rs index de8b833ed..ba09f2381 100644 --- a/wai/wai-rs/src/timeliness/corpus.rs +++ b/wai/wai-rs/src/timeliness/corpus.rs @@ -222,6 +222,11 @@ fn transmission(bearer: Bearer, id: &str) -> ClaimBody { /// every ten seconds from T0. Within the plans' loss bound a receiver gets 5 symbols a pass and /// needs K′ + 2 = 12, so it holds the object after three passes. fn schedule(p: &Publication, id: &str, objects: &[usize]) -> ClaimBody { + schedule_of(p, id, objects, 10) +} + +/// The same schedule with `count` passes. +fn schedule_of(p: &Publication, id: &str, objects: &[usize], count: u64) -> ClaimBody { let entries = objects .iter() .map(|&i| ScheduleEntry { @@ -233,7 +238,7 @@ fn schedule(p: &Publication, id: &str, objects: &[usize]) -> ClaimBody { first_ms: T0, period_ms: 10_000, duration_ms: 1_000, - count: 10, + count, }) .collect(); ClaimBody::Schedule(ScheduleClaim { bearer_id: id.into(), objects: entries, attests: ATTESTS_SCHEDULED.into() }) @@ -1363,6 +1368,39 @@ fn plan_cases(g: &Groups) -> Vec { json!({ "claims": ["declared", format!("set-aside reason={}", crate::carousel::SCHEDULE_ON_BIDIRECTIONAL), "accepted"], "records": ["stands"], "choices": [no_source()] }), ); } + { + let mut ch = Chains::default(); + let mut i = base(at(T0), vec![bearer(B2)], &[0]); + i.claims = vec![ + ch.sign(PUBLISHER, gl, transmission(Bearer::Unidirectional, B2)), + ch.sign(PUBLISHER, gl, schedule_of(&g.g, B2, &[0, 1, 2], 2)), + ch.sign(PUBLISHER, gl, schedule_of(&g.g, B2, &[0, 1, 2], 3)), + ch.sign(PUBLISHER, gl, main()), + ]; + push( + "plan_bearer_extended", + "Two passes on b2, too few for the 12 symbols a receiver needs, then a schedule that extends them to three (carousel §4.5): the plan reads the later, and its third pass delivers.", + i, + json!({ "claims": ["declared", "extended", "stands", "accepted"], "records": ["stands"], "choices": [choice("on_time", "primary", 0, pass_end(3), 1_000_000)] }), + ); + } + { + let mut ch = Chains::default(); + let mut i = base(at(T0), vec![bearer(B2)], &[0]); + i.claims = vec![ + ch.sign(PUBLISHER, gl, transmission(Bearer::Unidirectional, B2)), + ch.sign(PUBLISHER, gl, schedule_of(&g.g, B2, &[0, 1, 2], 3)), + ch.sign(PUBLISHER, gl, schedule_of(&g.g, B2, &[0, 1, 2], 2)), + ch.sign(PUBLISHER, gl, main()), + ]; + let c = format!("set-aside reason={}", crate::carousel::SCHEDULE_CONTRADICTED); + push( + "plan_bearer_withdrawn", + "The same two schedules in the other order: the later withdraws a pass, both are set aside, and no source.", + i, + json!({ "claims": ["declared", c, c, "accepted"], "records": ["stands"], "choices": [no_source()] }), + ); + } push( "wanted_without_intent", "Object 3, which no entry states.", @@ -1441,6 +1479,51 @@ fn plan_cases(g: &Groups) -> Vec { planned(vec![choice("on_time", "primary", 0, T0 + 5_000, 1_000_000)]), ); + // A ladder read over a schedule a later one extends (carousel §4.5): F's two passes on b2 are + // too few for the 12 symbols a receiver needs, and the third is what reaches rung 1. + let ladder_on_b2 = |counts: [u64; 2]| { + let mut ch = Chains::default(); + let mut i = base(at(T0), vec![origin(66_000), bearer(B2)], &[0]); + i.claims = vec![ + ch.sign(PUBLISHER, fl, transmission(Bearer::Unidirectional, B2)), + ch.sign(PUBLISHER, fl, schedule_of(&g.f, B2, &[0, 1, 2, 3], counts[0])), + ch.sign(PUBLISHER, fl, schedule_of(&g.f, B2, &[0, 1, 2, 3], counts[1])), + ch.sign(PUBLISHER, gl, timeliness(vec![e0_ladder(g)])), + ]; + i.records = vec![]; + i + }; + push( + "ladder_rung_on_extended_schedule", + "The primary six seconds late (300,000), no route to rung 0, and rung 1 on b2 under a schedule extended from two passes to three: the plan reads the later, and rung 1 arrives at T0 + 21 s.", + ladder_on_b2([2, 3]), + json!({ "claims": ["declared", "extended", "stands", "accepted"], "records": [], "choices": [rung_choice(1, 1, pass_end(3), 400_000)] }), + ); + { + let c = format!("set-aside reason={}", crate::carousel::SCHEDULE_CONTRADICTED); + push( + "ladder_rung_on_withdrawn_schedule", + "The same two schedules in the other order: the later withdraws a pass, both are set aside, b2 delivers no rung, and the late primary is taken.", + ladder_on_b2([3, 2]), + json!({ "claims": ["declared", c, c, "accepted"], "records": [], "choices": [choice("after_deadline", "primary", 0, D + 6_000, 300_000)] }), + ); + } + { + let mut i = ladder_on_b2([2, 3]); + let mut ch = Chains::default(); + i.claims = vec![ + ch.sign(PUBLISHER, fl, transmission(Bearer::Unidirectional, B2)), + ch.sign(PUBLISHER, fl, schedule_of(&g.f, B2, &[0, 1, 2, 3], 2)), + ch.sign(PUBLISHER, gl, timeliness(vec![e0_ladder(g)])), + ]; + push( + "ladder_rung_before_extension", + "The earlier schedule alone, its two passes too few: no rung arrives, so the extension above is what brings rung 1 in reach.", + i, + json!({ "claims": ["declared", "stands", "accepted"], "records": [], "choices": [choice("after_deadline", "primary", 0, D + 6_000, 300_000)] }), + ); + } + let sources_case = |sources: Vec| base(at(T0), sources, &[0]); for (name, description, sources) in [ ("sources_empty", "No source.", vec![]), @@ -1809,6 +1892,26 @@ fn run_cases(g: &Groups) -> Vec { ); } + { + // A run does not date its claims (§7.5.1): every plan reads the last schedule of b2. + let fl = g.f.link(); + let mut ch = Chains::default(); + let claims = vec![ + ch.sign(PUBLISHER, fl, transmission(Bearer::Unidirectional, B2)), + ch.sign(PUBLISHER, fl, schedule_of(&g.f, B2, &[0, 1, 2, 3], 2)), + ch.sign(PUBLISHER, fl, schedule_of(&g.f, B2, &[0, 1, 2, 3], 3)), + ch.sign(PUBLISHER, gl, timeliness(vec![e0_ladder(g), e1(g), e2(g)])), + ]; + let plans = vec![plan_at(T0, vec![origin(66_000), bearer(B2)], &[0])]; + let i = RunInputs { groups: vec![g.g.receipts(), g.f.receipts()], claims, records: vec![], loss: Some((LOSS, OVERHEAD)), plans, arrivals: vec![got(&g.f, 0, pass_end(3))] }; + push( + "run_ladder_rung_on_extended_schedule", + "Rung 1 on b2 under a schedule extended from two passes to three: fetched from T0, held at the end of the third, presented at the deadline at 400,000.", + i, + ran(vec![vec![rung_choice(1, 1, pass_end(3), 400_000)]], vec![fetch_rung(T0, 0, 0, 1, 1), show_rung(D, 0, 0, 1, 400_000)]), + ); + } + // §7.5.1, each rule, in its order. let (plans_invalid, arrivals_invalid) = (scheduler::PLANS_INVALID, scheduler::ARRIVALS_INVALID); let bad_arrivals = || vec![got(&g.g, 0, T0 + 5), got(&g.g, 1, T0 + 1)]; diff --git a/wai/wai-rs/tests/carousel.rs b/wai/wai-rs/tests/carousel.rs index 89dffccb1..a7c335ac7 100644 --- a/wai/wai-rs/tests/carousel.rs +++ b/wai/wai-rs/tests/carousel.rs @@ -162,7 +162,8 @@ fn each_raptorq_object_decodes_from_what_a_receiver_within_its_bound_holds() { .iter() .filter(|s| s["body"]["bearer_id"] == line["bearer_id"]) .flat_map(|s| s["body"]["objects"].as_array().expect("entries").iter()) - .find(|o| o["leaf_index"] == line["leaf_index"]) + // The schedule that stands is the last of its instance (§6.2 step 4). + .rfind(|o| o["leaf_index"] == line["leaf_index"]) .map(|o| ScheduleEntry::from_value(o).expect("an entry that stands")) .expect("the entry of a line"); if !matches!(entry.oti, Oti::RaptorQ { .. }) { -- 2.54.0 (Apple Git-157) From 1e1e3a4ed087dd4ab3353e63022d004f423c056e Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 5 Nov 2026 12:07:02 -0500 Subject: [PATCH 2/4] =?UTF-8?q?wai:=20a=20=C2=A79=20line=20of=20cache-auth?= =?UTF-8?q?ority=20with=20a=20ladder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cache-authority §9 derives timeliness §6.3's lines for an entry from all three kinds of held-at statement. Its text and its corpus still spoke of one fallback. The text now reads every rung, and states a ladder's line as timeliness §6.3 does, the list of each rung's least instant. The corpus writes a line through timeliness' own form, which it did not: an array's instants were lost. The case timeliness_line_ladder holds a rung in the group and a rung in another: each held alone, on time over both, and the first late with the second in time. wai-rs and cache_authority_verify.py reach it, the verifier with two more mutated copies and a weakened check that reads only the first rung. Co-Authored-By: Claude Opus 5.5 --- ...rousel-extension-in-band-cache-schedule.md | 2 + wai/extensions/cache-authority.md | 19 +- .../cache-authority/vectors.json | 173 ++++++++++++++++++ .../cache_authority_verify.py | 18 +- wai/wai-rs/src/cache_authority/corpus.rs | 39 +++- wai/wai-rs/src/timeliness/corpus.rs | 2 +- 6 files changed, 236 insertions(+), 17 deletions(-) diff --git a/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md b/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md index 6d98db698..a6554ea7b 100644 --- a/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md +++ b/wai/changes/2026-11-05-carousel-extension-in-band-cache-schedule.md @@ -21,6 +21,8 @@ (`cache_schedule_signer_mismatch`) and contradicts nothing. A statement of carousel §6.4 offered with a loss bound and an overhead is held to the schedule that stands there. A node's schedule credits nothing, and carousel's verdict and timeliness' plan read the publisher's schedules alone. +- **A §9 line with a ladder** (cache-authority §9): the lines of a timeliness entry derived from all three kinds of + held-at statement read every rung of a ladder, and state its list of instants as timeliness §6.3 does. - **Breaking:** `api:rust:wai::carousel::ClaimVerdict::Extended` and `api:rust:wai::timeliness::ClaimVerdict::Extended`: a schedule a later one extends is a new label, not `stands`. A match over either enum takes the new arm. - **Breaking:** `api:rust:wai::cache_authority::ClaimVerdict::Stands` and `api:rust:wai::cache_authority::ClaimVerdict::Extended`: diff --git a/wai/extensions/cache-authority.md b/wai/extensions/cache-authority.md index 742873515..fdb8d6af0 100644 --- a/wai/extensions/cache-authority.md +++ b/wai/extensions/cache-authority.md @@ -635,17 +635,18 @@ a loss bound; a relying party may hold both. The asker's plan of whom to fetch f the statement it answers (its §6.4) read holdings records alone. A verifier that holds this text's inputs (§7.1, §8.2) and a timeliness claim **MAY** derive the lines of the claim's entry for object *i* by timeliness §6.3 from held-at statements of all three kinds: - - the holdings records' exactly as timeliness §6.2 step 5 derives them, for the primary and its - fallback whatever envelopes the verifier holds, with a line for each holder with a record that - stands and has an entry for the group or the fallback's group; + - the holdings records' exactly as timeliness §6.2 step 5 derives them, for the primary and each + rung of its fallback whatever envelopes the verifier holds, with a line for each holder with a + record that stands and has an entry for the group or a rung's group; - those §8.3 derives from acknowledgements and counted reconciliations, for every object of the - group the verifier holds `delivered-verified`, the primary and a fallback in the group among - them, with a line for each key with one. A fallback in another group is held by records alone, + group the verifier holds `delivered-verified`, the primary and a rung in the group among + them, with a line for each key with one. A rung in another group is held by records alone, since this text judges one group. The claim is checked as §8.2 step 6 checks a deadline's, and a claim refused there, or with no - entry for *i*, derives no lines (`deadline_not_stated`). A fallback rendition is another object - with its own content hash, so it has its own tally and is never a hit for the primary. + entry for *i*, derives no lines (`deadline_not_stated`). A rung is another object with its own + content hash, so it has its own tally and is never a hit for the primary. A line's form is + timeliness §6.3's: a ladder written as an array states the least instant of each rung. - **rung-price**: it owns price, direction and a price list's `footprint`, in the region codes of its §2, which §8.1 uses. It carries no deadline and no miss target, so the tally takes the deadline, the target and the population as stated inputs and reports the population's digest (and @@ -751,7 +752,9 @@ regions are ISO 3166-1's user-assigned codes. It has: derived. - **Lines** (§9): from an acknowledgement and from a counted reconciliation; from a holdings record whose object's envelope is not held; with a fallback in another group that a holder's record - alone names; and with a fallback in the group, held by an acknowledgement and a reconciliation. + alone names; with a fallback in the group, held by an acknowledgement and a reconciliation; and with + a ladder of a rung in the group and a rung in another, the first rung and the second each held + alone, and the first late with the second in time. The population bound of 220 keys is carried by no case; both implementations check it themselves. diff --git a/wai/live-conformance/cache-authority/vectors.json b/wai/live-conformance/cache-authority/vectors.json index 41bcd17f5..2363a6100 100644 --- a/wai/live-conformance/cache-authority/vectors.json +++ b/wai/live-conformance/cache-authority/vectors.json @@ -21314,6 +21314,179 @@ "value_ppm": 1000000 } ] + }, + { + "name": "timeliness_line_ladder", + "description": "GF's object 1 has a ladder: its object 2, a floor of it, at 700,000, then G9's object 1 at 400,000. R1 reconciles the primary and the first rung over sat: on time. R3 acknowledges the first rung alone: replaced at 700,000. R4's only record holds the second rung: replaced at 400,000. R2 acknowledges the first rung after the deadline and its record holds the second before it: the first rung held by the deadline is the lower, 400,000.", + "group": { + "kind": "group", + "track_alias": 5, + "group_id": 1, + "root_hash": "667151e1a2056ba9daa78e0f94365b7fd7161116fd590b6f32f6f15961560932", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-03T10:00:00Z", + "group_end": "2026-11-03T10:00:10Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "a005c86b0be800864a6258eb3ce84212298a01927f1b5df3107f797f7283d397b7ec4a3398a8c744521bab98a17319fbb40a0ac937a2f9428294d2cd9bd85c0d", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 5, + "group_id": 1, + "object_id": 0, + "content_hash": "d3799699e26c4d2f7681a6a01933dd21a4f87736b665858d94edd2e2f1e91064", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "c1b3ae646deb73c965c8ee7ac7ed3d00982d89a9717278a38cd5a58abdf5294b", + "14de2a571582e1bb7fb3ba7948320b1114257b4578aa16680cf809128049c54f" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 5, + "group_id": 1, + "object_id": 1, + "content_hash": "b8c5c5e7f0103246ca40552d165c5f58c0fe7daea82a216ca8ffbb415eb9c58b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "40e027618aa3988a10c71c28c72a3b4122bc51d0d311a77d78f48d66e606f123", + "14de2a571582e1bb7fb3ba7948320b1114257b4578aa16680cf809128049c54f" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d320700004ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5f" + }, + { + "receipt": { + "kind": "object", + "track_alias": 5, + "group_id": 1, + "object_id": 2, + "content_hash": "54e29ca34670089e9ffec54f2123a6d35fed86638ce1f9e3bd74c2893f9d72dc", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "c519485151d19022e268b06db828a739ccbff419b67357295160915de4e1ff3a", + "53e8c0a9ccc5246f50ef3531a0c8e77eaaac6a9c0aac6d551f5241f4218443a4" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931720100007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22646572697665645f66726f6d223a7b226d6f746966223a2262386335633565376630313033323436636134303535326431363563356635386330666537646165613832613231366361386666626234313565623963353862222c226d6f7469665f6361706162696c697479223a227761692e746578742e7a737464222c2272656e6465726572223a22666c6f6f72222c2273657474696e6773223a2233313130636462306463363230633463663639646464366461303038626532396665633131663330333738653937616534356161343639653235346237623764227d2c22746172676574223a6e756c6c7d520600005de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd0" + }, + { + "receipt": { + "kind": "object", + "track_alias": 5, + "group_id": 1, + "object_id": 3, + "content_hash": "98d3134c512215ebac79a7e1a5658d6997b63eee3ba37d95d3c117469171535b", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9e8c80b6a14c48739539381de6b9b56bb1c5801c7465d31da7b10382fbd36354", + "53e8c0a9ccc5246f50ef3531a0c8e77eaaac6a9c0aac6d551f5241f4218443a4" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"https://bearer.example/sat\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-03T10:00:30Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"297587f2d7391236e7f5ccf92548f86a7d649899be842f633050f45ea42b71ce97397c33e2a40ee905ce7fc266ecadc6ebde167db54f32d3d858dcf23de58d00\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"aacbb6f21ad34ccf7e4e77af75eeed40f075006599a715540a2d863f6a73d03e\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"received\",\"bearer\":\"unidirectional\",\"bearer_id\":\"https://bearer.example/sat\",\"leaf_count\":4,\"received\":\"60\",\"received_root\":\"629299c261315c9a0373ba8ca2c0496a027585f4754e3e125486a915634f9146\"},\"class\":\"reconciliation\",\"issued_at\":\"2026-11-03T11:30:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"87b46331236f733cc1d264535901befe4f2f4f8e6383898d58ea7f9948288cc20c7fa5ca7e0513fa2998dece44721c238380b0055d710129d6026ff6b6891a08\",\"signer_id\":\"did:key:z6MkjJRuJtMxfTErK55eWeV7FQLLxpsvzSUQ3AC6DmdNPFja\",\"signer_pubkey\":\"48075a597e721a156e2e0799de5cc0c5324dc6e7eaf1cdd46250868ec53215dd\",\"subject\":\"aacbb6f21ad34ccf7e4e77af75eeed40f075006599a715540a2d863f6a73d03e\",\"subject_type\":\"receipt\"}" + ], + "sink": null, + "assertion": null, + "count_only": null, + "heads": { + "https://operator.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c3\",\"key\":\"74f85cda34d1c27c4621484731e91579c3d9c6cfc0d94b281aa11e9162058aa9\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c4\",\"key\":\"58936604abda112bc94933569c82f8d0cc0ddf92a3f8329f2f448f7f484a594c\",\"may_sign\":[\"cache/serve\",\"cache-transmission\"],\"status\":\"retired\",\"until\":\"2026-11-03T12:00:00Z\"},{\"compromised_since\":null,\"id\":\"c5\",\"key\":\"bed7d2ab668da3efad613998f06f7abf7875f3a6b7677a9f3ce947d77d7760a6\",\"may_sign\":[\"live/relay\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":\"2026-11-01T06:00:00Z\",\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"live/relay\"],\"status\":\"revoked\",\"until\":null},{\"compromised_since\":null,\"id\":\"c8\",\"key\":\"e92eb6054fe9bc682a1bcf3b759f65ab38a4cfbd81c4d1f3342e4cc9cded8b0b\",\"may_sign\":[\"delivery-gap\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"5042946b1913952e78a460f98e7a9c12608802a7f283dcead0aeac52fdcdc88d\",\"origin\":\"https://operator.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"e2fe2a39b7326642827d6d82d497622cd6c297fe78270eaa436b01f086b6f3cb\",\"seq\":0,\"sig\":\"06561835c6548b9dec7746edd8748bbd4149894b62b10add2a9152e818ca609c73070b1c6d449cd6412865ab17b89ab9ac027b16df9f521e8afbcf0e03f8960d\",\"status_max_age_s\":3600}", + "https://other.example": "{\"grant_max_s\":86400,\"issued_at\":\"2026-11-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"c1\",\"key\":\"884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c6\",\"key\":\"9109db55f79797a396462fb895c2adcea7e8683c2f3056c07a5475155537b73e\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"c7\",\"key\":\"ee45ecb9aca01a0abd83ef56dd985c8c874e6e7f4aebcedf20bd8d88c2a0add7\",\"may_sign\":[\"cache/serve\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"826bb9de627d79c4f9285f9e106fd4ccc013af39af3f5319e6c402ebab2053e5\",\"origin\":\"https://other.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"fec1428673f6afe89264b3807344ae8b269d125a503855202687db5a7128579f\",\"seq\":0,\"sig\":\"066876436ee285c580f65203666a296ae92be9c9e5dc0eb15b9474ad5b87570650650944c52da5d37ad0894c24350c21e357689e270c9483de28f36d57c4c304\",\"status_max_age_s\":3600}" + }, + "acknowledgements": [ + { + "record": "57444131010102884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b17cb79fb2b4120f2b1ec65e4198d6e08b28e813feb01e4a400839b85e18080cec027aadc5d5f0600006ab9dc5d5f060000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000d0070000000000009e8c80b6a14c48739539381de6b9b56bb1c5801c7465d31da7b10382fbd36354261811c7a0c3696497b53c8a8cef549b10c7b042501bc9ce2dc3a1b5dc87d8a1e303f7c105448a885def15b6cda03cb2384bfe32095a8dc8c79a6a38a6316d0a735f38fbb047a4f7d1dd94c3b8e2a1ad569051f2b34a60ed71877925efbf2d04", + "items": [ + "54e29ca34670089e9ffec54f2123a6d35fed86638ce1f9e3bd74c2893f9d72dc0000000000000000d007000000000000" + ] + }, + { + "record": "57444131010102884b8857f4eaa1613c61504db34d4beaf346517a0e31de3cddd4d9b4201d9d0b5e212c0980e4b39fc09721134aa02109374edfd260c0d3d03cb501c8d65457a9c0f400045e5f0600003710045e5f060000000000000000000000000000000000000000000000000000000000000000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000d0070000000000009e8c80b6a14c48739539381de6b9b56bb1c5801c7465d31da7b10382fbd36354261811c7a0c3696497b53c8a8cef549b10c7b042501bc9ce2dc3a1b5dc87d8a1ba8a62d9153671361ee86c9ec84734f6d6405c42db67304cada548ed7f69d9939836dee529260b96c94fe2a920b6c7d06751844078c3ffbbf15525ea83ccd506", + "items": [ + "54e29ca34670089e9ffec54f2123a6d35fed86638ce1f9e3bd74c2893f9d72dc0000000000000000d007000000000000" + ] + } + ], + "records": [ + "5748443101eb2cf13bf7ae3a5f614168a1fb09272d39771ec4b8523727815e466caf8ee163000001a1a147ca18000001a1a17eb8980000000120e9ad452eafb1db6a167c09e116a381ba58e7c0fb2093bccdf804df768940f4000000000000000900400051c10450a5a07537dec3cb22d35fd5a795fe82a786475bb6f55bd28a65a00c24c4fd9fbf9eca567471cb95db321a3a5bc4633d0f00718df72b406dfdef539006", + "57484431015e212c0980e4b39fc09721134aa02109374edfd260c0d3d03cb501c8d65457a9000001a1a147c630000001a1a17eb4b00000000120e9ad452eafb1db6a167c09e116a381ba58e7c0fb2093bccdf804df768940f40000000000000009004000f8b7f21e2492b5da103186dc38a777fe04c7e528d2467a4b05b996b2d7e75d46a69613c972b9b7893f2b05a2dab0bc07317ebb831f752db5ad1492ec0fdc890c" + ], + "claim": "{\"body\":{\"attests\":\"valued\",\"objects\":[{\"by_ms\":1793707200000,\"content_hash\":\"b8c5c5e7f0103246ca40552d165c5f58c0fe7daea82a216ca8ffbb415eb9c58b\",\"decay\":[{\"at_ms\":1793707200001,\"value_ppm\":0}],\"fallback\":[{\"content_hash\":\"54e29ca34670089e9ffec54f2123a6d35fed86638ce1f9e3bd74c2893f9d72dc\",\"group\":\"aacbb6f21ad34ccf7e4e77af75eeed40f075006599a715540a2d863f6a73d03e\",\"leaf_index\":2,\"value_ppm\":700000},{\"content_hash\":\"1197877a948ab791a6d7b5083475f3e0b07a69e6b125b3658c349be274820f1d\",\"group\":\"20e9ad452eafb1db6a167c09e116a381ba58e7c0fb2093bccdf804df768940f4\",\"leaf_index\":1,\"value_ppm\":400000}],\"from_ms\":1793700000000,\"leaf_index\":1}]},\"class\":\"timeliness\",\"issued_at\":\"2026-11-03T10:00:30Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d3b4f03e122011d405b869fe3d817fa0d5359c2e81e13ae94b451cb870d256f0c03ad982a074ec849fb9077b51d2d53f909d9e476de23ab3276e0709c43a4a03\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"aacbb6f21ad34ccf7e4e77af75eeed40f075006599a715540a2d863f6a73d03e\",\"subject_type\":\"receipt\"}", + "index": 1, + "outcome": [ + { + "holder": "17cb79fb2b4120f2b1ec65e4198d6e08b28e813feb01e4a400839b85e18080ce", + "held_ms": null, + "fallback_ms": [ + 1793706600000, + null + ], + "outcome": "replaced", + "value_ppm": 700000 + }, + { + "holder": "48075a597e721a156e2e0799de5cc0c5324dc6e7eaf1cdd46250868ec53215dd", + "held_ms": 1793705400000, + "fallback_ms": [ + 1793705400000, + null + ], + "outcome": "on_time", + "value_ppm": 1000000 + }, + { + "holder": "5e212c0980e4b39fc09721134aa02109374edfd260c0d3d03cb501c8d65457a9", + "held_ms": null, + "fallback_ms": [ + 1793707260000, + 1793707198000 + ], + "outcome": "replaced", + "value_ppm": 400000 + }, + { + "holder": "eb2cf13bf7ae3a5f614168a1fb09272d39771ec4b8523727815e466caf8ee163", + "held_ms": null, + "fallback_ms": [ + null, + 1793707199000 + ], + "outcome": "replaced", + "value_ppm": 400000 + } + ] } ] } diff --git a/wai/live-conformance/cache_authority_verify.py b/wai/live-conformance/cache_authority_verify.py index 4f8bd913c..dba5ba4a3 100644 --- a/wai/live-conformance/cache_authority_verify.py +++ b/wai/live-conformance/cache_authority_verify.py @@ -808,7 +808,7 @@ def lines(case): if got is None: return "reject reason=deadline_not_stated" entry = got[0] - rungs = TV.rungs(entry) + rungs = TV.rungs(entry)[:1] if drops("line_every_rung") else TV.rungs(entry) acks = acknowledgements(case["acknowledgements"], g) rlabels, kept = TV.records_step(case["records"], [g]) standing = [kept[x] for x in sorted(kept) if rlabels[x] == "stands"] @@ -931,6 +931,18 @@ def mutations(doc): def m_reason_gone(d): d["claims"].remove(case(d, "leaf_count_wrong")) + def m_line_ladder_form(d): + # A ladder's line reports its list. + c = case(d, "timeliness_line_ladder") + c["outcome"][0]["fallback_ms"] = c["outcome"][0]["fallback_ms"][0] + + def m_line_ladder_rung(d): + # The lower rung reported at the higher's value. + c = case(d, "timeliness_line_ladder") + for line in c["outcome"]: + if line["value_ppm"] == 400_000: + line["value_ppm"] = 700_000 + def m_schedule_label(d): case(d, "node_schedule_stands")["outcome"]["claims"][1] = "extended" @@ -948,7 +960,7 @@ def mutations(doc): return [m_until, m_least, m_receipt, m_credit, m_status, m_head, m_count_only, m_bound, m_population, m_region, m_deadline, m_ppm, m_sole, m_items, m_claim_link, m_line, m_reason_gone, m_schedule_label, m_schedule_held, - m_schedule_signer, m_schedule_reason_gone] + m_schedule_signer, m_schedule_reason_gone, m_line_ladder_form, m_line_ladder_rung] WEAKENINGS = ["rec_second", "rec_round", "ack_last_us", "ack_round", "until_inclusive", "serving", "least_origin", @@ -963,7 +975,7 @@ WEAKENINGS = ["rec_second", "rec_round", "ack_last_us", "ack_round", "until_incl "ack_order", "ack_digest", "server_earliest", "cache_earliest", "rec_before_ms", "line_fallback_acks", "line_records_verified", "line_fallback_holders", "schedule_step2", "schedule_monotone", "schedule_last", "schedule_publisher_declared", "schedule_taken", "schedule_undeclared", "schedule_signer", "held_bounds", - "held_deadline"] + "held_deadline", "line_every_rung"] def direct_checks(): diff --git a/wai/wai-rs/src/cache_authority/corpus.rs b/wai/wai-rs/src/cache_authority/corpus.rs index f9f58df93..6fe9f349b 100644 --- a/wai/wai-rs/src/cache_authority/corpus.rs +++ b/wai/wai-rs/src/cache_authority/corpus.rs @@ -15,7 +15,7 @@ use crate::claim_receipt::bearer::{ATTESTS_RECEIVED, ATTESTS_TRANSMITTED}; use crate::claim_receipt::schedule::ATTESTS_SCHEDULED; use crate::claim_receipt::timeliness::ATTESTS_VALUED; use crate::claim_receipt::{ - unhex, CacheTransmissionClaim, DecayPoint, Esi, Fallback, Oti, ReconciliationClaim, ScheduleClaim, ScheduleEntry, SessionEnergy, SubjectType, + unhex, CacheTransmissionClaim, DecayPoint, Esi, Fallback, Ladder, Oti, ReconciliationClaim, ScheduleClaim, ScheduleEntry, SessionEnergy, SubjectType, TimelinessClaim, TransmissionClaim, }; use crate::container::{Conditioning, DerivedFrom, Manifest, ModelRequirement, Wai}; @@ -2048,6 +2048,11 @@ fn lines_cases(g: &Groups) -> Vec { ch.sign(P, gf.link(), transmission(Bearer::Unidirectional, SAT)), ch.sign(R1, gf.link(), reconciliation(gf, Bearer::Unidirectional, SAT, &[1, 2])), ]; + let ladder_claims = gf_claims.clone(); + // A line of a ladder: `fallback_ms` is the list of each rung's least instant. + let rungs_line = |seed: u8, held: Option, rungs: [Option; 2], outcome: &str, value: u64| { + json!({"holder": h(seed), "held_ms": held, "fallback_ms": rungs, "outcome": outcome, "value_ppm": value}) + }; vec![ LinesCase { name: "timeliness_line_from_ack", @@ -2101,6 +2106,31 @@ fn lines_cases(g: &Groups) -> Vec { (R3, replaced(R3, D - 600_000)), ]), }, + LinesCase { + name: "timeliness_line_ladder", + description: "GF's object 1 has a ladder: its object 2, a floor of it, at 700,000, then G9's object 1 at 400,000. R1 reconciles the primary and the first rung over sat: on time. R3 acknowledges the first rung alone: replaced at 700,000. R4's only record holds the second rung: replaced at 400,000. R2 acknowledges the first rung after the deadline and its record holds the second before it: the first rung held by the deadline is the lower, 400,000.", + inputs: Inputs { + bearer: bearer_receipts::Inputs { group: gf.group.to_json(), objects: gf.held(&[1, 2]), claims: ladder_claims, ..Default::default() }, + heads: both(), + held: None, + }, + acks: vec![ack_of(gf, 2, C1, R3, E), ack_of(gf, 2, C1, R2, (D + 60_000) * 1000)], + records: vec![record(&g.g9, R4, D - 1_000, &[1]), record(&g.g9, R2, D - 2_000, &[1])], + claim: timeliness_claim_of(gf, vec![{ + let mut e = entry(gf, 1, D, None); + e.fallback = Ladder::Rungs(vec![ + Fallback { group: gf.link(), leaf_index: 2, content_hash: gf.objects[2].1.content_hash, value_ppm: 700_000 }, + Fallback { group: g.g9.link(), leaf_index: 1, content_hash: g.g9.objects[1].1.content_hash, value_ppm: 400_000 }, + ]); + e + }]), + outcome: in_key_order(vec![ + (R1, rungs_line(R1, Some(D - 1_800_000), [Some(D - 1_800_000), None], "on_time", 1_000_000)), + (R2, rungs_line(R2, None, [Some(D + 60_000), Some(D - 2_000)], "replaced", 400_000)), + (R3, rungs_line(R3, None, [Some(D - 600_000), None], "replaced", 700_000)), + (R4, rungs_line(R4, None, [None, Some(D - 1_000)], "replaced", 400_000)), + ]), + }, ] } @@ -2423,10 +2453,9 @@ fn tally_outcome(t: &Result) -> Value { fn lines_outcome(l: &Result, Refusal>) -> Value { match l { Err(r) => json!(format!("refuse reason={}", r.label())), - Ok(ls) => json!(ls - .iter() - .map(|l| json!({"holder": hex(&l.holder), "held_ms": l.held_ms, "fallback_ms": l.fallback_ms, "outcome": l.outcome.label(), "value_ppm": l.value_ppm})) - .collect::>()), + // A line's form is timeliness' own: `fallback_ms` is the list of each rung's instant for a + // ladder. + Ok(ls) => json!(ls.iter().map(crate::timeliness::corpus::line_value).collect::>()), } } diff --git a/wai/wai-rs/src/timeliness/corpus.rs b/wai/wai-rs/src/timeliness/corpus.rs index ba09f2381..76b93b37d 100644 --- a/wai/wai-rs/src/timeliness/corpus.rs +++ b/wai/wai-rs/src/timeliness/corpus.rs @@ -2156,7 +2156,7 @@ pub fn plan_inputs_of(c: &Value) -> Result { } /// A line (§6.3): *f* is one instant for a ladder of one rung, and the list of them for more. -fn line_value(l: &Line) -> Value { +pub(crate) fn line_value(l: &Line) -> Value { let f = if l.rungs_ms.len() > 1 { json!(l.rungs_ms) } else { json!(l.fallback_ms) }; json!({ "holder": hex(&l.holder), "held_ms": l.held_ms, "fallback_ms": f, "outcome": l.outcome.label(), "value_ppm": l.value_ppm }) } -- 2.54.0 (Apple Git-157) From d9af1781c98440628b423ef8c2057a83ddb09b77 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 5 Nov 2026 11:39:53 -0500 Subject: [PATCH 3/4] wai: a schedule names Raptor (RFC 5053), the code MBMS download uses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Carousel §4.1, §5.5: an entry's fec may be raptor (FEC Encoding ID 1), with RFC 5053's F, T, Z, N and Al, held to its fields and to its block sizes, 4 to 8,192 source symbols, with ESIs in 16 bits. 3GPP TS 26.346 §7.2.2 requires a receiver of MBMS download to support the code. Carousel §5.3: RFC 5053 states no bound on a decoder's failure. An independent implementation failed on 14 to 31 blocks in 100 at K + 2, so a Raptor block is held at K and a margin set by measurement, 8, 16 or 28 at overhead 0, 1 or 2, and failure_one_in is null. tests/carousel.rs decodes each Raptor object a case holds available with that implementation, a new development dependency, holds a fixed sample of it to the measurement, and keeps the measurement as an ignored test. no-code stays the default, and carousel §11 keeps the IETF's disclosures on RFC 5053 for implementers. Co-Authored-By: Claude Opus 5.5 --- wai/SPEC.md | 5 +- .../2026-11-05-carousel-raptor-rfc-5053.md | 17 + wai/claim-conformance/claim_verify.py | 24 +- wai/extensions/bearer-receipts.md | 4 +- wai/extensions/carousel.md | 128 +- wai/extensions/jwp-receipts.md | 6 +- wai/extensions/rung-price.md | 2 +- wai/live-conformance/carousel/README.md | 8 +- wai/live-conformance/carousel/vectors.json | 1550 ++++++++++++++++- wai/live-conformance/carousel_verify.py | 29 +- wai/wai-rs/Cargo.lock | 7 + wai/wai-rs/Cargo.toml | 7 +- wai/wai-rs/src/carousel.rs | 39 +- wai/wai-rs/src/carousel/corpus.rs | 153 +- wai/wai-rs/src/claim_receipt/schedule.rs | 106 +- wai/wai-rs/tests/carousel.rs | 149 +- 16 files changed, 2144 insertions(+), 90 deletions(-) create mode 100644 wai/changes/2026-11-05-carousel-raptor-rfc-5053.md diff --git a/wai/SPEC.md b/wai/SPEC.md index 08700e321..f48386fe9 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -1801,14 +1801,15 @@ multicast and the applications of hybrid broadcast receivers: And for **when** each object passes on a bearer with no return path — `wai.bearer.carousel`: a publisher's signed schedule, a jwp-receipts claim of class `schedule` beside the group receipt and the instance's transmission claim, that names for each object its forward error correction -(RaptorQ, RFC 6330, or Compact No-Code, RFC 5445) with that code's object transmission +(RaptorQ, RFC 6330; Raptor, RFC 5053; or Compact No-Code, RFC 5445) with that code's object transmission information, the repair symbols each pass adds, whether a later pass repeats its symbols or sends new ones, and the times and count of its passes. A verifier holds the parameters to each code's bounds and the entries to the group, its objects' content hashes and, where it holds them, their lengths; sets aside schedules that contradict each other, or whose instance is undeclared or two-way; and derives, for a loss bound stated in parts per million, the pass after which a receiver whose losses stay within it holds each object, whatever symbols it loses: a RaptorQ -block at K′ + h distinct symbols, the count RFC 6330 states its decoding-failure bound at, and +block at K′ + h distinct symbols, the count RFC 6330 states its decoding-failure bound at, a Raptor +block at K and a margin this text sets by measurement, with no bound, as RFC 5053 states none, and a symbol a repeating pass missed counted as missed again. That is the deadline a one-way bearer can promise, checked with no receiver; a statement that an object or a group is held by an instant holds or is refused (`availability_after_deadline`, `availability_not_within_schedule`, diff --git a/wai/changes/2026-11-05-carousel-raptor-rfc-5053.md b/wai/changes/2026-11-05-carousel-raptor-rfc-5053.md new file mode 100644 index 000000000..d5eb10ed1 --- /dev/null +++ b/wai/changes/2026-11-05-carousel-raptor-rfc-5053.md @@ -0,0 +1,17 @@ +### A schedule names Raptor (RFC 5053), the code MBMS download uses + +- **The code** ([extensions/carousel.md](extensions/carousel.md) §4.1, §5.5): an entry's `fec` may be `raptor` (FEC + Encoding ID 1), with RFC 5053's F, T, Z, N and Al. They are held to its fields and to its block sizes: from 4 source + symbols, the fewest its §5.7 indexes, to 8,192, with ESIs in 16 bits. A receiver of 3GPP MBMS download supports the + code (TS 26.346 §7.2.2), so a schedule of such a session can state what is sent. +- **What is held** (carousel §5.3, §6.3, §7): RFC 5053 states no bound on a decoder's failure, and an independent + implementation of it failed on 14 to 31 blocks in 100 at *K* + 2. So a Raptor block is held at *K* and a margin this + text sets by measurement, 8, 16 or 28 symbols at overhead 0, 1 or 2, and `failure_one_in` is `null`. `tests/carousel.rs` + decodes each Raptor object a case holds available with that implementation, a development dependency, from what a + receiver within the case's loss bound holds, and holds a fixed sample of decoders to the measurement. +- **`no-code` stays the default** (carousel §11), where the IETF's disclosures on RFC 5053 stay stated for implementers. +- **Breaking:** `record:corpus:wai/live-conformance/carousel/vectors.json`: the case `fec_unknown` named `raptor`, which is + now a code, and names `lt` instead. A verifier takes `raptor` as a code at jwp-receipts §3.1 step 2. +- **Breaking:** `api:rust:wai::claim_receipt::Fec::Raptor`, `api:rust:wai::claim_receipt::Oti::Raptor`, + `api:rust:wai::claim_receipt::schedule::Fec::Raptor` and `api:rust:wai::claim_receipt::schedule::Oti::Raptor`: the new + code. A match over either enum takes the new arm. diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index e18caea59..f78a7e4cb 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -1568,9 +1568,12 @@ def fabric_rules(f, joules): SCHEDULE_ENTRY = ["leaf_index", "content_hash", "fec", "oti", "repair", "esi", "first_ms", "period_ms", "duration_ms", "count"] SCHEDULE_OTI = {"raptorq": ["transfer_length", "symbol_size", "source_blocks", "sub_blocks", "alignment"], + "raptor": ["transfer_length", "symbol_size", "source_blocks", "sub_blocks", "alignment"], "no-code": ["transfer_length", "symbol_size", "max_block_length"]} K_PRIME_MAX = 56_403 # RFC 6330 §5.1.2 RAPTORQ_MAX_F = 942_574_504_275 # RFC 6330 §3.3.2 as its erratum 5548 corrects it +RAPTOR_K_MAX = 8_192 # RFC 5053 §5.1.2 +RAPTOR_K_MIN = 4 # RFC 5053 §5.7: the fewest source symbols with a systematic index LAST_INSTANT_MS = 253_402_300_799_999 # 9999-12-31T23:59:59.999Z @@ -1579,7 +1582,7 @@ def ceil_div(a, b): def schedule_blocks(e): - """carousel §5.1, §5.2: an entry's source blocks as [(K, how many)], the larger size first + """carousel §5.1, §5.2, §5.5: an entry's source blocks as [(K, how many)], the larger size first and a size no block has left out; None when its code does not admit its parameters.""" o = e["oti"] if e["fec"] == "raptorq": @@ -1594,6 +1597,18 @@ def schedule_blocks(e): kl, ks = ceil_div(kt, z), kt // z zl = kt - ks * z sizes = [(kl, zl), (ks, z - zl)] + elif e["fec"] == "raptor": + f, t, z, n, al = (o[k] for k in SCHEDULE_OTI["raptor"]) + if not (1 <= f < 1 << 45 and 1 <= al <= 255 and 1 <= t <= 65_535 and t % al == 0 + and 1 <= z <= 65_535 and 1 <= n <= 255 and n <= t // al): + return None + kt = ceil_div(f, t) + if kt // z < RAPTOR_K_MIN or ceil_div(kt, z) > RAPTOR_K_MAX: + return None + # RFC 5053 §5.3.1.2: (KL, KS, ZL, ZS) = Partition[Kt, Z]. + kl, ks = ceil_div(kt, z), kt // z + zl = kt - ks * z + sizes = [(kl, zl), (ks, z - zl)] else: ln, es, bl = (o[k] for k in SCHEDULE_OTI["no-code"]) if not (1 <= ln < 1 << 48 and 1 <= es <= 65_535 and 1 <= bl < 1 << 32): @@ -1610,8 +1625,8 @@ def schedule_blocks(e): def schedule_bytes(e, blocks): - """carousel §5.4: count · Σ m · T for RaptorQ, count · L for Compact No-Code.""" - if e["fec"] == "raptorq": + """carousel §5.4: count · Σ m · T for RaptorQ and Raptor, count · L for Compact No-Code.""" + if e["fec"] != "no-code": return e["count"] * sum(c * (k + e["repair"]) for k, c in blocks) * e["oti"]["symbol_size"] return e["count"] * e["oti"]["transfer_length"] @@ -1624,7 +1639,8 @@ def schedule_entry_rules(e): named = e["repair"] == 0 and e["esi"] == "repeat" else: m = blocks[0][0] + e["repair"] - named = (m if e["esi"] == "repeat" else e["count"] * m) <= 1 << 24 + field = 16 if e["fec"] == "raptor" else 24 # RFC 5053 §3.1, RFC 6330 §3.2 + named = (m if e["esi"] == "repeat" else e["count"] * m) <= 1 << field need(named, 4, "schedule_symbols_invalid") c, p, d = e["count"], e["period_ms"], e["duration_ms"] formed = (c >= 1 and d >= 1 and (c < 2 or p >= d) and e["first_ms"] + (c - 1) * p + d <= LAST_INSTANT_MS diff --git a/wai/extensions/bearer-receipts.md b/wai/extensions/bearer-receipts.md index 69032ca62..9295e3fc1 100644 --- a/wai/extensions/bearer-receipts.md +++ b/wai/extensions/bearer-receipts.md @@ -466,7 +466,9 @@ reception reporting (TS 26.346 clause 9.4) lists each file received by its `file `Content-MD5` where the table carried it, and is unsigned: it names files, not objects of a group, and a reconciliation travels beside it. TS 26.517 defines no reception report, and TS 26.502 leaves one for further study (clause 4.2.5). A session whose receivers report -declares `multicast`; one without a path back, `unidirectional`. +declares `multicast`; one without a path back, `unidirectional`. A receiver of MBMS download +supports the Compact No-Code and Raptor schemes (TS 26.346 clause 7.2.2), which a schedule of such a +session states as `no-code` and `raptor` ([carousel](carousel.md) §4.1). ### 9.7 MoQ over multicast (`draft-ramadan-moq-multicast-00`) diff --git a/wai/extensions/carousel.md b/wai/extensions/carousel.md index a3fe35c57..9869ac479 100644 --- a/wai/extensions/carousel.md +++ b/wai/extensions/carousel.md @@ -13,18 +13,19 @@ > schedule adds passes to an earlier one without contradicting it (§4.5), and the receipts a > receiver needs ride on the instance itself, so one that joins mid-carousel recovers them there > (§8.1, §8.2). WAI -> defines no transport and no code: the codes are RaptorQ (RFC 6330) and Compact No-Code -> (RFC 5445), and the schedule declares their parameters. The reference implementation is the +> defines no transport and no code: the codes are RaptorQ (RFC 6330), Raptor (RFC 5053) and Compact +> No-Code (RFC 5445), and the schedule declares their parameters. The reference implementation is the > `carousel` module of `wai-rs` (feature `carousel`), with the class's body in > `claim_receipt::schedule`; the corpus is > [`live-conformance/carousel/`](../live-conformance/carousel/), and its second implementation > is `live-conformance/carousel_verify.py`. > Keywords **MUST**, **MUST NOT**, **SHOULD**, **MAY** are RFC 2119/8174. > -> Texts read for this revision: RFC 6330 (RaptorQ) with its verified erratum 5548, RFC 5445 -> (Compact No-Code) and RFC 5052 §9.1 (block partitioning). A clause number of one of them in -> this text is that RFC's. §11 also cites the IETF's IPR disclosures on RFC 5053, RFC 6330 and -> their drafts, read as the IETF datatracker shows them, and RFC 8179 §4. +> Texts read for this revision: RFC 6330 (RaptorQ) with its verified erratum 5548, RFC 5053 (Raptor), +> RFC 5445 (Compact No-Code), RFC 5052 §9.1 (block partitioning) and 3GPP TS 26.346 V19.3.0 §7.2.2 and +> §7.2.3. A clause number of one of them in this text is that text's. §11 also cites the IETF's IPR +> disclosures on RFC 5053, RFC 6330 and their drafts, read as the IETF datatracker shows them, and +> RFC 8179 §4. ## 1. Scope @@ -34,8 +35,8 @@ whose losses stay within a bound, and the statements a verifier may check agains passes a receiver listens to (§7); and what a publisher repeats on the instance for a receiver that joins mid-carousel, and whether what it acquired suffices (§8.1, §8.2). -Out of scope: encoding and decoding symbols, which are the codes' own (RFC 6330 §5, RFC 5445 -§3); a transport, and how symbols are packed into packets; a model of a channel. Every +Out of scope: encoding and decoding symbols, which are the codes' own (RFC 6330 §5, RFC 5053 §5, +RFC 5445 §3); a transport, and how symbols are packed into packets; a model of a channel. Every statement here holds for every pattern of loss within the stated bound (§2). Whether losses on a channel are independent, and how often a bound is exceeded, is a judgement about that channel, which a relying party makes and a schedule does not carry. Nothing here states @@ -62,8 +63,8 @@ and is not dispatchable. pass, it fails to receive at most ⌊*L* · *m* / 1,000,000⌋, whichever they are. It is a bound on symbols: a relying party whose bound is stated on packets carrying several symbols each converts it. -- **Overhead** *h*: 0, 1 or 2, the encoding symbols beyond *K′* a RaptorQ block is held at - (§5.3). +- **Overhead** *h*: 0, 1 or 2, the encoding symbols beyond *K′* a RaptorQ block is held at. A + Raptor block is held at a margin beyond *K* that *h* selects (§5.3). ## 3. Why a schedule beside the receipt @@ -108,8 +109,8 @@ Each entry of `objects` has exactly these members: |---|---|---| | `leaf_index` | integer | The object's position in the group (jwp-receipts §2.2). | | `content_hash` | 32 B hex | The object's content hash (jwp-receipts §2.1): what a receiver that decodes the object checks it against. | -| `fec` | string | The code: `raptorq` (RFC 6330, FEC Encoding ID 6) or `no-code` (RFC 5445, FEC Encoding ID 0). | -| `oti` | object | The code's object transmission information, as §5 reads it. For `raptorq`, exactly `transfer_length` (F), `symbol_size` (T), `source_blocks` (Z), `sub_blocks` (N) and `alignment` (Al), RFC 6330 §3.3.2 and §3.3.3. For `no-code`, exactly `transfer_length`, `symbol_size` (the encoding symbol length) and `max_block_length` (the maximum source block length, in symbols), RFC 5445 §3.2.2.2. Each an integer. | +| `fec` | string | The code: `raptorq` (RFC 6330, FEC Encoding ID 6), `raptor` (RFC 5053, FEC Encoding ID 1) or `no-code` (RFC 5445, FEC Encoding ID 0). | +| `oti` | object | The code's object transmission information, as §5 reads it. For `raptorq`, exactly `transfer_length` (F), `symbol_size` (T), `source_blocks` (Z), `sub_blocks` (N) and `alignment` (Al), RFC 6330 §3.3.2 and §3.3.3. For `raptor`, the same members, RFC 5053 §3.2.2 and §3.2.3. For `no-code`, exactly `transfer_length`, `symbol_size` (the encoding symbol length) and `max_block_length` (the maximum source block length, in symbols), RFC 5445 §3.2.2.2. Each an integer. | | `repair` | integer | The repair symbols of each source block sent in each pass, beyond its source symbols (§5.4). | | `esi` | string | `repeat`: every pass sends the same ESIs. `advance`: each pass sends ESIs no earlier pass sent (§5.4). | | `first_ms` | integer | The instant the first pass starts. | @@ -129,7 +130,7 @@ Checked at jwp-receipts §3.1 step 4, in this order: 2. `objects` has at least one entry, and its `leaf_index` values strictly increase (`schedule_objects_malformed`): one entry for each object scheduled, in group order. 3. Each entry in order, the first of these to fail: - 1. its `oti` is one its code admits, §5.1 or §5.2 (`schedule_oti_invalid`); + 1. its `oti` is one its code admits, §5.1, §5.2 or §5.5 (`schedule_oti_invalid`); 2. its symbols are ones its code can name, §5.4 (`schedule_symbols_invalid`); 3. its passes are well formed (`schedule_passes_invalid`): `count` and `duration_ms` are at least 1; with `count` at least 2, `period_ms` is at least `duration_ms`, so one pass of @@ -191,8 +192,8 @@ Nothing *A* states is weakened by *B*, at any loss bound and overhead: - each pass of *A* is a pass of *B*, and §5.4 gives it the same ESIs, which depend only on the pass and on *m*; - an entry available under *A* (§6.3) is available under *B* at the same pass. One not available - under *A* may be under *B*: by a later pass under `raptorq` and `advance`, while under `repeat` - and `no-code` the first pass decides and the answer is the same; + under *A* may be under *B*: by a later pass under `advance`, while under `repeat` and `no-code` the + first pass decides and the answer is the same; - a statement that holds under *A* (§6.4) holds under *B*, and one refused `availability_not_within_schedule` or `object_not_scheduled` may hold; - a plan under *B* (§7) listens to every pass a plan under *A* listens to from the same instant @@ -250,6 +251,18 @@ A block of *K* source symbols is **held** when a receiver can recover it: 1 in 100, 1 in 10,000 and 1 in 1,000,000 on average. A block of *K* < *K′* symbols is padded to *K′* with symbols the decoder knows (§5.3.1), so it may need fewer than *K′* + *h* received; this text asks for the count §5.8 states its bound at, and no fewer. +- **`raptor`**: when it has received *K* + *a* distinct encoding symbols of the block, where the + margin *a* is 8, 16 or 28 at *h* 0, 1 or 2. RFC 5053 pads no block to a table of sizes, since §5.7 + indexes every *K* it admits, and it states no bound on a decoder's failure: its decoder recovers a + block from "any set of encoding symbols only slightly more in number than the number of source + symbols" (§1), and the example it gives can fail (§5.5.2.2, §5.5.2.3). 3GPP TS 26.346 §7.2.2 + requires a receiver to recover a block from a "mathematically sufficient set", which no count + establishes. The margins are this text's, set by measurement. With distinct encoding symbols + chosen uniformly at random, an independent implementation of RFC 5053 failed on 14 to 31 blocks in + 100 at *K* + 2, at most 81 in 10,000 at *K* + 8, at most 2 in 18,000 at *K* + 16 and at most 4 in + 6,000,000 at *K* + 28, at block sizes from 4 to 8,192 symbols (`raptor_margin_measurement` in + `tests/carousel.rs`, whose samples shrink as blocks grow, to 1,800 blocks of 8,192). That is a + measurement of one implementation, not a bound, and no bound comes with the count. An **object** is held when every one of its source blocks is. @@ -260,8 +273,8 @@ symbols: - `repeat`: ESIs 0 to *m* − 1 in every pass; - `advance`: in pass *j*, ESIs (*j* − 1) · *m* to *j* · *m* − 1. The first pass holds the source - symbols (ESIs 0 to *K* − 1, RFC 6330 §4.4.2) and every later pass only repair symbols, none - sent before. + symbols (ESIs 0 to *K* − 1, RFC 6330 §4.4.2, RFC 5053 §5.3.2) and every later pass only repair + symbols, none sent before. An entry's symbols are ones its code can name (§4.2 rule 3.2) when: @@ -269,10 +282,32 @@ An entry's symbols are ones its code can name (§4.2 rule 3.2) when: past a block's last source symbol names nothing; - **`raptorq`**: the greatest ESI sent fits the 24-bit field (RFC 6330 §3.2): with *KL* the larger block's *K*, *KL* + `repair` is at most 224 for `repeat`, and `count` · - (*KL* + `repair`) at most 224 for `advance`, computed without overflow. + (*KL* + `repair`) at most 224 for `advance`, computed without overflow; +- **`raptor`**: the greatest ESI sent fits the 16-bit field (RFC 5053 §3.1): *KL* + `repair` is at + most 216 for `repeat`, and `count` · (*KL* + `repair`) at most 216 for + `advance`, computed without overflow. The octets an entry's passes send, `bytes_sent`, are `count` · Σ *m* · T over its source blocks -for `raptorq`, and `count` · L for `no-code`, whose last symbol is short. +for `raptorq` and `raptor`, and `count` · L for `no-code`, whose last symbol is short. + +### 5.5 Raptor + +The `oti` of a `raptor` entry, F, T, Z, N and Al, is one RFC 5053 admits when: + +- F is from 1 to 245 − 1 (§3.2.2); +- T is from 1 to 65,535 and a multiple of Al, and Al from 1 to 255 (§3.2.2, §3.2.3, §4.1); +- Z is from 1 to 65,535, the range of its 16-bit field (§3.2.3); +- N is from 1 to 255, the range of its 8-bit field, and at most T / Al, so each sub-block has a + sub-symbol of at least Al octets (§3.2.3, §5.3.1.2); +- with *Kt* = ⌈F / T⌉, ⌊*Kt* / Z⌋ is at least 4 and ⌈*Kt* / Z⌉ at most 8,192: §5.7 gives a systematic + index for those block sizes and no others, and *K*max is 8,192 (§5.1.2, §5.3.1.2). + +The object is then divided as RFC 5053 §5.3.1.2 divides it, by the Partition[] of §5.1: (*KL*, *KS*, +*ZL*, *ZS*) = Partition[*Kt*, Z]. The first *ZL* source blocks have *KL* source symbols each and the +remaining *ZS* have *KS*. Each symbol is T octets. The last source symbol of the object is padded to T +for encoding; RFC 5053 §5.3.2 lets a sender leave that padding out of a packet, and `bytes_sent` +counts it. A limit a bearer sets on these values, as TS 26.346 §7.2.3 does on a sub-block's size, is +the bearer's. ## 6. When an object is held @@ -315,18 +350,18 @@ For an entry, pass *j* ends at the instant `first_ms` + (*j* − 1) · `period_m ⌊*L* · *m* / 1,000,000⌋ the most a receiver within *L* misses of it in one pass, the first pass after which a receiver within *L* holds the block is, under §5.3: -- **`raptorq`, `advance`**: the least *j* from 1 to `count` with *j* · (*m* − *x*) ≥ *K′* + *h*. - Every pass adds *m* − *x* symbols none before it sent. -- **`raptorq`, `repeat`**: 1 if *m* − *x* ≥ *K′* + *h*, and none otherwise. A later pass sends - the same ESIs, and the ones a receiver missed may be missed again: within *L*, nothing it adds - is certain. +- **`raptorq` or `raptor`, `advance`**: the least *j* from 1 to `count` with *j* · (*m* − *x*) at + least what §5.3 asks of the block. Every pass adds *m* − *x* symbols none before it sent. +- **`raptorq` or `raptor`, `repeat`**: 1 if *m* − *x* is at least what §5.3 asks, and none otherwise. + A later pass sends the same ESIs, and the ones a receiver missed may be missed again: within *L*, + nothing it adds is certain. - **`no-code`**: 1 if *x* is 0, and none otherwise, for the same reason. The object is **available** at the end of the greatest of its blocks' passes, or is **not available within the schedule** if any block has none. A verifier reports for each entry its `available_ms` (or `null`), the pass, `bytes_sent` (§5.4), and, for `raptorq`, the RFC 6330 -§5.8 bound at *h* as `failure_one_in` (100, 10,000 or 1,000,000); for `no-code` it is `null`, a -block held being recovered exactly. +§5.8 bound at *h* as `failure_one_in` (100, 10,000 or 1,000,000). For `raptor` it is `null`, since +RFC 5053 states no bound (§5.3); for `no-code` it is `null`, a block held being recovered exactly. ### 6.4 Statements offered about an object or a group @@ -343,8 +378,8 @@ an overhead *h*: A statement that holds says what the publisher planned: a receiver within *L*, hearing every pass the schedule names, holds the object by *t*, but for a decoding failure no more likely than -`failure_one_in` states. It does not say the passes were sent (the declaration's) or heard (a -reconciliation's). +`failure_one_in` states, and under `raptor` no bound is stated on that failure. It does not say the +passes were sent (the declaration's) or heard (a reconciliation's). A publisher's own deadline for an object is its timeliness claim's `by_ms` ([timeliness](timeliness.md) §4.1); held by it, the statement is the publisher's plan against its @@ -361,9 +396,9 @@ them, or that holds more source symbols of a `no-code` block than it has, is `ho Only passes that start at or after *t* count: a pass under way at *t* has sent symbols the receiver did not hear. A pass adds, to a block not held, with *m* and *x* as §6.3: -- **`raptorq`, `advance`**: *m* − *x*, none of them sent before; -- **`raptorq`, `repeat`** and **`no-code`**: max(0, *m* − *n* − *x*): of the *m* − *n* ESIs it - lacks, *x* may be the ones it misses again. +- **`raptorq` or `raptor`, `advance`**: *m* − *x*, none of them sent before; +- **`raptorq` or `raptor`, `repeat`**, and **`no-code`**: max(0, *m* − *n* − *x*): of the *m* − *n* + ESIs it lacks, *x* may be the ones it misses again. The passes are taken in order of their start. While some block is not held, the next pass is listened to if it adds to a block not held, each such block's *n* growing by what it adds; the @@ -386,7 +421,9 @@ signed by the publisher, beside the group's receipts, so a relying party with no bearer can check a promise (§6.4) and a receiver can plan before it tunes (§7). A sink that holds both compares them; a difference is the bearer's, and the sink reports it rather than choosing one. The bearer's own repetition (its carousel of descriptions and files) is the schedule's -passes: a pass is one transmission of the object's symbols, whatever the bearer calls it. +passes: a pass is one transmission of the object's symbols, whatever the bearer calls it. A receiver +of 3GPP MBMS download supports the Compact No-Code and Raptor schemes (TS 26.346 §7.2.2), so a +schedule of such an instance names `no-code` or `raptor`. ### 8.1 In-band repetition @@ -485,7 +522,8 @@ fixed seeds by `wai_carousel_vectors gen` as `vectors.json`. It has: - **Availability**: RaptorQ objects of one and of several source blocks of two sizes, under `advance` and `repeat`, at loss bounds of zero and above, reaching a later pass, the last - pass, and none; at each overhead; a Compact No-Code object available at the first pass with + pass, and none; at each overhead; Raptor objects the same, among them one not held where the same + parameters under RaptorQ would be; a Compact No-Code object available at the first pass with no loss and at none with any; a group of several objects; the same object simulcast on two instances with different schedules. - **Statements**: an object and a group held by a deadline, after it, not within the schedule, @@ -505,7 +543,7 @@ fixed seeds by `wai_carousel_vectors gen` as `vectors.json`. It has: origin, with a broken signature, unreadable, not listing the key and revoking it; and a group that fails. - **Negative controls**, one for each reason of §9 that a claim or a verdict raises, and the - bounds of §5.1, §5.2 and §5.4 on both sides. + bounds of §5.1, §5.2, §5.4 and §5.5 on both sides. A conforming verifier gives every case the outcome, the reason and everything else the corpus states. `wai_carousel_vectors verify` and the test `tests/carousel.rs` check that the file @@ -515,12 +553,15 @@ table. Against an independent implementation of RFC 6330, the test also requires *K′* and Partition[] to agree for every block size, and decodes each RaptorQ object a case holds available at a pass: it encodes the object under the entry's parameters, drops in each pass the first ⌊*L* · *m* / 1,000,000⌋ symbols of each block (in the first pass, source symbols, so the -decoder must decode), and requires the object back from what is left by that pass's end. +decoder must decode), and requires the object back from what is left by that pass's end. It does the +same for each Raptor object against an independent implementation of RFC 5053, and on a fixed sample +requires that decoder to fail on at least 1 block in 10 at *K* + 2, on at most 1 in 100 at the margin of +*h* = 0, at most 1 in 10,000 at that of *h* = 1, and on none of 10,000 at that of *h* = 2. `live-conformance/carousel_verify.py` is the second implementation, written from this text: it shares no code with `wai-rs`; it verifies groups and objects with the JWP corpus's second implementation (`jwp-conformance/jwp_verify.py`), claims through steps 1–5 with the claim -corpus's (`claim-conformance/claim_verify.py`), whose step 4 holds §4.2 with §5.1, §5.2 and -§5.4, and key logs with the signer corpus's (`signer-conformance/signer_verify.py`); it reads +corpus's (`claim-conformance/claim_verify.py`), whose step 4 holds §4.2 with §5.1, §5.2, §5.4 and +§5.5, and key logs with the signer corpus's (`signer-conformance/signer_verify.py`); it reads Appendix A and §9 from this text, writes §4.3, §4.5, §5.3, §6, §7 and §8.2 itself, mutates copies of the corpus and requires every copy to fail, and drops each of its own checks in turn and requires the corpus to catch the weakened verifier. @@ -545,7 +586,7 @@ product that implements the code: product or part that does not fully implement the specification. The class is **royalty-free non-assertion**, conditional on full implementation and suspended for a party that asserts. -Raptor (RFC 5053), which this revision does not name (§4.1), has disclosures from the same +Raptor (RFC 5053), which §4.1 names, has disclosures from the same holder and an earlier one: #615, #618, #702 and #734 on its drafts; #1185 (8 September 2009) on RFC 5053, which declared a reasonable and non-discriminatory licence with possible royalty or fee; and #1289, #1508, #1744 and #1957 (6 February 2013), each updating the one before. #1957 has @@ -562,11 +603,12 @@ Therefore: - **`no-code` is the default.** Neither RaptorQ nor Raptor is royalty-free for every implementer: whether a royalty is due turns on the product, which a schedule does not state. Under SPEC §5 a capability that is not royalty-free is never a default, and the same holds - here: a tool that writes schedules writes `no-code` unless it is set to write `raptorq`. + here: a tool that writes schedules writes `no-code` unless it is set to write `raptorq` or + `raptor`. - **The reference implementation encodes and decodes no symbol** (§1). Its `carousel` module computes, from the parameters an entry states, the division of §5 and the counts of §6 and §7. - Its test decodes RaptorQ with an independent implementation of RFC 6330 that is a development - dependency of `wai-rs`, which no build of the library carries. + Its test decodes RaptorQ with an independent implementation of RFC 6330, and Raptor with one of + RFC 5053, each a development dependency of `wai-rs`, which no build of the library carries. - Whether a product that encodes or decodes RaptorQ or Raptor symbols needs a licence under these disclosures is a decision for its distributor. @@ -589,8 +631,8 @@ Therefore: parameters, which the bearer's own file descriptions already carry to every receiver. A receiver that plans with it (§7) sends nothing, and a unidirectional bearer's property that the source learns nothing of its receivers (unidirectional-delivery §2) is kept. -- **Bounded work.** An entry's arithmetic is a few products per source block, and an object has - at most 255 RaptorQ blocks of two sizes or Compact No-Code blocks of two sizes; a schedule's +- **Bounded work.** An entry's arithmetic is a few products per block size, and an object has + blocks of at most two sizes under every code; a schedule's cost is linear in its entries, whatever the passes' count, and so is comparing it with the one before it (§4.5). diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index 49182d497..11c7221e5 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -1376,8 +1376,8 @@ object receipts at the positions it names. #### 2.4.16. `class: "schedule"` A publisher's plan of when each object of a group passes on a bearer instance with no return -path, and with which forward error correction: for each object, its code (RaptorQ or Compact -No-Code) and that code's object transmission information, the repair symbols each pass adds, +path, and with which forward error correction: for each object, its code (RaptorQ, Raptor or +Compact No-Code) and that code's object transmission information, the repair symbols each pass adds, and the times and count of its passes. It attests a plan, not a transmission or a delivery, and it sits beside the group receipt and the instance's transmission claim, whose bytes it leaves unchanged. [carousel](carousel.md) defines it: its body's members are §4.1 there @@ -2365,7 +2365,7 @@ and never folds it in: confirmation changes the outcome of no step here. | 4 | `reconciliation_bitmap_malformed` | its `leaf_count` is 0, its `received` is not ⌈`leaf_count` / 8⌉ bytes, sets a bit at or past `leaf_count`, or sets none | | 4 | `schedule_not_scheduled` | a `schedule` claim's `attests` is not `scheduled` ([carousel](carousel.md) §4.2) | | 4 | `schedule_objects_malformed` | it has no entry, or its entries' `leaf_index` values do not strictly increase | -| 4 | `schedule_oti_invalid` | an entry's code parameters are not ones its code admits (carousel §5.1, §5.2) | +| 4 | `schedule_oti_invalid` | an entry's code parameters are not ones its code admits (carousel §5.1, §5.2, §5.5) | | 4 | `schedule_symbols_invalid` | an entry's symbols are not ones its code can name (carousel §5.4) | | 4 | `schedule_passes_invalid` | an entry's passes are not well formed: none, of no duration, overlapping, ending past 9999, or sending more than 253 − 1 octets | | 4 | `timeliness_not_valued` | a `timeliness` claim's `attests` is not `valued` ([timeliness](timeliness.md) §4.2) | diff --git a/wai/extensions/rung-price.md b/wai/extensions/rung-price.md index 4353ab625..47678b168 100644 --- a/wai/extensions/rung-price.md +++ b/wai/extensions/rung-price.md @@ -582,7 +582,7 @@ define. Until it does, a comparer compares transmission prices (§6), and a ledg ### 7.2 The pass rate For an entry of a carousel schedule, *P* = `bytes_sent` / `count` is the octets one pass sends: Σ -*m* · T over its source blocks for `raptorq`, and L for `no-code` (carousel §5.4). The division is +*m* · T over its source blocks for `raptorq` and `raptor`, and L for `no-code` (carousel §5.4). The division is exact. The entry's **pass rate** is ⌈8000 × *P* / `duration_ms`⌉ bits per second, computed in 128 bits. diff --git a/wai/live-conformance/carousel/README.md b/wai/live-conformance/carousel/README.md index c298ed3dc..8b3dd7eeb 100644 --- a/wai/live-conformance/carousel/README.md +++ b/wai/live-conformance/carousel/README.md @@ -29,8 +29,8 @@ verifier holds it: `bytes_sent` and `failure_one_in` — and the statement's result. `claims` are each one schedule claim and its `outcome` through jwp-receipts §3.1 steps 1–4: -`accept`, or `reject step=… reason=…`. Among them every bound of §5.1, §5.2, §5.4 and §4.2 rule -3.3 that a schedule can reach, met and passed. +`accept`, or `reject step=… reason=…`. Among them every bound of §5.1, §5.2, §5.4, §5.5 and §4.2 +rule 3.3 that a schedule can reach, met and passed. `plans` (§7) are each an `entry` of a schedule, the instant `at_ms` a receiver is at, its `loss_ppm` and `overhead`, and `held`, the encoding symbols it holds of each source block. @@ -49,8 +49,8 @@ written to have, declared in the generator, never copied from a verifier. `wai_carousel_vectors verify` and `tests/carousel.rs` check that the file regenerates byte for byte and that `wai-rs` reaches every stated outcome; the test also decodes each RaptorQ object a -case holds available with an independent implementation of RFC 6330, from what a receiver within -the case's loss bound holds. `../carousel_verify.py` is the second implementation, written from +case holds available with an independent implementation of RFC 6330, and each Raptor object with one +of RFC 5053, from what a receiver within the case's loss bound holds. `../carousel_verify.py` is the second implementation, written from the extension's text, which also mutates copies of the corpus and drops each of its own checks in turn and requires each to be caught. `../../claim-conformance/claim_verify.py carousel vectors.json` reads every claim through jwp-receipts §3.1 steps 1–4. diff --git a/wai/live-conformance/carousel/vectors.json b/wai/live-conformance/carousel/vectors.json index 84d56b550..85af5de83 100644 --- a/wai/live-conformance/carousel/vectors.json +++ b/wai/live-conformance/carousel/vectors.json @@ -3386,6 +3386,1187 @@ "statement": null } }, + { + "name": "raptor_lossless", + "description": "No loss at overhead 2, where a block needs K + 28: every object is held after its first pass.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 0, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 1, + "available_ms": 1793620814000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": 1, + "available_ms": 1793620817000, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 1, + "available_ms": 1793620819000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_10_percent", + "description": "10%: object 0 gains 46 or 45 a pass and needs 45 or 44; object 1 holds 44 of the 42 it needs; object 2 gains 36 or 35 and needs 33 or 32.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 100000, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 1, + "available_ms": 1793620814000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": 1, + "available_ms": 1793620817000, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 1, + "available_ms": 1793620819000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_30_percent", + "description": "30%: object 0 gains 36 or 35 a pass and needs 45 or 44, after pass 2; object 1 holds 34 of 42, never, where K′ + 2 = 20 under RaptorQ would be met; object 2 gains 28 or 27 and needs 33 or 32, after pass 2.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 300000, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 2, + "available_ms": 1793620844000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 2, + "available_ms": 1793620849000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_overhead_0", + "description": "50% at overhead 0, where a block needs K + 8: object 0 gains 26 or 25 and needs 25 or 24; object 1 holds 24 of 22; object 2 gains 20 or 19 and needs 13 or 12.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 500000, + "overhead": 0, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 1, + "available_ms": 1793620814000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": 1, + "available_ms": 1793620817000, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 1, + "available_ms": 1793620819000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_overhead_1", + "description": "50% at overhead 1, where a block needs K + 16: object 0 needs 33 or 32, after pass 2; object 1 holds 24 of 30, never; object 2 needs 21 or 20, after pass 2.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 500000, + "overhead": 1, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 2, + "available_ms": 1793620844000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 2, + "available_ms": 1793620849000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_80_percent_last_pass", + "description": "80%: object 0 gains 11 or 10 a pass and object 2 gains 8, each held after the fifth and last.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 800000, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 5, + "available_ms": 1793620934000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 5, + "available_ms": 1793620939000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_90_percent", + "description": "90%: object 0 gains 6 or 5 a pass and needs 8 or 9 passes, and has 5; object 2 gains 4 and needs 9: never.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de20b0000078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72a" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7de2020000189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92caf32b538bb3ec144c74acd50d356d95cdf62e568eb6ef174f77afd800386098c0f9215981b9e21a427aa2db033b639bc3fc245c84bce51d457da5de063e669ec6ff275f87bfe8104870a8d109316991c9f22a528ab2eb134b73abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235b83b" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d8200000029ac2fb235b83bbe41c447ca4dd053d659dc5fe265e86bee71f477fa7d008306890c8f1295189b1ea124a72aad30b336b93cbf42c548cb4ed154d75add60e366e96cef72f578fb7e0184078a0d901396199c1fa225a82bae31b437ba3dc043c649cc4fd255d85bde61e467ea6df073f679fc7f0285088b0e9114971a9d20a326a92c" + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": "57414931920000007b22776169223a22312e30222c226d65646961223a2262696e617279222c22696e74656e74223a22696d70726f7665222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e746578742e7a737464227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226279746573227d2c22746172676574223a6e756c6c7d2a0000003abd40c346c94ccf52d558db5ee164e76aed70f376f97cff8205880b8e1194179a1da023a629ac2fb235" + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 900000, + "overhead": 2, + "statement": null, + "outcome": { + "outcome": "verdict", + "objects": [ + "delivered-verified", + "delivered-verified", + "delivered-verified", + "delivered-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": null, + "available_ms": null, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": null, + "available_ms": null, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": null + } + }, + { + "name": "raptor_after_deadline", + "description": "Object 0 under Raptor a millisecond short of when it is held: refused, as under any code.", + "group": { + "kind": "group", + "track_alias": 1, + "group_id": 1, + "root_hash": "8857aae15f94e929f6b6a9890e30a349e1c00ab23858f81b1627e70697d5635c", + "leaf_count": 4, + "joules_total": 0, + "group_start": "2026-11-02T12:00:00Z", + "group_end": "2026-11-02T12:00:02Z", + "signer_pubkey": "d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737", + "signer_id": "did:web:publisher.example#d1", + "sig": "5ea968babde89ca1a1a63e0857e6bdaa50fbb93f8f02b5d9ae921e58b5909438662541f452eb22296d093bd4db19da22d6850f1d6f0ee2594de05665ce4de906", + "parent_receipt_hash": null + }, + "objects": [ + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "47936c19f753b682a2fbce34b49494b65f785f57cb82cbda4ce11809bc8f6b58", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 0, + "leaf_index": 0 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "9a953095a712448ee30b490eeaf049f7fe38dfe2d7871f92b0900b4f988b03f9", + "19d10a386c156f953908f6b97e8a2d8507c09b86f6850999e0653a415f557b7b" + ], + "direction_bits": 1, + "leaf_index": 1 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 2, + "content_hash": "32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "33e4d29ab795ad48206a83fc444983ffbead725194c812498b24e4bac1a7af98", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 2, + "leaf_index": 2 + } + }, + "envelope": null + }, + { + "receipt": { + "kind": "object", + "track_alias": 1, + "group_id": 1, + "object_id": 3, + "content_hash": "7cd42c45512150b8f6a578f74a05980a9a73fa5f6d37c486d07fa00796095768", + "joules_micro": 0, + "origin": "", + "merkle_proof": { + "siblings": [ + "b209feb50f8dacaaac3990ea7db23d597fa4c43019459ed0880a5a393bf1cd09", + "911dcaaf1d41d6613b4e863a1314a8ae4a721a6844955ec6f3a18fe699717a79" + ], + "direction_bits": 3, + "leaf_index": 3 + } + }, + "envelope": null + } + ], + "claims": [ + "{\"body\":{\"attests\":\"transmitted\",\"bearer\":\"unidirectional\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"energy\":null},\"class\":\"transmission\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"221a0dd8e74bc2b166368e015819cbc468b22022e53f4e5ee844bb82978da1c44331f619cbf1059559cceb0501d074f4823a66c1ff059560d6ab9ebf0710b109\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8\",\"count\":3,\"duration_ms\":2000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620815000,\"leaf_index\":1,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":896},\"period_ms\":30000,\"repair\":34},{\"content_hash\":\"32c33cbbfdfd7b113967cf1e623debb3a93026fbc9ccc3c5ed3dac943d05ee9a\",\"count\":5,\"duration_ms\":1000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620818000,\"leaf_index\":2,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":32,\"transfer_length\":288},\"period_ms\":30000,\"repair\":34}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":\"1ef35d8507e2ca619f1144381c70b59e31c33bf54a424a7d5a5681035b77ca3a\",\"seq\":1,\"sig\":\"eac19121a35ff3388d1a91073bd10558e8cc65ef0e9f44a931dbce0f002c613dbf42b6e657e2579cf51f365ecb1a82f91fc7a680ff207af59c2e34514a4d7d01\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}" + ], + "loss_ppm": 300000, + "overhead": 2, + "statement": { + "kind": "object", + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "index": 0, + "by_ms": 1793620843999 + }, + "outcome": { + "outcome": "verdict", + "objects": [ + "inclusion-verified", + "inclusion-verified", + "inclusion-verified", + "inclusion-verified" + ], + "claims": [ + "declared", + "stands" + ], + "lines": [ + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 0, + "pass": 2, + "available_ms": 1793620844000, + "bytes_sent": 48640, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 1, + "pass": null, + "available_ms": null, + "bytes_sent": 9216, + "failure_one_in": null + }, + { + "bearer_id": "urn:example:wai-carousel:broadcast-1", + "leaf_index": 2, + "pass": 2, + "available_ms": 1793620849000, + "bytes_sent": 12320, + "failure_one_in": null + } + ], + "statement": "availability_after_deadline" + } + }, { "name": "extension_adds_passes", "description": "At 90% object 0 gains 3 a pass and needs 7 passes, and the first schedule has 5. A later one with 7 extends it: the first is extended, and the object is held at the end of the seventh.", @@ -6622,6 +7803,54 @@ "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":6361,\"duration_ms\":4000,\"esi\":\"repeat\",\"fec\":\"no-code\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"max_block_length\":65536,\"symbol_size\":65535,\"transfer_length\":1416003655831},\"period_ms\":4000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"88c31ef69794a7b9df5a787970aef72755b67486a3fb739e148195eb2eb856a55b090a67e2d8700e70a44e3cb9e533d295ed516e12407e992e6f93b2ae1cd301\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", "outcome": "accept" }, + { + "name": "raptor_greatest_transfer", + "description": "F 35,183,298,355,200 at T 65,535 in 65,535 blocks of 8,192 symbols.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":1,\"source_blocks\":65535,\"sub_blocks\":1,\"symbol_size\":65535,\"transfer_length\":35183298355200},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7f265cc938d89d672f33741a0b510b617a04c9ae0f2f41a903002ab128a64c4c295ab0939b542fb218eadb5b5f04e3da82999d010cadf6b79fac739166492f03\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_greatest_alignment", + "description": "Al 255 and T 255, one sub-block of one sub-symbol.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":255,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":255,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dfd1008eb536fe08ac3116e5a0d9dc9438052caeae0b28e560222855972d08dfda40f132f70ab8191c8f3b9fcfa89601e518ebbfb9383109c17bb344d0f2b704\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_greatest_sub_blocks", + "description": "N 255 at T 1,020, Al 4: the field's greatest, and T / Al.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":255,\"symbol_size\":1020,\"transfer_length\":10200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8b4551d16b9ca11a8c0e3d26a054ebc7f20bcc6f98e2c7fbe92e95a598a489e35ecba2d256a5babf066078066592cb01e916b48ecbb691f9240609c1096bc709\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_greatest_blocks", + "description": "Z 65,535, its field's greatest: every block of 4 symbols.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":65535,\"sub_blocks\":1,\"symbol_size\":4,\"transfer_length\":1048560},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8b906f98b1cefa5ecbab967bb7c56e868c3bc64d66c0bab95261e6b585be01734ab59612e071d38313f7d0a8d232b3824a52fbec3330be7bff6cae7f9255f50a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_block_of_the_fewest", + "description": "One block of 4 symbols, the fewest RFC 5053 §5.7 indexes.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":256},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2b43b154e740ade52aba58bc87967d85147f87cc3dc7d7222af03e73dad1854d69552d0f302f5c927a50cfba020d7db4728547343c1d5c8e8cf27b58762a6608\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_block_of_the_most", + "description": "One block of 8,192 symbols, Kmax.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":4,\"transfer_length\":32768},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"97a773461682931ba01b6e70fb80154b19365b3c27c602b282f408ac4aace2caa6fbc304a0d46e17683fb604fab0460b3f8fddaab5fa7001d4402a96a364400a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_repeat_greatest_esi", + "description": "KL + repair = 2^16 under repeat.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":65519}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"17777062c52c551125d866d7e5b94e18f6b9e8c9d5ba77d8a86e934320203c68bb5964ef0738bdcac1f5f616318d8ed1788d5b2d0f312a06d1740611207cd809\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, + { + "name": "raptor_advance_greatest_esi", + "description": "count · (KL + repair) = 2^16 under advance: 16 passes of 2^12.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":16,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":4000,\"repair\":4079}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"59a0c7c47023e92402491a2608523349009027da805c35fdb878a49f88d3b7dbba12ae32455062ce253a576a1c9fc401ca5065d2ab9b6b302feb71aac5e80a05\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "accept" + }, { "name": "not_scheduled", "description": "attests `sent`.", @@ -6718,6 +7947,114 @@ "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":4,\"transfer_length\":225616},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a44962a34b1940ab98c361f780b42e0ab71a6298dcf125b7590493a4c0105f54e05c4c9da57720173793f0990ee15b55d918da05b137e28be412961d38145705\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", "outcome": "reject step=4 reason=schedule_oti_invalid" }, + { + "name": "raptor_no_transfer", + "description": "F 0.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":0},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"02232a451de65865c56f5f5961fded881ef7dce5939b5cae0af31a10e0b76ab89d0dba094f092b88c5ef4fcb9396e24034e87db65fb3f9a0bc1f127ada28f50a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_transfer_past", + "description": "F 2^45.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":1,\"source_blocks\":65535,\"sub_blocks\":1,\"symbol_size\":65535,\"transfer_length\":35184372088832},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"05628af93ca45d8e01be41627764227f319bbddd7cac6d7c314976a9cc3c461dcb71523c2caf7353d1928ead987ffde8dc803cb5b9184795e0adcf176d9be207\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_greatest_transfer_past", + "description": "F 35,183,298,355,201: a symbol more than 65,535 blocks of 8,192 hold.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":1,\"source_blocks\":65535,\"sub_blocks\":1,\"symbol_size\":65535,\"transfer_length\":35183298355201},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5acdf45f52e35f435cd0865ddc69d750c2fa5ef0502f8c2e475352d883b634950477250b7f385cee91ceb7d1a5487af744fab0eb575ab9dec6d9e3fbb9634f06\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_symbol_past", + "description": "T 65,536.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":65536,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"90718d0ae9ae91366d7e89a385572e4410855fc3286823bbb5b864a94b84bea793fb63da99a2241bcf3b63bcd81c005e02cd0ebdb1f49f0197b59b8f2d3aa908\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_symbol_not_aligned", + "description": "T 66, Al 4.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":66,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5707c34f490943880084ff76cd6f2686c9093c75ae1c9f8f93135e01e87092ba224691c7807f9f96da476db8cbd037a1f0e119f98f511c874de3d2d272b8a90b\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_no_alignment", + "description": "Al 0.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":0,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"61fdb3595f7a73a04300774c015f5d4ed43faf511d1fa192e5e4e1f37b8183479726baaeca42a474d40524dc38966000bc954bebc4a0ea3e770f4b494fa7df05\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_alignment_past", + "description": "Al 256, T 256.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":256,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":256,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6c39a99b402adebdb705b287de81a8074bf478883aff1e6c4862512fcd329372690e3d326409816511c49fafd7a4ed47e4d467b4ba27867e3dfb2e8c1ce08d0f\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_no_block", + "description": "Z 0.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":0,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1328e4fc8780c643dac41e8023bb7491f703f48c843da22195c0c521b992987d008cc14e310ea07b9cf295f24d7e8f6db308084d9aa53e601031c5d8d5781b08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_blocks_past_field", + "description": "Z 65,536, every block of 4 symbols.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":65536,\"sub_blocks\":1,\"symbol_size\":4,\"transfer_length\":1048576},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bf4cf4ebb2f4a19d9395c273ae7a3b597c7692d755ddc736a91bdc58e5cb098c949fbec285fc7dc2b2de2c76876736d590b80d338dbaf2a8372ba4398034670e\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_no_sub_block", + "description": "N 0.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":0,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3393b0665aad512039ad2d58826792568ced54bc52a2565b1aa01cd4b63b4487ff0ed74c89b6beca0936f6bad7933c0d01b2df2072e9a8e1f64b0e0a4a15df03\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_sub_blocks_past_t_over_al", + "description": "N = T / Al + 1.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":17,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bf50305e4276c76a9dfdb7bd614ac778061ac0676ae87e0e37e2a2216052202a001c9705ef09c70e06751af747170c1b1ad96fecbac3fbb61d0aa9d85dc72b0c\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_sub_blocks_past_field", + "description": "N 256 at T 2,048, Al 4, where T / Al allows it.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":256,\"symbol_size\":2048,\"transfer_length\":10240},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"869746741f1a9841de9096e70be9ed2e5f3e9a9e5177385b1a6bf3f47356f546b90d315cbf75c93b3b4715dcda20f50507399b199cece463196b95284a8d930b\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_block_past_k_max", + "description": "One block of 8,193 symbols.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":4,\"transfer_length\":32772},\"period_ms\":30000,\"repair\":0}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5bf619de4c8649cc1ff075d8c0c9c19e19c50df1a15d5aa0dc7144a57ca07b447b9eb107ff086bed579a39c9d368ce7bda75f006bf3ef0d9f2078fd6946be20d\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_block_under_the_fewest", + "description": "One block of 3 symbols, which RFC 5053 §5.7 does not index.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":1,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":192},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"760cc5d082da2975826e48d04cc25e7477907eeae9f0040e80018299c3b961969c4d4d59a8aaf48afab7909a7d6201201950dce8bab3d1340f7138e7475d6d08\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_smaller_block_under_the_fewest", + "description": "Blocks of 4 and 3 symbols: the smaller is held to it.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":2,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":448},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"755a5f5186045c133ed96854b8545b71332dc1607e2195df5450dfc931bf0cd8de5df63a8d90a7d54f974c5be7274b317bda87ae0fe3c8df5c5d2dfde8b02504\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_empty_block", + "description": "Z = ⌈F / T⌉ + 1.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":51,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"89bcb8167b69e01c5eda16997f73af0f654b56967a44a455e6706177b7ac7f0e9dc54b6db8bc7afb159443f1791a9d4bf9dafb6ee9c33fbb3576d7ada36a6507\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_oti_invalid" + }, + { + "name": "raptor_repeat_esi_past", + "description": "KL + repair = 2^16 + 1 under repeat.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":1,\"duration_ms\":4000,\"esi\":\"repeat\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":65520}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9932daa98fac14691a1eb9ecc7c03c7922d5cb1075ee4a7200b80dd67f437c426251681b28f82a15325c049e1786bd2b26011e7016e1d769565edaba336bf90f\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_symbols_invalid" + }, + { + "name": "raptor_advance_esi_past", + "description": "count · (KL + repair) = 2^16 + 16 under advance.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":16,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":4000,\"repair\":4080}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"07178f599021ee5cb15cfda77f4c5d7c93c2c6874a0c77773516060fcf40f23f67447b3538a17eff27b5bffec6197de965414cdac4d63a02b6fccdd5a688f60f\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=4 reason=schedule_symbols_invalid" + }, { "name": "no_code_no_transfer", "description": "L 0.", @@ -6822,8 +8159,8 @@ }, { "name": "fec_unknown", - "description": "fec `raptor`.", - "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"24c502b662451cedd7045a6d502706f30ec17a2cbb23e3fcbeeaefb48760ba46c5e6d15a5b2ca463984ce68c35a54cf554242002b086c2a6889bd6631a34f608\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "description": "fec `lt`, which names no code here.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"lt\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"alignment\":4,\"source_blocks\":3,\"sub_blocks\":1,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"24c502b662451cedd7045a6d502706f30ec17a2cbb23e3fcbeeaefb48760ba46c5e6d15a5b2ca463984ce68c35a54cf554242002b086c2a6889bd6631a34f608\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", "outcome": "reject step=2 reason=field_type" }, { @@ -6838,6 +8175,12 @@ "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptorq\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"max_block_length\":4,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"24c502b662451cedd7045a6d502706f30ec17a2cbb23e3fcbeeaefb48760ba46c5e6d15a5b2ca463984ce68c35a54cf554242002b086c2a6889bd6631a34f608\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", "outcome": "reject step=2 reason=missing_required_field" }, + { + "name": "raptor_oti_of_another_code", + "description": "A Raptor entry with Compact No-Code's members.", + "claim": "{\"body\":{\"attests\":\"scheduled\",\"bearer_id\":\"urn:example:wai-carousel:broadcast-1\",\"objects\":[{\"content_hash\":\"6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35\",\"count\":5,\"duration_ms\":4000,\"esi\":\"advance\",\"fec\":\"raptor\",\"first_ms\":1793620810000,\"leaf_index\":0,\"oti\":{\"max_block_length\":4,\"symbol_size\":64,\"transfer_length\":3200},\"period_ms\":30000,\"repair\":8}]},\"class\":\"schedule\",\"issued_at\":\"2026-11-02T12:00:03Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"24c502b662451cedd7045a6d502706f30ec17a2cbb23e3fcbeeaefb48760ba46c5e6d15a5b2ca463984ce68c35a54cf554242002b086c2a6889bd6631a34f608\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"d04ab232742bb4ab3a1368bd4615e4e6d0224ab71a016baf8520a332c9778737\",\"subject\":\"8a32e5de7ba886f57bddd989ebdf10f04e69898981172288645e90a287915629\",\"subject_type\":\"receipt\"}", + "outcome": "reject step=2 reason=missing_required_field" + }, { "name": "oti_member_unknown", "description": "An `oti` with a sixth member.", @@ -7249,6 +8592,209 @@ "listen_ms": 0 } }, + { + "name": "raptor_advance", + "description": "Raptor at 30%, tuned in before the first pass: each pass adds 36 or 35 of the 45 or 44 needed, so passes 1 and 2.", + "entry": { + "leaf_index": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "fec": "raptor", + "oti": { + "transfer_length": 3200, + "symbol_size": 64, + "source_blocks": 3, + "sub_blocks": 1, + "alignment": 4 + }, + "repair": 34, + "esi": "advance", + "first_ms": 1793620810000, + "period_ms": 30000, + "duration_ms": 4000, + "count": 5 + }, + "at_ms": 1793620809000, + "loss_ppm": 300000, + "overhead": 2, + "held": [ + 0, + 0, + 0 + ], + "outcome": { + "outcome": "plan", + "passes": [ + { + "pass": 1, + "start_ms": 1793620810000, + "end_ms": 1793620814000 + }, + { + "pass": 2, + "start_ms": 1793620840000, + "end_ms": 1793620844000 + } + ], + "complete_ms": 1793620844000, + "listen_ms": 8000 + } + }, + { + "name": "raptor_advance_holding_part", + "description": "Raptor at 30%, holding 9 of each of 45, 45 and 44: one pass adds what each lacks.", + "entry": { + "leaf_index": 0, + "content_hash": "6e9b27dba4cd785a4133bae1d97f220317ab359aa4723c23566190c7698f8d35", + "fec": "raptor", + "oti": { + "transfer_length": 3200, + "symbol_size": 64, + "source_blocks": 3, + "sub_blocks": 1, + "alignment": 4 + }, + "repair": 34, + "esi": "advance", + "first_ms": 1793620810000, + "period_ms": 30000, + "duration_ms": 4000, + "count": 5 + }, + "at_ms": 1793620809000, + "loss_ppm": 300000, + "overhead": 2, + "held": [ + 9, + 9, + 9 + ], + "outcome": { + "outcome": "plan", + "passes": [ + { + "pass": 1, + "start_ms": 1793620810000, + "end_ms": 1793620814000 + } + ], + "complete_ms": 1793620814000, + "listen_ms": 4000 + } + }, + { + "name": "raptor_repeat_one_pass", + "description": "Raptor under repeat at 10%: one pass leaves 44 of 48, and K + 28 is 42.", + "entry": { + "leaf_index": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "fec": "raptor", + "oti": { + "transfer_length": 896, + "symbol_size": 64, + "source_blocks": 1, + "sub_blocks": 1, + "alignment": 4 + }, + "repair": 34, + "esi": "repeat", + "first_ms": 1793620815000, + "period_ms": 30000, + "duration_ms": 2000, + "count": 3 + }, + "at_ms": 1793620810000, + "loss_ppm": 100000, + "overhead": 2, + "held": [ + 0 + ], + "outcome": { + "outcome": "plan", + "passes": [ + { + "pass": 1, + "start_ms": 1793620815000, + "end_ms": 1793620817000 + } + ], + "complete_ms": 1793620817000, + "listen_ms": 2000 + } + }, + { + "name": "raptor_repeat_short", + "description": "Raptor under repeat at 30%: one pass leaves 34, and no later pass is certain to add.", + "entry": { + "leaf_index": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "fec": "raptor", + "oti": { + "transfer_length": 896, + "symbol_size": 64, + "source_blocks": 1, + "sub_blocks": 1, + "alignment": 4 + }, + "repair": 34, + "esi": "repeat", + "first_ms": 1793620815000, + "period_ms": 30000, + "duration_ms": 2000, + "count": 3 + }, + "at_ms": 1793620810000, + "loss_ppm": 300000, + "overhead": 2, + "held": [ + 0 + ], + "outcome": { + "outcome": "plan", + "passes": [ + { + "pass": 1, + "start_ms": 1793620815000, + "end_ms": 1793620817000 + } + ], + "complete_ms": null, + "listen_ms": 2000 + } + }, + { + "name": "raptor_repeat_already_held", + "description": "Holding K + 28 of Raptor's one block: held now.", + "entry": { + "leaf_index": 1, + "content_hash": "1a589a4413ea3c29655f48b96ce5112a8deee4624fccbc613d902f2a666a50f8", + "fec": "raptor", + "oti": { + "transfer_length": 896, + "symbol_size": 64, + "source_blocks": 1, + "sub_blocks": 1, + "alignment": 4 + }, + "repair": 34, + "esi": "repeat", + "first_ms": 1793620815000, + "period_ms": 30000, + "duration_ms": 2000, + "count": 3 + }, + "at_ms": 1793620810000, + "loss_ppm": 300000, + "overhead": 2, + "held": [ + 42 + ], + "outcome": { + "outcome": "plan", + "passes": [], + "complete_ms": 1793620810000, + "listen_ms": 0 + } + }, { "name": "repeat_one_pass", "description": "Object 1 with no loss: the first pass sends 20, all it needs.", diff --git a/wai/live-conformance/carousel_verify.py b/wai/live-conformance/carousel_verify.py index 8e854f8a2..ca3511693 100644 --- a/wai/live-conformance/carousel_verify.py +++ b/wai/live-conformance/carousel_verify.py @@ -73,6 +73,7 @@ def k_primes(): K_PRIME = k_primes() +RAPTOR_MARGIN = (8, 16, 28) # §5.3: the symbols beyond K a Raptor block is held at, at each overhead def k_prime(k): @@ -164,7 +165,9 @@ def monotone(bodies): # ------------------------------------------------------------------ §5.3, §6.3 def needed(e, k, h): - """§5.3: every source symbol for no-code, K′ + h for RaptorQ.""" + """§5.3: every source symbol for no-code, K′ + h for RaptorQ, K and its margin for Raptor.""" + if e["fec"] == "raptor" and not drops("raptor_k_prime"): + return k + (h if drops("raptor_margin") else RAPTOR_MARGIN[h]) return k if e["fec"] == "no-code" else k_prime(k) + h @@ -182,9 +185,9 @@ def block_pass(e, k, loss, h): m = k + e["repair"] x = missed(loss, m) need_ = needed(e, k, h) - if e["fec"] == "raptorq" and e["esi"] == "advance": + if e["fec"] != "no-code" and e["esi"] == "advance": j = CV.ceil_div(need_, m - x) - elif e["fec"] == "raptorq": + elif e["fec"] != "no-code": j = 1 if m - x >= need_ else None else: j = 1 if x == 0 or drops("no_code_loss") else None @@ -199,7 +202,8 @@ def availability(e, loss, h): "pass": j, "available_ms": None if j is None else pass_end(e, j), "bytes_sent": CV.schedule_bytes(e, blocks), - "failure_one_in": [100, 10_000, 1_000_000][h] if e["fec"] == "raptorq" else None, + # §6.3: RFC 6330 §5.8's bound; RFC 5053 states none, and no-code recovers exactly. + "failure_one_in": [100, 10_000, 1_000_000][h] if e["fec"] == "raptorq" or (e["fec"] == "raptor" and drops("raptor_bound")) else None, } @@ -391,7 +395,7 @@ def plan(case): for b in blocks: m = ks[b] + e["repair"] x = missed(loss, m) - if e["fec"] == "raptorq" and e["esi"] == "advance": + if e["fec"] != "no-code" and e["esi"] == "advance": gains[b] = m - x else: gains[b] = max(0, m - n[b] - (0 if drops("again") else x)) @@ -570,18 +574,29 @@ def mutations(doc): def m_set(d): case(d, "key_log_absent")["logs"] = case(d, "suffices")["logs"] + def m_raptor_fec(d): + # The same parameters under RaptorQ, which object 1 at 30% would reach. + c = case(d, "raptor_30_percent") + w = json.loads(c["claims"][1]) + w["body"]["objects"][1]["fec"] = "raptorq" + c["claims"][1] = json.dumps(w, separators=(",", ":"), sort_keys=True) + + def m_raptor_bound(d): + case(d, "raptor_lossless")["outcome"]["lines"][0]["failure_one_in"] = 1_000_000 + def m_set_reason_gone(d): d["inband"] = [c for c in d["inband"] if c["outcome"].get("set") != "inband_chain_incomplete"] return [m_pass, m_bytes, m_failure, m_loss, m_repair, m_statement, m_plan, m_held, m_accept, m_reason_gone, - m_extended_label, m_extended_pass, m_withdrawn, m_interval, m_set, m_set_reason_gone] + m_extended_label, m_extended_pass, m_withdrawn, m_interval, m_set, m_set_reason_gone, m_raptor_fec, + m_raptor_bound] WEAKENINGS = ["subject", "signer", "range", "before", "content", "length", "no_code_loss", "schedule_contradiction", "undeclared", "bidirectional", "deadline", "holding", "late_pass", "again", "extension_count", "extension_one_pass", "extension_period", "extension_members", "extension_drops", "extension_chain", "extension_last", "interval_one_pass", "inband_chain", "inband_log", "inband_log_held", - "inband_log_lists"] + "inband_log_lists", "raptor_k_prime", "raptor_margin", "raptor_bound"] def main(argv): diff --git a/wai/wai-rs/Cargo.lock b/wai/wai-rs/Cargo.lock index ca778ae8a..16591282b 100644 --- a/wai/wai-rs/Cargo.lock +++ b/wai/wai-rs/Cargo.lock @@ -3393,6 +3393,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d20581732dd76fa913c7dff1a2412b714afe3573e94d41c34719de73337cc8ab" +[[package]] +name = "raptor-code" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82d8b31384add1a3f5a235b17323f5b71cfc81bbbef5aeca9e6425f70b8f542" + [[package]] name = "raptorq" version = "2.0.1" @@ -4723,6 +4729,7 @@ dependencies = [ "opus", "ort", "pkg-config", + "raptor-code", "raptorq", "rav1e", "regex", diff --git a/wai/wai-rs/Cargo.toml b/wai/wai-rs/Cargo.toml index 87a945c99..a2b8d7aef 100644 --- a/wai/wai-rs/Cargo.toml +++ b/wai/wai-rs/Cargo.toml @@ -613,10 +613,10 @@ influence = ["contribution", "settlement", "ai_usage"] bearer_receipts = ["key_discovery"] # Carousel schedule (extensions/carousel.md): `wai.bearer.carousel` — when each object of a group # passes on a bearer instance with no return path, and with which forward error correction -# (RaptorQ, RFC 6330; Compact No-Code, RFC 5445). The jwp-receipts `schedule` claim (its body is +# (RaptorQ, RFC 6330; Raptor, RFC 5053; Compact No-Code, RFC 5445). The jwp-receipts `schedule` claim (its body is # claim_receipt's), when a receiver within a loss bound holds each object, and the passes a # receiver listens to. Integer arithmetic over the codes' parameters only; no new dependency -# (its tests encode and decode with an RFC 6330 implementation, a dev-dependency). +# (its tests encode and decode with an RFC 6330 and an RFC 5053 implementation, dev-dependencies). carousel = ["bearer_receipts"] # Holdings (extensions/holdings.md): `wai.delivery.holdings` — a node's signed statement of which # objects of which groups it holds now (`WHD1`: per group, whole or a bitmap), held to an instant @@ -1928,6 +1928,9 @@ wai-ops = { path = "../wai-ops", features = ["oracle"] } # RaptorQ object of the carousel corpus with and decodes from what a receiver within its loss # bound holds. raptorq = "2.0.1" +# An independent implementation of RFC 5053 (MIT), which tests/carousel.rs encodes each Raptor object +# of the carousel corpus with and decodes from what a receiver within its loss bound holds. +raptor-code = "1.0.12" # The project file's schema (wai/schema/) states its name rule as a regular expression; the # reader's tests run it, as a validator of the schema does, beside the reader's own rule. regex = "1" diff --git a/wai/wai-rs/src/carousel.rs b/wai/wai-rs/src/carousel.rs index c97103761..c651d6fe8 100644 --- a/wai/wai-rs/src/carousel.rs +++ b/wai/wai-rs/src/carousel.rs @@ -14,7 +14,8 @@ //! symbols a receiver needs most, and a `repeat` pass is taken to miss again the symbols the //! receiver missed before. //! - A RaptorQ block is held at K′ + h distinct encoding symbols, the count RFC 6330 §5.8 -//! states its bound at, never fewer. +//! states its bound at, never fewer. A Raptor block is held at K and a margin of this text's, +//! with no bound, since RFC 5053 states none. //! - A schedule stands only beside a declaration of its instance that is not `bidirectional`. //! - Along their chain, each schedule of an instance extends the one before it, or every //! schedule of the instance is set aside: passes are added, never withdrawn, moved or changed. @@ -119,17 +120,22 @@ pub fn k_prime(k: u64) -> Option { K_PRIME.get(i).map(|&v| u64::from(v)) } +/// Carousel §5.3: the encoding symbols beyond K a Raptor block is held at, at overhead 0, 1 and 2. +pub const RAPTOR_MARGIN: [u64; 3] = [8, 16, 28]; + /// RFC 6330 §5.8's bound on a decoder's failure at overhead `h` (0, 1 or 2): one in this many. pub fn failure_one_in(h: u64) -> u64 { [100, 10_000, 1_000_000][h as usize] } /// The encoding symbols a receiver needs of a block of `k` source symbols (carousel §5.3): every -/// source symbol for `no-code`, K′ + h for `raptorq`. +/// source symbol for `no-code`, K′ + h for `raptorq`, and K and a margin for `raptor`, which pads +/// no block and whose RFC states no bound at any count. pub fn needed(fec: Fec, k: u64, h: u64) -> u64 { match fec { Fec::NoCode => k, Fec::RaptorQ => k_prime(k).expect("an admitted block has at most K'max symbols") + h, + Fec::Raptor => k + RAPTOR_MARGIN[h as usize], } } @@ -155,8 +161,8 @@ pub fn block_pass(e: &ScheduleEntry, k: u64, loss_ppm: u64, h: u64) -> Option need.div_ceil(m - x), - (Fec::RaptorQ, Esi::Repeat) => { + (Fec::RaptorQ | Fec::Raptor, Esi::Advance) => need.div_ceil(m - x), + (Fec::RaptorQ | Fec::Raptor, Esi::Repeat) => { if m - x >= need { 1 } else { @@ -183,7 +189,8 @@ pub struct Availability { pub available_ms: Option, /// §5.4. pub bytes_sent: u64, - /// RFC 6330 §5.8's bound at the overhead, for `raptorq`; `None` for `no-code`. + /// RFC 6330 §5.8's bound at the overhead, for `raptorq`; `None` for `raptor`, whose RFC states + /// none, and for `no-code`, a block held being recovered exactly. pub failure_one_in: Option, } @@ -241,7 +248,7 @@ pub fn plan(e: &ScheduleEntry, at_ms: u64, loss_ppm: u64, h: u64, held: &[u64]) }; let left = (e.count + 1).saturating_sub(first); let (take, complete) = match (fec, e.esi) { - (Fec::RaptorQ, Esi::Advance) => { + (Fec::RaptorQ | Fec::Raptor, Esi::Advance) => { // Every pass adds m − x ≥ 1 symbols to every block. let wanted = open.iter().map(|&(m, x, need, n)| (need - n).div_ceil(m - x)).max().unwrap_or(0); (wanted.min(left), wanted <= left) @@ -652,6 +659,10 @@ mod tests { Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: 1, alignment: 4 } } + fn rp(f: u64, t: u64, z: u64) -> Oti { + Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: 1, alignment: 4 } + } + #[test] fn k_prime_is_the_least_table_value_at_least_k() { assert_eq!(k_prime(1), Some(10)); @@ -681,6 +692,22 @@ mod tests { assert_eq!(block_pass(&e, 16, 850_000, 2), Some(5), "4 a pass: the last"); } + #[test] + fn raptor_needs_k_and_a_margin_with_no_bound() { + // 48 symbols in 3 blocks of 16; m = 50. + assert_eq!([needed(Fec::Raptor, 16, 0), needed(Fec::Raptor, 16, 1), needed(Fec::Raptor, 16, 2)], [24, 32, 44]); + let e = entry(rp(3_072, 64, 3), 34, Esi::Advance, 5); + assert_eq!(block_pass(&e, 16, 0, 2), Some(1)); + assert_eq!(block_pass(&e, 16, 100_000, 2), Some(1), "45 a pass"); + assert_eq!(block_pass(&e, 16, 300_000, 2), Some(2), "35 a pass"); + assert_eq!(block_pass(&e, 16, 800_000, 2), Some(5), "10 a pass: the last"); + assert_eq!(block_pass(&e, 16, 900_000, 2), None, "5 a pass: 9 passes, past 5"); + assert_eq!(availability(&e, 0, 2).failure_one_in, None); + let r = entry(rp(3_072, 64, 3), 34, Esi::Repeat, 5); + assert_eq!(block_pass(&r, 16, 100_000, 2), Some(1), "50 - 5 = 45 >= 44"); + assert_eq!(block_pass(&r, 16, 150_000, 2), None, "50 - 7 = 43: no later pass is certain to add"); + } + #[test] fn repeat_and_no_code_never_count_on_a_second_pass() { let e = entry(rq(3_072, 64, 3), 8, Esi::Repeat, 5); diff --git a/wai/wai-rs/src/carousel/corpus.rs b/wai/wai-rs/src/carousel/corpus.rs index 27f2afda2..f0fbe920d 100644 --- a/wai/wai-rs/src/carousel/corpus.rs +++ b/wai/wai-rs/src/carousel/corpus.rs @@ -111,6 +111,9 @@ fn other_group() -> GroupReceipt { fn rq(f: u64, t: u64, z: u64) -> Oti { Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: 1, alignment: 4 } } +fn rp(f: u64, t: u64, z: u64) -> Oti { + Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: 1, alignment: 4 } +} fn nc(l: u64, e: u64, b: u64) -> Oti { Oti::NoCode { transfer_length: l, symbol_size: e, max_block_length: b } } @@ -134,6 +137,19 @@ fn broadcast(p: &Publication) -> Vec { ] } +/// A schedule under Raptor: object 0 in three blocks with fresh symbols each pass, object 1 in one +/// block repeated, object 2 in blocks of two sizes with fresh symbols each pass. +fn under_raptor(p: &Publication) -> Vec { + vec![ + // F 3,200, T 64: 50 symbols in blocks of 17, 17, 16; m 51, 51, 50. + entry(p, 0, rp(3_200, 64, 3), 34, Esi::Advance, T0, 30_000, 4_000, 5), + // F 896: 14 symbols, one block; m 48. + entry(p, 1, rp(896, 64, 1), 34, Esi::Repeat, T0 + 5_000, 30_000, 2_000, 3), + // F 288, T 32: 9 symbols in blocks of 5 and 4; m 39, 38. + entry(p, 2, rp(288, 32, 2), 34, Esi::Advance, T0 + 8_000, 30_000, 1_000, 5), + ] +} + /// The multicast schedule: every object, repeated with ample repair. fn multicast(p: &Publication) -> Vec { vec![ @@ -153,7 +169,9 @@ fn end(e: &ScheduleEntry, j: u64) -> u64 { /// The octets an entry sends, by count · (⌈F / T⌉ + Z · repair) · T and count · L. fn sent(e: &ScheduleEntry) -> u64 { match e.oti { - Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, .. } => e.count * (f.div_ceil(t) + z * e.repair) * t, + Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, .. } | Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, .. } => { + e.count * (f.div_ceil(t) + z * e.repair) * t + } Oti::NoCode { transfer_length, .. } => e.count * transfer_length, } } @@ -568,6 +586,44 @@ fn verdict_cases(p: &Publication) -> Vec { ); } + // §5.5: Raptor, whose blocks are held at K and a margin of 8, 16 or 28, with no bound. + { + let rs = under_raptor(p); + for (name, description, loss, h, passes) in [ + ("raptor_lossless", "No loss at overhead 2, where a block needs K + 28: every object is held after its first pass.", 0, 2, [Some(1), Some(1), Some(1)]), + ("raptor_10_percent", "10%: object 0 gains 46 or 45 a pass and needs 45 or 44; object 1 holds 44 of the 42 it needs; object 2 gains 36 or 35 and needs 33 or 32.", 100_000, 2, [Some(1), Some(1), Some(1)]), + ( + "raptor_30_percent", + "30%: object 0 gains 36 or 35 a pass and needs 45 or 44, after pass 2; object 1 holds 34 of 42, never, where K′ + 2 = 20 under RaptorQ would be met; object 2 gains 28 or 27 and needs 33 or 32, after pass 2.", + 300_000, + 2, + [Some(2), None, Some(2)], + ), + ("raptor_overhead_0", "50% at overhead 0, where a block needs K + 8: object 0 gains 26 or 25 and needs 25 or 24; object 1 holds 24 of 22; object 2 gains 20 or 19 and needs 13 or 12.", 500_000, 0, [Some(1), Some(1), Some(1)]), + ("raptor_overhead_1", "50% at overhead 1, where a block needs K + 16: object 0 needs 33 or 32, after pass 2; object 1 holds 24 of 30, never; object 2 needs 21 or 20, after pass 2.", 500_000, 1, [Some(2), None, Some(2)]), + ("raptor_80_percent_last_pass", "80%: object 0 gains 11 or 10 a pass and object 2 gains 8, each held after the fifth and last.", 800_000, 2, [Some(5), None, Some(5)]), + ("raptor_90_percent", "90%: object 0 gains 6 or 5 a pass and needs 8 or 9 passes, and has 5; object 2 gains 4 and needs 9: never.", 900_000, 2, [None, None, None]), + ] { + let mut ch = Chains::default(); + let claims = vec![ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), ch.sign(PUBLISHER, link, schedule(BCAST, rs.clone()))]; + let mut exp = Exp::new(&ALL_D, &["declared", "stands"]); + for (e, j) in rs.iter().zip(passes) { + exp = exp.line(BCAST, e, j, h); + } + push(name, description, inputs(p, true, claims, loss, h), exp.to_value()); + } + let mut ch = Chains::default(); + let claims = vec![ch.sign(PUBLISHER, link, transmission(Bearer::Unidirectional, BCAST)), ch.sign(PUBLISHER, link, schedule(BCAST, rs.clone()))]; + let mut inp = inputs(p, false, claims, 300_000, 2); + inp.statement = object_statement(BCAST, 0, end(&rs[0], 2) - 1); + push( + "raptor_after_deadline", + "Object 0 under Raptor a millisecond short of when it is held: refused, as under any code.", + inp, + Exp::new(&ALL_I, &["declared", "stands"]).line(BCAST, &rs[0], Some(2), 2).line(BCAST, &rs[1], None, 2).line(BCAST, &rs[2], Some(2), 2).statement(Err(AFTER_DEADLINE)).to_value(), + ); + } + // §4.5: a later schedule that extends an earlier one. let changed = |i: usize, f: &dyn Fn(&mut ScheduleEntry)| { let mut v = bc.clone(); @@ -872,6 +928,39 @@ fn claim_cases(p: &Publication) -> Vec { e.period_ms = 4_000; }))); + let raptor = |f: u64, t: u64, z: u64, n: u64, al: u64| Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: n, alignment: al }; + accept("raptor_greatest_transfer", "F 35,183,298,355,200 at T 65,535 in 65,535 blocks of 8,192 symbols.", one(with(&|e| { + e.oti = raptor(RAPTOR_GREATEST, 65_535, 65_535, 1, 1); + e.repair = 0; + e.esi = Esi::Repeat; + e.count = 1; + }))); + accept("raptor_greatest_alignment", "Al 255 and T 255, one sub-block of one sub-symbol.", one(with(&|e| e.oti = raptor(3_200, 255, 1, 1, 255)))); + accept("raptor_greatest_sub_blocks", "N 255 at T 1,020, Al 4: the field's greatest, and T / Al.", one(with(&|e| e.oti = raptor(10_200, 1_020, 1, 255, 4)))); + accept("raptor_greatest_blocks", "Z 65,535, its field's greatest: every block of 4 symbols.", one(with(&|e| { + e.oti = raptor(1_048_560, 4, 65_535, 1, 4); + e.repair = 0; + e.esi = Esi::Repeat; + e.count = 1; + }))); + accept("raptor_block_of_the_fewest", "One block of 4 symbols, the fewest RFC 5053 §5.7 indexes.", one(with(&|e| e.oti = rp(256, 64, 1)))); + accept("raptor_block_of_the_most", "One block of 8,192 symbols, Kmax.", one(with(&|e| { + e.oti = Oti::Raptor { transfer_length: 8_192 * 4, symbol_size: 4, source_blocks: 1, sub_blocks: 1, alignment: 4 }; + e.repair = 0; + }))); + accept("raptor_repeat_greatest_esi", "KL + repair = 2^16 under repeat.", one(with(&|e| { + e.oti = rp(3_200, 64, 3); + e.esi = Esi::Repeat; + e.repair = (1 << 16) - 17; + e.count = 1; + }))); + accept("raptor_advance_greatest_esi", "count · (KL + repair) = 2^16 under advance: 16 passes of 2^12.", one(with(&|e| { + e.oti = rp(3_200, 64, 3); + e.repair = (1 << 12) - 17; + e.count = 16; + e.period_ms = 4_000; + }))); + let mut refuse = |name: &'static str, description: &'static str, body: ClaimBody, step: u8, reason: &str| { let claim = Chains::default().sign_unchecked(PUBLISHER, link, body); out.push(ClaimCase { name, description, claim, outcome: format!("reject step={step} reason={reason}") }); @@ -903,6 +992,50 @@ fn claim_cases(p: &Publication) -> Vec { e.oti = Oti::RaptorQ { transfer_length: 56_404 * 4, symbol_size: 4, source_blocks: 1, sub_blocks: 1, alignment: 4 }; e.repair = 0; })), 4, oti); + refuse("raptor_no_transfer", "F 0.", body(with(&|e| e.oti = rp(0, 64, 1))), 4, oti); + refuse("raptor_transfer_past", "F 2^45.", body(with(&|e| { + e.oti = raptor(1 << 45, 65_535, 65_535, 1, 1); + e.repair = 0; + e.count = 1; + })), 4, oti); + refuse("raptor_greatest_transfer_past", "F 35,183,298,355,201: a symbol more than 65,535 blocks of 8,192 hold.", body(with(&|e| { + e.oti = raptor(RAPTOR_GREATEST + 1, 65_535, 65_535, 1, 1); + e.repair = 0; + e.count = 1; + })), 4, oti); + refuse("raptor_symbol_past", "T 65,536.", body(with(&|e| e.oti = raptor(3_200, 65_536, 1, 1, 4))), 4, oti); + refuse("raptor_symbol_not_aligned", "T 66, Al 4.", body(with(&|e| e.oti = raptor(3_200, 66, 1, 1, 4))), 4, oti); + refuse("raptor_no_alignment", "Al 0.", body(with(&|e| e.oti = raptor(3_200, 64, 1, 1, 0))), 4, oti); + refuse("raptor_alignment_past", "Al 256, T 256.", body(with(&|e| e.oti = raptor(3_200, 256, 1, 1, 256))), 4, oti); + refuse("raptor_no_block", "Z 0.", body(with(&|e| e.oti = rp(3_200, 64, 0))), 4, oti); + refuse("raptor_blocks_past_field", "Z 65,536, every block of 4 symbols.", body(with(&|e| { + e.oti = raptor(1 << 20, 4, 65_536, 1, 4); + e.repair = 0; + e.esi = Esi::Repeat; + e.count = 1; + })), 4, oti); + refuse("raptor_no_sub_block", "N 0.", body(with(&|e| e.oti = raptor(3_200, 64, 3, 0, 4))), 4, oti); + refuse("raptor_sub_blocks_past_t_over_al", "N = T / Al + 1.", body(with(&|e| e.oti = raptor(3_200, 64, 3, 17, 4))), 4, oti); + refuse("raptor_sub_blocks_past_field", "N 256 at T 2,048, Al 4, where T / Al allows it.", body(with(&|e| e.oti = raptor(10_240, 2_048, 1, 256, 4))), 4, oti); + refuse("raptor_block_past_k_max", "One block of 8,193 symbols.", body(with(&|e| { + e.oti = Oti::Raptor { transfer_length: 8_193 * 4, symbol_size: 4, source_blocks: 1, sub_blocks: 1, alignment: 4 }; + e.repair = 0; + })), 4, oti); + refuse("raptor_block_under_the_fewest", "One block of 3 symbols, which RFC 5053 §5.7 does not index.", body(with(&|e| e.oti = rp(192, 64, 1))), 4, oti); + refuse("raptor_smaller_block_under_the_fewest", "Blocks of 4 and 3 symbols: the smaller is held to it.", body(with(&|e| e.oti = rp(448, 64, 2))), 4, oti); + refuse("raptor_empty_block", "Z = ⌈F / T⌉ + 1.", body(with(&|e| e.oti = rp(3_200, 64, 51))), 4, oti); + refuse("raptor_repeat_esi_past", "KL + repair = 2^16 + 1 under repeat.", body(with(&|e| { + e.oti = rp(3_200, 64, 3); + e.esi = Esi::Repeat; + e.repair = (1 << 16) - 16; + e.count = 1; + })), 4, sym); + refuse("raptor_advance_esi_past", "count · (KL + repair) = 2^16 + 16 under advance.", body(with(&|e| { + e.oti = rp(3_200, 64, 3); + e.repair = (1 << 12) - 16; + e.count = 16; + e.period_ms = 4_000; + })), 4, sym); refuse("no_code_no_transfer", "L 0.", body(with(&|e| { e.oti = nc(0, 32, 4); e.repair = 0; @@ -982,9 +1115,10 @@ fn claim_cases(p: &Publication) -> Vec { // reads the signature. let signed = Chains::default().sign(PUBLISHER, link, one(base.clone())); for (name, description, reason) in [ - ("fec_unknown", "fec `raptor`.", "field_type"), + ("fec_unknown", "fec `lt`, which names no code here.", "field_type"), ("esi_unknown", "esi `skip`.", "field_type"), ("oti_of_another_code", "A RaptorQ entry with Compact No-Code's members.", "missing_required_field"), + ("raptor_oti_of_another_code", "A Raptor entry with Compact No-Code's members.", "missing_required_field"), ("oti_member_unknown", "An `oti` with a sixth member.", "unknown_member"), ("entry_member_missing", "An entry with no `count`.", "missing_required_field"), ("first_not_integer", "`first_ms` as a string.", "field_type"), @@ -993,7 +1127,7 @@ fn claim_cases(p: &Publication) -> Vec { let m = v["body"]["objects"][0].as_object_mut().expect("an entry"); match name { "fec_unknown" => { - m.insert("fec".into(), "raptor".into()); + m.insert("fec".into(), "lt".into()); } "esi_unknown" => { m.insert("esi".into(), "skip".into()); @@ -1001,6 +1135,10 @@ fn claim_cases(p: &Publication) -> Vec { "oti_of_another_code" => { m.insert("oti".into(), json!({"transfer_length": 3_200, "symbol_size": 64, "max_block_length": 4})); } + "raptor_oti_of_another_code" => { + m.insert("fec".into(), "raptor".into()); + m.insert("oti".into(), json!({"transfer_length": 3_200, "symbol_size": 64, "max_block_length": 4})); + } "oti_member_unknown" => { m["oti"].as_object_mut().expect("oti").insert("sub_symbol".into(), 4.into()); } @@ -1019,6 +1157,8 @@ fn claim_cases(p: &Publication) -> Vec { /// 9999-12-31T23:59:59.999Z. const LAST: u64 = crate::claim_receipt::schedule::LAST_INSTANT_MS; +/// 65,535 · 65,535 · 8,192: the greatest transfer length RFC 5053 §5.3.1.2 can divide. +const RAPTOR_GREATEST: u64 = 35_183_298_355_200; /// 69,431 · 20,394,401: 6,361 passes of it send 2^53 − 1 octets. const BIG_OBJECT: u64 = 1_416_003_655_831; @@ -1026,6 +1166,8 @@ fn plan_cases(p: &Publication) -> Vec { let bc = broadcast(p); let (e0, e1, e2) = (bc[0].clone(), bc[1].clone(), bc[2].clone()); let e0_seven = ScheduleEntry { count: 7, ..e0.clone() }; + let rs = under_raptor(p); + let (r0, r1) = (rs[0].clone(), rs[1].clone()); let ok = |passes: &[u64], e: &ScheduleEntry, complete: Option| { json!({ "outcome": "plan", @@ -1054,6 +1196,11 @@ fn plan_cases(p: &Publication) -> Vec { case("after_the_last", "After the last pass starts: nothing left.", &e0, T0 + 120_001, 300_000, 2, &[0, 0, 0], ok(&[], &e0, None)), case("too_late_extended", "The receiver of too_late under a schedule extended to seven passes: passes 5 and 6, and it is held.", &e0_seven, T0 + 100_000, 300_000, 2, &[0, 0, 0], ok(&[5, 6], &e0_seven, Some(end(&e0_seven, 6)))), case("already_held", "Holding 20 of every block: held now, nothing to listen to.", &e0, T0 + 50_000, 300_000, 2, &[20, 20, 20], ok(&[], &e0, Some(T0 + 50_000))), + case("raptor_advance", "Raptor at 30%, tuned in before the first pass: each pass adds 36 or 35 of the 45 or 44 needed, so passes 1 and 2.", &r0, T0 - 1_000, 300_000, 2, &[0, 0, 0], ok(&[1, 2], &r0, Some(end(&r0, 2)))), + case("raptor_advance_holding_part", "Raptor at 30%, holding 9 of each of 45, 45 and 44: one pass adds what each lacks.", &r0, T0 - 1_000, 300_000, 2, &[9, 9, 9], ok(&[1], &r0, Some(end(&r0, 1)))), + case("raptor_repeat_one_pass", "Raptor under repeat at 10%: one pass leaves 44 of 48, and K + 28 is 42.", &r1, T0, 100_000, 2, &[0], ok(&[1], &r1, Some(end(&r1, 1)))), + case("raptor_repeat_short", "Raptor under repeat at 30%: one pass leaves 34, and no later pass is certain to add.", &r1, T0, 300_000, 2, &[0], ok(&[1], &r1, None)), + case("raptor_repeat_already_held", "Holding K + 28 of Raptor's one block: held now.", &r1, T0, 300_000, 2, &[42], ok(&[], &r1, Some(T0))), case("repeat_one_pass", "Object 1 with no loss: the first pass sends 20, all it needs.", &e1, T0, 0, 2, &[0], ok(&[1], &e1, Some(end(&e1, 1)))), case("repeat_short", "Object 1 at 10%: one pass leaves 18 of 20, and no later pass is certain to add.", &e1, T0, 100_000, 2, &[0], ok(&[1], &e1, None)), case("repeat_adds_nothing", "Holding 18 at 10%: a pass adds max(0, 20 − 18 − 2) = 0.", &e1, T0, 100_000, 2, &[18], ok(&[], &e1, None)), diff --git a/wai/wai-rs/src/claim_receipt/schedule.rs b/wai/wai-rs/src/claim_receipt/schedule.rs index 12e374d27..e2b9ec41c 100644 --- a/wai/wai-rs/src/claim_receipt/schedule.rs +++ b/wai/wai-rs/src/claim_receipt/schedule.rs @@ -20,6 +20,14 @@ pub const K_PRIME_MAX: u64 = 56_403; pub const RAPTORQ_MAX_TRANSFER: u64 = 942_574_504_275; /// RFC 6330 §3.2: ESIs are 24 bits. pub const RAPTORQ_ESIS: u64 = 1 << 24; +/// RFC 5053 §5.1.2: the most source symbols one source block has. +pub const RAPTOR_K_MAX: u64 = 8_192; +/// RFC 5053 §5.7: the fewest source symbols a block has a systematic index for. +pub const RAPTOR_K_MIN: u64 = 4; +/// RFC 5053 §3.2.2: a transfer length is less than this. +pub const RAPTOR_TRANSFER_LIMIT: u64 = 1 << 45; +/// RFC 5053 §3.1: ESIs are 16 bits. +pub const RAPTOR_ESIS: u64 = 1 << 16; /// RFC 5445 §3.2.1: source block numbers and ESIs are 16 bits. pub const NO_CODE_FIELD: u64 = 1 << 16; /// 9999-12-31T23:59:59.999Z, the last instant a pass may end at (carousel §4.2 rule 3.3). @@ -38,6 +46,8 @@ const NO_CODE_OTI: &[&str] = &["transfer_length", "symbol_size", "max_block_leng pub enum Fec { /// RFC 6330, FEC Encoding ID 6. RaptorQ, + /// RFC 5053, FEC Encoding ID 1. + Raptor, /// RFC 5445, FEC Encoding ID 0. NoCode, } @@ -46,12 +56,13 @@ impl Fec { pub fn label(self) -> &'static str { match self { Fec::RaptorQ => "raptorq", + Fec::Raptor => "raptor", Fec::NoCode => "no-code", } } pub fn from_label(s: &str) -> Option { - [Fec::RaptorQ, Fec::NoCode].into_iter().find(|f| f.label() == s) + [Fec::RaptorQ, Fec::Raptor, Fec::NoCode].into_iter().find(|f| f.label() == s) } } @@ -82,6 +93,8 @@ impl Esi { pub enum Oti { /// RFC 6330 §3.3.2, §3.3.3: F, T, Z, N, Al. RaptorQ { transfer_length: u64, symbol_size: u64, source_blocks: u64, sub_blocks: u64, alignment: u64 }, + /// RFC 5053 §3.2.2, §3.2.3: F, T, Z, N, Al. + Raptor { transfer_length: u64, symbol_size: u64, source_blocks: u64, sub_blocks: u64, alignment: u64 }, /// RFC 5445 §3.2.2.2: the transfer length, the encoding symbol length, and the maximum /// source block length in symbols. NoCode { transfer_length: u64, symbol_size: u64, max_block_length: u64 }, @@ -105,23 +118,24 @@ impl Oti { pub fn fec(&self) -> Fec { match self { Oti::RaptorQ { .. } => Fec::RaptorQ, + Oti::Raptor { .. } => Fec::Raptor, Oti::NoCode { .. } => Fec::NoCode, } } pub fn transfer_length(&self) -> u64 { match *self { - Oti::RaptorQ { transfer_length, .. } | Oti::NoCode { transfer_length, .. } => transfer_length, + Oti::RaptorQ { transfer_length, .. } | Oti::Raptor { transfer_length, .. } | Oti::NoCode { transfer_length, .. } => transfer_length, } } pub fn symbol_size(&self) -> u64 { match *self { - Oti::RaptorQ { symbol_size, .. } | Oti::NoCode { symbol_size, .. } => symbol_size, + Oti::RaptorQ { symbol_size, .. } | Oti::Raptor { symbol_size, .. } | Oti::NoCode { symbol_size, .. } => symbol_size, } } - /// Carousel §5.1 and §5.2: whether the code admits these parameters. + /// Carousel §5.1, §5.2 and §5.5: whether the code admits these parameters. pub fn admitted(&self) -> bool { match *self { Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: n, alignment: al } => { @@ -135,6 +149,17 @@ impl Oti { && z <= f.div_ceil(t) && f.div_ceil(t).div_ceil(z) <= K_PRIME_MAX } + Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: n, alignment: al } => { + (1..RAPTOR_TRANSFER_LIMIT).contains(&f) + && (1..=255).contains(&al) + && (1..=65_535).contains(&t) + && t.is_multiple_of(al) + && (1..=65_535).contains(&z) + && (1..=255).contains(&n) + && n <= t / al + && f.div_ceil(t) / z >= RAPTOR_K_MIN + && f.div_ceil(t).div_ceil(z) <= RAPTOR_K_MAX + } Oti::NoCode { transfer_length: l, symbol_size: e, max_block_length: b } => { if !((1..1 << 48).contains(&l) && (1..=65_535).contains(&e) && (1..1 << 32).contains(&b)) { return false; @@ -147,11 +172,12 @@ impl Oti { } /// The source blocks by size, in the order the object is divided into them: the larger - /// first, a size no block has left out (carousel §5.1, §5.2). Only for parameters + /// first, a size no block has left out (carousel §5.1, §5.2, §5.5). Only for parameters /// [`Oti::admitted`] admits. pub fn blocks(&self) -> Vec { let (large, small, n_large, n_small) = match *self { - Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, .. } => partition(f.div_ceil(t), z), + Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, .. } + | Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, .. } => partition(f.div_ceil(t), z), Oti::NoCode { transfer_length: l, symbol_size: e, max_block_length: b } => { let ts = l.div_ceil(e); let nb = ts.div_ceil(b); @@ -169,7 +195,8 @@ impl Oti { fn to_value(self) -> Value { match self { - Oti::RaptorQ { transfer_length, symbol_size, source_blocks, sub_blocks, alignment } => json_obj(&[ + Oti::RaptorQ { transfer_length, symbol_size, source_blocks, sub_blocks, alignment } + | Oti::Raptor { transfer_length, symbol_size, source_blocks, sub_blocks, alignment } => json_obj(&[ ("transfer_length", transfer_length), ("symbol_size", symbol_size), ("source_blocks", source_blocks), @@ -186,7 +213,8 @@ impl Oti { fn values(&self) -> Vec { match *self { - Oti::RaptorQ { transfer_length, symbol_size, source_blocks, sub_blocks, alignment } => { + Oti::RaptorQ { transfer_length, symbol_size, source_blocks, sub_blocks, alignment } + | Oti::Raptor { transfer_length, symbol_size, source_blocks, sub_blocks, alignment } => { vec![transfer_length, symbol_size, source_blocks, sub_blocks, alignment] } Oti::NoCode { transfer_length, symbol_size, max_block_length } => { @@ -237,14 +265,15 @@ impl ScheduleEntry { fn symbols_named(&self) -> bool { match self.oti { Oti::NoCode { .. } => self.repair == 0 && self.esi == Esi::Repeat, - Oti::RaptorQ { .. } => { + Oti::RaptorQ { .. } | Oti::Raptor { .. } => { let kl = self.oti.blocks()[0].k; let Some(m) = kl.checked_add(self.repair) else { return false }; let greatest = match self.esi { Esi::Repeat => Some(m), Esi::Advance => self.count.checked_mul(m), }; - greatest.is_some_and(|g| g <= RAPTORQ_ESIS) + let esis = if self.oti.fec() == Fec::Raptor { RAPTOR_ESIS } else { RAPTORQ_ESIS }; + greatest.is_some_and(|g| g <= esis) } } } @@ -266,7 +295,7 @@ impl ScheduleEntry { /// [`ScheduleEntry::bytes_sent`], `None` past `u64`. fn checked_bytes_sent(&self) -> Option { match self.oti { - Oti::RaptorQ { symbol_size, .. } => { + Oti::RaptorQ { symbol_size, .. } | Oti::Raptor { symbol_size, .. } => { let per_pass = self.oti.blocks().iter().try_fold(0u64, |a, s| { s.k.checked_add(self.repair).and_then(|m| m.checked_mul(s.blocks)).and_then(|n| a.checked_add(n)) })?; @@ -348,6 +377,16 @@ impl ScheduleEntry { alignment: get_int(o, "alignment")?, } } + Fec::Raptor => { + members(o, RAPTORQ_OTI)?; + Oti::Raptor { + transfer_length: get_int(o, "transfer_length")?, + symbol_size: get_int(o, "symbol_size")?, + source_blocks: get_int(o, "source_blocks")?, + sub_blocks: get_int(o, "sub_blocks")?, + alignment: get_int(o, "alignment")?, + } + } Fec::NoCode => { members(o, NO_CODE_OTI)?; Oti::NoCode { @@ -527,6 +566,10 @@ mod tests { Oti::RaptorQ { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: n, alignment: al } } + fn rp(f: u64, t: u64, z: u64, n: u64, al: u64) -> Oti { + Oti::Raptor { transfer_length: f, symbol_size: t, source_blocks: z, sub_blocks: n, alignment: al } + } + fn nc(l: u64, e: u64, b: u64) -> Oti { Oti::NoCode { transfer_length: l, symbol_size: e, max_block_length: b } } @@ -572,6 +615,47 @@ mod tests { assert!(!rq(K_PRIME_MAX * 4 + 1, 4, 1, 1, 4).admitted(), "one block past K'max"); } + #[test] + fn raptor_blocks_follow_the_partition() { + // 15 symbols in two blocks: 8 and 7. + assert_eq!(rp(960, 64, 2, 1, 4).blocks(), vec![BlockSize { k: 8, blocks: 1 }, BlockSize { k: 7, blocks: 1 }]); + } + + #[test] + fn raptor_parameters_are_held_to_rfc_5053() { + assert!(rp(1000, 64, 2, 1, 4).admitted()); + assert!(!rp(0, 64, 1, 1, 4).admitted(), "no octets"); + assert!(rp(65_535 * 65_535 * 8_192, 65_535, 65_535, 1, 1).admitted(), "the most blocks of the most symbols"); + assert!(!rp(65_535 * 65_535 * 8_192 + 1, 65_535, 65_535, 1, 1).admitted(), "a block past Kmax"); + assert!(!rp(1 << 45, 65_535, 65_535, 1, 1).admitted(), "past the greatest F"); + assert!(!rp(1000, 66, 1, 1, 4).admitted(), "T not a multiple of Al"); + assert!(!rp(1000, 64, 1, 1, 0).admitted(), "no alignment"); + assert!(!rp(1000, 256, 1, 1, 256).admitted(), "past Al's field"); + assert!(!rp(1000, 64, 0, 1, 4).admitted(), "no block"); + assert!(rp(1 << 20, 4, 65_535, 1, 4).admitted(), "Z at its field's greatest"); + assert!(!rp(1 << 20, 4, 65_536, 1, 4).admitted(), "past Z's field"); + assert!(!rp(1000, 64, 1, 0, 4).admitted(), "no sub-block"); + assert!(!rp(1000, 64, 1, 17, 4).admitted(), "a sub-symbol under Al"); + assert!(rp(1000, 64, 1, 16, 4).admitted(), "sub-symbols of Al each"); + assert!(rp(8_160, 1_020, 1, 255, 4).admitted(), "N at its field's greatest"); + assert!(!rp(8_192, 2_048, 1, 256, 4).admitted(), "past N's field"); + assert!(rp(256, 64, 1, 1, 4).admitted(), "a block of the fewest symbols"); + assert!(!rp(192, 64, 1, 1, 4).admitted(), "a block under the fewest symbols"); + assert!(!rp(448, 64, 2, 1, 4).admitted(), "blocks of 4 and 3: the smaller under the fewest"); + assert!(rp(8_192 * 4, 4, 1, 1, 4).admitted(), "one block of Kmax"); + assert!(!rp(8_192 * 4 + 1, 4, 1, 1, 4).admitted(), "one block past Kmax"); + } + + #[test] + fn raptor_symbols_fit_sixteen_bits() { + let e = |repair, esi, count| ScheduleEntry { oti: rp(1_000, 64, 1, 1, 4), repair, esi, count, ..entry(0, 1, 10_000) }; + // 16 source symbols. + assert!(e((1 << 16) - 16, Esi::Repeat, 1).symbols_named()); + assert!(!e((1 << 16) - 15, Esi::Repeat, 1).symbols_named()); + assert!(e((1 << 12) - 16, Esi::Advance, 16).symbols_named()); + assert!(!e((1 << 12) - 15, Esi::Advance, 16).symbols_named()); + } + #[test] fn no_code_parameters_are_held_to_rfc_5445() { assert!(nc(100, 10, 4).admitted()); diff --git a/wai/wai-rs/tests/carousel.rs b/wai/wai-rs/tests/carousel.rs index a7c335ac7..2b022a48e 100644 --- a/wai/wai-rs/tests/carousel.rs +++ b/wai/wai-rs/tests/carousel.rs @@ -4,7 +4,8 @@ //! the class codes at their steps, and Appendix A is the reference's table of K′. Against an //! independent implementation of RFC 6330: the table of K′ and the partition agree for every block //! size, and each RaptorQ object of the corpus that a case holds available at a pass decodes from -//! what a receiver within its loss bound holds by that pass's end. +//! what a receiver within its loss bound holds by that pass's end. Against an independent +//! implementation of RFC 5053, each Raptor object does the same. #![cfg(feature = "carousel")] use std::collections::BTreeMap; @@ -139,6 +140,152 @@ fn receive(e: &ScheduleEntry, data: &[u8], loss_ppm: u64, pass: u64) -> Option Option> { + let Oti::Raptor { transfer_length, symbol_size: t, source_blocks: z, .. } = e.oti else { return None }; + let kt = transfer_length.div_ceil(t); + let (kl, ks, zl, zs) = partition(kt, z); + let mut padded = data.to_vec(); + padded.resize((kt * t) as usize, 0); + let advance = e.esi == Esi::Advance; + let mut out = Vec::with_capacity(padded.len()); + let mut at = 0usize; + for k in std::iter::repeat_n(kl, zl as usize).chain(std::iter::repeat_n(ks, zs as usize)) { + let length = (k * t) as usize; + let block = &padded[at..at + length]; + at += length; + let mut encoder = raptor_code::SourceBlockEncoder::new(block, k as usize).expect("a block RFC 5053 admits"); + assert_eq!(u64::from(encoder.nb_source_symbols()), k); + let mut decoder = raptor_code::SourceBlockDecoder::new(k as usize); + let m = k + e.repair; + let x = missed(loss_ppm, m); + for j in 1..=(if advance { pass } else { 1 }) { + let start = if advance { (j - 1) * m } else { 0 }; + for esi in start + x..start + m { + decoder.push_encoding_symbol(&encoder.fountain(esi as u32), esi as u32); + } + } + if !decoder.fully_specified() { + return None; + } + out.extend(decoder.decode(length)?); + } + out.truncate(transfer_length as usize); + Some(out) +} + +/// Of `trials` sets of `k` + `margin` distinct encoding symbols of a block of `k`, chosen uniformly +/// at random from a fixed seed, how many an independent RFC 5053 decoder cannot solve. +fn raptor_failures(k: usize, margin: usize, trials: usize, seed: u64) -> usize { + let block: Vec = (0..k * 4).map(|i| (i * 131 + 7) as u8).collect(); + let mut encoder = raptor_code::SourceBlockEncoder::new(&block, k).expect("a block RFC 5053 admits"); + let n = k + 3 * margin + 40; + let symbols: Vec> = (0..n as u32).map(|esi| encoder.fountain(esi)).collect(); + let mut state = seed; + let mut next = move || { + state ^= state << 13; + state ^= state >> 7; + state ^= state << 17; + state as usize + }; + (0..trials) + .filter(|_| { + let mut esis: Vec = (0..n).collect(); + for i in 0..k + margin { + let j = i + next() % (n - i); + esis.swap(i, j); + } + let mut decoder = raptor_code::SourceBlockDecoder::new(k); + for &esi in &esis[..k + margin] { + decoder.push_encoding_symbol(&symbols[esi], esi as u32); + } + !decoder.fully_specified() + }) + .count() +} + +/// Carousel §5.3 holds a Raptor block at K and a margin of this text's, RFC 5053 stating no bound. +/// An independent decoder, on a fixed sample, fails on many blocks at K + 2 and on few at each +/// margin. This is a measurement of that sample, as §5.3 says, and no bound. +#[test] +fn raptor_margins_keep_decoding_failures_rare() { + use wai::carousel::RAPTOR_MARGIN; + for k in [16, 64] { + let seed = 0x9E37_79B9_7F4A_7C15 ^ k as u64; + let at_two = raptor_failures(k, 2, 400, seed); + assert!(at_two >= 40, "K = {k}: {at_two} of 400 at K + 2"); + let first = raptor_failures(k, RAPTOR_MARGIN[0] as usize, 2_000, seed); + assert!(first <= 20, "K = {k}: {first} of 2,000 at K + {}", RAPTOR_MARGIN[0]); + let second = raptor_failures(k, RAPTOR_MARGIN[1] as usize, 10_000, seed); + assert!(second <= 1, "K = {k}: {second} of 10,000 at K + {}", RAPTOR_MARGIN[1]); + let third = raptor_failures(k, RAPTOR_MARGIN[2] as usize, 10_000, seed); + assert_eq!(third, 0, "K = {k}: of 10,000 at K + {}", RAPTOR_MARGIN[2]); + } +} + +/// The measurement carousel §5.3 quotes, by block size and margin, from fixed seeds. It takes some +/// minutes in a release build: `cargo test --release --test carousel -- --ignored --nocapture`. +#[test] +#[ignore = "a measurement of some minutes, run by hand in a release build; carousel §5.3 quotes it"] +fn raptor_margin_measurement() { + let sample: &[(usize, &[(usize, usize)])] = &[ + (2, &[(4, 6_000), (16, 6_000), (64, 6_000), (1_024, 600)]), + (8, &[(4, 1_200_000), (8, 1_200_000), (16, 1_200_000), (64, 1_200_000), (256, 240_000), (1_024, 42_000), (2_048, 18_000), (8_192, 1_800)]), + (16, &[(4, 1_800_000), (8, 1_800_000), (16, 1_800_000), (64, 1_800_000), (256, 360_000), (1_024, 60_000), (2_048, 18_000), (8_192, 1_800)]), + (28, &[(4, 6_000_000), (8, 6_000_000), (16, 6_000_000), (32, 6_000_000), (64, 6_000_000), (128, 3_000_000), (256, 1_200_000), (1_024, 120_000), (2_048, 24_000), (8_192, 1_800)]), + ]; + for (margin, sizes) in sample { + for (k, trials) in *sizes { + let (k, margin, trials) = (*k, *margin, *trials); + let failures: usize = std::thread::scope(|s| { + let runs: Vec<_> = (0..6u64) + .map(|t| s.spawn(move || raptor_failures(k, margin, trials / 6, 0x9E37_79B9_7F4A_7C15 ^ (((k as u64) << 24) | ((margin as u64) << 8) | (t + 1))))) + .collect(); + runs.into_iter().map(|r| r.join().expect("a run")).sum() + }); + println!("K {k}, K + {margin}: {failures} of {trials}"); + } + } +} + +#[test] +fn each_raptor_object_decodes_from_what_a_receiver_within_its_bound_holds() { + let files = committed(); + let doc: Value = serde_json::from_str(&files["vectors.json"]).expect("the corpus"); + let mut decoded = 0; + for c in doc["verdicts"].as_array().expect("verdict cases") { + let Some(lines) = c["outcome"]["lines"].as_array() else { continue }; + let loss = c["loss_ppm"].as_u64().expect("a loss bound"); + let schedules: Vec = c["claims"] + .as_array() + .expect("claims") + .iter() + .map(|w| serde_json::from_str::(w.as_str().expect("a claim")).expect("json")) + .filter(|v| v["class"] == "schedule") + .collect(); + for line in lines { + let Some(pass) = line["pass"].as_u64() else { continue }; + let leaf = line["leaf_index"].as_u64().expect("a leaf") as usize; + let Some(data) = c["objects"][leaf]["envelope"].as_str().map(hex) else { continue }; + let entry = schedules + .iter() + .filter(|s| s["body"]["bearer_id"] == line["bearer_id"]) + .flat_map(|s| s["body"]["objects"].as_array().expect("entries").iter()) + .rfind(|o| o["leaf_index"] == line["leaf_index"]) + .map(|o| ScheduleEntry::from_value(o).expect("an entry that stands")) + .expect("the entry of a line"); + if !matches!(entry.oti, Oti::Raptor { .. }) { + continue; + } + let got = receive_raptor(&entry, &data, loss, pass); + assert_eq!(got.as_deref(), Some(&data[..]), "{} object {leaf} on {} by pass {pass}", c["name"], line["bearer_id"]); + decoded += 1; + } + } + assert!(decoded >= 10, "only {decoded} objects decoded"); +} + #[test] fn each_raptorq_object_decodes_from_what_a_receiver_within_its_bound_holds() { let files = committed(); -- 2.54.0 (Apple Git-157) From effff8f260496c68fd434a06e3ea4fb552ef2a45 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 5 Nov 2026 18:24:54 -0500 Subject: [PATCH 4/4] wai dev's test: the stand-in room service listens without a reverse lookup tests/cli_studio.rs failed on every run on one macOS runner and passed on every other runner, 3 of 3 against 19 of 19 on 5 November, with "the room service's clock on the relay: not within 30 s". The stand-in room service starts an HTTPServer, whose server_bind calls socket.getfqdn before the server listens. On that host, under the runner's Python 3.15.2, getfqdn("127.0.0.1") takes 35 s, past the 30 s wai dev waits, and a stack dump of the stalled stand-in shows it there. The stand-in relay opens a plain socket and answers in 0.1 s. Nothing here reads the name, so the fixture no longer asks for it. On that host and Python the room stand-in took 35.5 s and now takes 0.12 s. A socket.getfqdn planted to stall for 40 s fails the test without this change, with the same message, and passes with it. Changelog: none Co-Authored-By: Claude Opus 5.5 --- wai/wai-rs/tests/fixtures/dev-stack/fake-stack.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/wai/wai-rs/tests/fixtures/dev-stack/fake-stack.py b/wai/wai-rs/tests/fixtures/dev-stack/fake-stack.py index cce944f03..f8c7a71e4 100755 --- a/wai/wai-rs/tests/fixtures/dev-stack/fake-stack.py +++ b/wai/wai-rs/tests/fixtures/dev-stack/fake-stack.py @@ -15,6 +15,7 @@ import json import os import re import socket +import socketserver import sys import threading import time @@ -55,6 +56,14 @@ class Room(http.server.BaseHTTPRequestHandler): pass +class Server(http.server.ThreadingHTTPServer): + """HTTPServer looks up a name for its address before it listens, and nothing here reads the + name. On some hosts that lookup takes 35 s, past what `wai dev` waits for a service.""" + + def server_bind(self): + socketserver.TCPServer.server_bind(self) + + def main(argv): if argv[:1] in (["keygen"], ["relay-lines"]): open(argv[1], "a").close() @@ -73,7 +82,7 @@ def main(argv): while True: c, _ = s.accept() c.close() - http.server.ThreadingHTTPServer(listen_addr(config, "listen"), Room).serve_forever() + Server(listen_addr(config, "listen"), Room).serve_forever() return 0 -- 2.54.0 (Apple Git-157)