From 8cf9c53a035fb8da75da20f39321f154a4465177 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Tue, 6 Oct 2026 16:26:49 -0400 Subject: [PATCH 01/21] wai-web: staged measurement and the session claim in the browser (W5-4) wai-web binds wai::stage_measure, the code wai_stage_measure runs, compiled to wasm32 (src/measure.rs): evaluateTitle gives the text `eval --json` prints for a title, simulate and simulateModel the text `sim` prints, countObject one envelope's counted bytes or the code it is not countable with, qualityRgb8 one picture pair's integers (sums of squares as decimal strings), outputRoot the output tree's root. A title is read from a map of files; titleMissing names the next file it needs, so a page fetches them one at a time. receipt_claims builds and runs for wasm32 with stage_measure, so signing is exposed: sessionBegin records a session at its entry object (SessionRecorder), decoderFor/presented/received record what the page did, finish seals the reconstruct-session claim with a page-supplied seed (energy null), and verifyClaim runs the claim-conformance runner against the outputs and the objects. CI builds receipt_claims,stage_measure for wasm32 beside the stage_measure guard. demo/verify_measure_wasm.mjs requires, from the wasm32 build, every golden, refusal title, counted object, quality pair and simulator result of staged-measure-conformance/ byte for byte, and a page-recorded session per fixture equal to the native tool's claim byte for byte. demo/verify_measure.sh adds the native `eval --json` of every fixture (cmp against the wasm32 text) and the native and Python claim verifiers' verdicts on every browser-sealed session. wai-web-wasm.yml runs it (the W17 line). Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-conformance.yml | 3 + .github/workflows/wai-web-wasm.yml | 32 +- wai/CHANGELOG.md | 27 + wai/wai-web/Cargo.lock | 21 + wai/wai-web/Cargo.toml | 2 +- wai/wai-web/demo/README.md | 36 ++ wai/wai-web/demo/verify_measure.sh | 73 +++ wai/wai-web/demo/verify_measure_wasm.mjs | 252 ++++++++ wai/wai-web/src/lib.rs | 7 + wai/wai-web/src/measure.rs | 720 +++++++++++++++++++++++ 10 files changed, 1170 insertions(+), 3 deletions(-) create mode 100755 wai/wai-web/demo/verify_measure.sh create mode 100644 wai/wai-web/demo/verify_measure_wasm.mjs create mode 100644 wai/wai-web/src/measure.rs diff --git a/.github/workflows/wai-conformance.yml b/.github/workflows/wai-conformance.yml index e45d98694..64ceb1b5e 100644 --- a/.github/workflows/wai-conformance.yml +++ b/.github/workflows/wai-conformance.yml @@ -259,6 +259,9 @@ jobs: # The staged-measurement core is wasm32-clean: a browser computes the same figures. # Built, not only checked, so codegen and linking of the library run for wasm32. cargo build --lib --target wasm32-unknown-unknown --no-default-features --features stage_measure + # With the claim classes too: a browser sink seals its reconstruct-session claim + # (jwp-receipts §2.4.12), and wai-web's measurement binding signs with them. + cargo build --lib --target wasm32-unknown-unknown --no-default-features --features receipt_claims,stage_measure # So is delivery telemetry: a browser sink writes the same reports. cargo build --lib --target wasm32-unknown-unknown --no-default-features --features telemetry # carriage: every registered capability round-trips byte-exact. cli_wrap_intent and diff --git a/.github/workflows/wai-web-wasm.yml b/.github/workflows/wai-web-wasm.yml index e751c2afa..70078b152 100644 --- a/.github/workflows/wai-web-wasm.yml +++ b/.github/workflows/wai-web-wasm.yml @@ -16,6 +16,11 @@ name: wai-web wasm32 # - demo/verify_staged_wasm.mjs against the staged-delivery corpus # wai/staged-conformance/: every case replayed through the wasm32 StageSink # must give the reports, final units and stage hashes the native sink wrote; +# - demo/verify_measure.sh against the staged-measurement corpus +# wai/staged-measure-conformance/: every figure of the wasm32 measurement +# binding equals the corpus and the native tool's byte for byte, and the +# session claims it seals are verified natively and by the independent +# Python verifier with the same verdicts; # - a byte comparison of the demo's staged int_synth copies with the corpus; # - the crate's wasm_tests under wasm-bindgen-test-runner, and its native unit # tests on the host. @@ -52,6 +57,8 @@ on: - 'wai/wai-quantum/**' - 'wai/neural-conformance/**' - 'wai/staged-conformance/**' + - 'wai/staged-measure-conformance/**' + - 'wai/claim-conformance/**' - 'wai/registry/**' - '.github/workflows/wai-web-wasm.yml' pull_request: @@ -61,6 +68,8 @@ on: - 'wai/wai-quantum/**' - 'wai/neural-conformance/**' - 'wai/staged-conformance/**' + - 'wai/staged-measure-conformance/**' + - 'wai/claim-conformance/**' - 'wai/registry/**' - '.github/workflows/wai-web-wasm.yml' @@ -118,7 +127,9 @@ jobs: # writers `pack` and `packMulti` refuse a payload that is not the format SPEC §5 # pins its integer capability to, and a manifest that names a member twice (tests); the # staged-delivery binding's pure half replays the staged corpus and reads a layer's - # header and cost (stage::tests). The count check turns a test that + # header and cost (stage::tests); the measurement binding's pure half evaluates the + # staged-measurement corpus to its goldens and seals a page-recorded session equal + # to the native tool's (measure::tests). The count check turns a test that # stopped being compiled into a failure instead of a silent "0 passed". - name: wai-web native unit tests shell: bash @@ -126,7 +137,7 @@ jobs: run: | set -euo pipefail cargo test --locked --lib 2>&1 | tee "$RUNNER_TEMP/wai-web-native.log" - grep -q "test result: ok. 14 passed; 0 failed" "$RUNNER_TEMP/wai-web-native.log" + grep -q "test result: ok. 21 passed; 0 failed" "$RUNNER_TEMP/wai-web-native.log" - name: wasm32 int_synth decode equals the frozen native corpus shell: bash working-directory: wai/wai-web @@ -148,6 +159,23 @@ jobs: shell: bash working-directory: wai/wai-web run: node demo/verify_staged_wasm.mjs ./pkg-node/wai_web.js ../staged-conformance + # The staged-measurement binding (src/measure.rs) over wai/staged-measure-conformance/: + # every fixture's evaluation, the refusal titles, the counted objects, the quality + # pairs and every simulator case equal the corpus, and the evaluations equal the native + # `wai_stage_measure eval --json` byte for byte; every session the wasm32 build seals + # is the native tool's claim, commits to the golden output tree, and gets the same + # verdicts from the wasm32 verifier, `wai_claim_vectors verdicts` and claim_verify.py. + # It uses the package built above; a missing artifact fails the step. + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Install the Ed25519 library (claim_verify.py) + shell: bash + run: python -m pip install cryptography + - name: wasm32 staged measurement equals the native tool and the corpus + shell: bash + working-directory: wai/wai-web + run: bash demo/verify_measure.sh ./demo/pkg-node/wai_web.js - name: The browser menu is registered and names no candidate shell: bash working-directory: wai/wai-web diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 409d82ca6..9fa6925d7 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -6,6 +6,33 @@ wire format may change and such changes are recorded here. ## v0.4.0 — current +### Staged measurement and the session claim in the browser + +- **The measurement core, bound for JS** ([staged-measurement](extensions/staged-measurement.md)). + `wai-web` binds `wai::stage_measure` (`src/measure.rs`), the code `wai_stage_measure` + runs, compiled to wasm32: `evaluateTitle` gives the text `eval --json` prints for a + title (counted bytes, quality integers, first presentable bytes, the layering + overhead's points, deduplication, the output tree), `simulate` and `simulateModel` the + text `sim` prints, `countObject` one envelope's counted bytes or the code it is not + countable with, `qualityRgb8` one picture pair's integers, and `outputRoot` the output + tree's root. A title is read from a map of files; `titleMissing` names the next file it + needs, so a page fetches them one at a time. Sums of squares are decimal strings, as the + corpus writes them. +- **The session claim, sealed in the browser** ([jwp-receipts](extensions/jwp-receipts.md) + §2.4.12). The claim classes (`receipt_claims`) build for wasm32 with the measurement + core, and CI builds them so. `sessionBegin` records a session at its entry object + (`wai::session_recorder::SessionRecorder`): the decoder that decoded each envelope, each + presentation with its output's digest, each object received. `finish` seals the claim + with a key whose seed the page supplies, checked against the record first; a browser + session's `energy` is `null`. `verifyClaim` checks a claim against the presentations and + the objects as the claim-conformance runner does. +- **Proved byte for byte.** `demo/verify_measure.sh`, run in the wasm job, requires every + golden, refusal title, counted object, quality pair and simulator result of + `staged-measure-conformance/` from the wasm32 build, and the native `eval --json` of every + fixture to equal the wasm32 evaluation. A session recorded the way a page records one is + the native tool's claim byte for byte and commits to the golden output tree; the wasm32, + native and Python verifiers give the same verdict on it and on its altered variants. + ### Staged tracks over MoQ: a track per layer, a receipts track per track, delivery timeouts per hop, chains that recover - **Re-read against the drafts.** [moq-streaming-format](extensions/moq-streaming-format.md) diff --git a/wai/wai-web/Cargo.lock b/wai/wai-web/Cargo.lock index 382807f5b..a8765b7c3 100644 --- a/wai/wai-web/Cargo.lock +++ b/wai/wai-web/Cargo.lock @@ -394,6 +394,25 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -724,7 +743,9 @@ version = "0.3.0" dependencies = [ "blake3", "cbindgen", + "curve25519-dalek", "ed25519-dalek", + "num-bigint", "pkg-config", "serde", "serde_json", diff --git a/wai/wai-web/Cargo.toml b/wai/wai-web/Cargo.toml index bf63cadff..36759563b 100644 --- a/wai/wai-web/Cargo.toml +++ b/wai/wai-web/Cargo.toml @@ -19,7 +19,7 @@ js-sys = "0.3" # with the codec chain off. No second implementation: replay-equivalence # in the browser is the identical Rust that generated the conformance # corpus hashes. -wai = { path = "../wai-rs", default-features = false, features = ["world", "audio_scene", "haptic", "splat4d", "provenance", "score", "film", "neural_int", "generate", "video_int", "audio_int", "world_model", "world_int", "splat_int", "quantum", "quantum_ops", "quantum_cal", "quantum_mitigate", "quantum_qec", "quantum_control", "quantum_noise", "quantum_compile", "quantum_atom", "quantum_qbom", "quantum_receipt", "quantum_toolchain", "quantum_mps", "quantum_stabilizer", "quantum_pauli", "quantum_vml", "quantum_phasor", "quantum_qfhrr", "quantum_kernel", "quantum_phasor_meter", "quantum_qdata", "video_workflow", "staged"] } +wai = { path = "../wai-rs", default-features = false, features = ["world", "audio_scene", "haptic", "splat4d", "provenance", "score", "film", "neural_int", "generate", "video_int", "audio_int", "world_model", "world_int", "splat_int", "quantum", "quantum_ops", "quantum_cal", "quantum_mitigate", "quantum_qec", "quantum_control", "quantum_noise", "quantum_compile", "quantum_atom", "quantum_qbom", "quantum_receipt", "quantum_toolchain", "quantum_mps", "quantum_stabilizer", "quantum_pauli", "quantum_vml", "quantum_phasor", "quantum_qfhrr", "quantum_kernel", "quantum_phasor_meter", "quantum_qdata", "video_workflow", "staged", "stage_measure", "receipt_claims"] } ed25519-dalek = "2" # actor keys for browser-side op authoring (same version as wai-rs) blake3 = "1" # in-page receipt check: hash a decoded image against a pinned digest diff --git a/wai/wai-web/demo/README.md b/wai/wai-web/demo/README.md index f90dc1e47..14d4d3736 100644 --- a/wai/wai-web/demo/README.md +++ b/wai/wai-web/demo/README.md @@ -79,3 +79,39 @@ wasm-bindgen --target nodejs --out-dir demo/pkg-node --out-name wai_web \ target/wasm32-unknown-unknown/release/wai_web.wasm node demo/verify_staged_wasm.mjs ./pkg-node/wai_web.js ../staged-conformance ``` + +## Staged measurement — the native figures in the browser + +`src/measure.rs` binds `wai::stage_measure`, the code the native measurement tool +`wai_stage_measure` runs (`extensions/staged-measurement.md`), for JS. A title is read +from a `Map` of files by their path below `wai/`: `titleMissing(dir, files)` names the +next file it needs, so a page fetches files one at a time until it holds them all. +`evaluateTitle` (or `new MeasureTitle(dir, files).json()`) gives the text +`wai_stage_measure eval --json` prints: counted bytes per object, stage and prefix, +quality integers per presentation and per prefix, first presentable bytes, the layering +overhead's points, deduplication and the output tree. `simulate` and `simulateModel` +give the text `wai_stage_measure sim` prints. `countObject` counts one envelope (or +names the code it is not countable with), `qualityRgb8` gives one picture pair's +integers (sums of squares as decimal strings), and `outputRoot` the output tree's root +over presentations. + +`sessionBegin(entry, host, nonce)` is `wai::session_recorder::SessionRecorder` over the +session's entry object: `decoderFor` names the decoder that decoded an envelope, +`presented` and `received` record what the page did, and `finish(seed, signer_id, +issued_at)` seals the `reconstruct-session` claim (`extensions/jwp-receipts.md` +§2.4.12), checked against the record first; a browser session states no energy figure. +`verifyClaim(claim, outputs, objects)` checks a claim against the presentations and +the objects received, and gives `""` or the reason. + +`verify_measure.sh` builds the nodejs package (or takes one already built), runs +`verify_measure_wasm.mjs` over `staged-measure-conformance/` — every golden, refusal +title, counted object, quality pair and simulator case, byte for byte, and a session per +fixture recorded the way a page records one, which must be the native tool's claim byte +for byte — then requires the native `wai_stage_measure eval --json` to equal the wasm32 +evaluation of every fixture, and the native and independent Python claim verifiers to +give the wasm32 build's verdicts on every session it sealed: + +``` +# from wai-web/ (claim_verify.py needs the `cryptography` package) +bash demo/verify_measure.sh +``` diff --git a/wai/wai-web/demo/verify_measure.sh b/wai/wai-web/demo/verify_measure.sh new file mode 100755 index 000000000..b5d501e38 --- /dev/null +++ b/wai/wai-web/demo/verify_measure.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# The wasm32 measurement binding gives the native figures byte for byte, over the corpus +# wai/staged-measure-conformance/: +# +# 1. demo/verify_measure_wasm.mjs runs the wasm32 build under Node: every fixture's +# evaluation against goldens.json, the refusal titles, counting.json, quality.json, +# sim/results.json, the output tree, and the session claim the browser seals; +# 2. the native tool's `wai_stage_measure eval --json` for every fixture must equal the +# wasm32 evaluation byte for byte (cmp); +# 3. every session the wasm32 build sealed, and its altered variants, are verified by +# the native claim verifier (`wai_claim_vectors verdicts`) and by the independent +# Python verifier (`claim-conformance/claim_verify.py verdicts`), and each verdict list +# must equal the one the wasm32 build gave, line for line. +# +# from wai-web/: bash demo/verify_measure.sh [path/to/pkg-node/wai_web.js] +# +# With no argument the nodejs package is built here (cargo, then the wasm-bindgen CLI at +# the version Cargo.lock pins); with one, that package is used, as CI does after building +# it. The native binaries are built in debug under their own target directory, so a +# CARGO_TARGET_DIR shared with other feature sets is not disturbed. claim_verify.py needs +# the `cryptography` package. Any missing artifact fails the run. +set -euo pipefail +cd "$(dirname "$0")/.." # wai-web/ +WEB="$(pwd)" +WAI="$(cd .. && pwd)" +for tool in cargo node python3; do + command -v "$tool" >/dev/null || { echo "verify_measure: needs $tool"; exit 1; } +done +OUT="$(mktemp -d)" +trap 'rm -rf "$OUT"' EXIT + +PKG="${1:-}" +if [ -z "$PKG" ]; then + command -v wasm-bindgen >/dev/null || { echo "verify_measure: needs the wasm-bindgen CLI"; exit 1; } + # Build output is not discarded: a failed build must show why. + cargo build --locked --release --target wasm32-unknown-unknown + wasm-bindgen --target nodejs --out-dir demo/pkg-node --out-name wai_web \ + "${CARGO_TARGET_DIR:-target}/wasm32-unknown-unknown/release/wai_web.wasm" + PKG="$WEB/demo/pkg-node/wai_web.js" +fi +PKG="$(cd "$(dirname "$PKG")" && pwd)/$(basename "$PKG")" +[ -f "$PKG" ] || { echo "verify_measure: missing artifact $PKG"; exit 1; } + +echo "== 1. the wasm32 binding over the corpus" +node demo/verify_measure_wasm.mjs "$PKG" "$WAI/staged-measure-conformance" --out "$OUT" + +echo "== 2. the native evaluation equals the wasm32 evaluation, byte for byte" +NATIVE_TARGET="${CARGO_TARGET_DIR:-$WAI/wai-rs/target}/verify-measure-native" +( cd "$WAI/wai-rs" && cargo build --locked --no-default-features --features stage_measure,receipt_claims \ + --target-dir "$NATIVE_TARGET" --bin wai_stage_measure --bin wai_claim_vectors ) +BIN="$NATIVE_TARGET/debug" +for b in wai_stage_measure wai_claim_vectors; do + [ -x "$BIN/$b" ] || { echo "verify_measure: missing artifact $BIN/$b"; exit 1; } +done +n=0 +for dir in "$WAI"/staged-measure-conformance/fixtures/*/; do + name="$(basename "$dir")" + [ -f "$OUT/eval-$name.json" ] || { echo "verify_measure: no wasm32 evaluation of $name"; exit 1; } + "$BIN/wai_stage_measure" eval "$dir" --json > "$OUT/native-$name.json" + cmp "$OUT/native-$name.json" "$OUT/eval-$name.json" + echo " $name: identical ($(wc -c < "$OUT/native-$name.json" | tr -d ' ') bytes)" + n=$((n + 1)) +done +[ "$n" -ge 4 ] || { echo "verify_measure: only $n fixtures"; exit 1; } + +echo "== 3. the browser-sealed sessions, verified natively and independently" +[ -s "$OUT/sessions.json" ] && [ -s "$OUT/verdicts-wasm.txt" ] || { echo "verify_measure: no sessions written"; exit 1; } +"$BIN/wai_claim_vectors" verdicts "$OUT/sessions.json" > "$OUT/verdicts-native.txt" +diff "$OUT/verdicts-wasm.txt" "$OUT/verdicts-native.txt" +python3 "$WAI/claim-conformance/claim_verify.py" verdicts "$OUT/sessions.json" > "$OUT/verdicts-python.txt" +diff "$OUT/verdicts-wasm.txt" "$OUT/verdicts-python.txt" +echo " $(wc -l < "$OUT/verdicts-wasm.txt" | tr -d ' ') verdicts: wasm32, native and Python agree" +echo "verify_measure: OK" diff --git a/wai/wai-web/demo/verify_measure_wasm.mjs b/wai/wai-web/demo/verify_measure_wasm.mjs new file mode 100644 index 000000000..4fd0c3f58 --- /dev/null +++ b/wai/wai-web/demo/verify_measure_wasm.mjs @@ -0,0 +1,252 @@ +// The wasm32 measurement binding computes the native figures byte for byte, over the +// corpus wai/staged-measure-conformance/ (extensions/staged-measurement.md §12.3), which +// wai_stage_measure wrote and wai_stage_measure verify and measure_verify.py check: +// +// - goldens.json: every fixture, its files fetched one at a time as titleMissing names +// them (as a page fetches them), evaluated by evaluateTitle and by MeasureTitle, must +// print its block of goldens.json byte for byte. The block is printed here with +// JSON.stringify(_, null, 2); the run first requires that this printer reproduces +// goldens.json itself byte for byte, and that every number in it is an integer +// JavaScript holds exactly, so equal text is equal figures; +// - refusals/: every refusal title refused, by checkRefusal, with the code it states; +// and a fixture with a byte of a layer changed is refused by evaluateTitle; +// - counting.json: countObject gives every object's counted bytes, or the code it is +// not countable with and the WAI2 entry that refused; +// - quality.json: qualityRgb8 gives every picture pair's integers, each picture drawn +// from the formula the file states; +// - sim/results.json: every case of sim/cases.json simulated (simulate over a +// fixture, simulateModel over a model file) and the results document rebuilt from +// the wasm32 output must be sim/results.json byte for byte; +// - the output tree: outputRoot over each golden's presentations is its output_root; +// - the session claim: for every fixture, the session MeasureTitle.session records (the +// native tool's recorder) and the session recorded the way a page records one +// (sessionBegin at the entry object, decoderFor each envelope, presented, received), +// both sealed with one key, nonce and time, are the same claim byte for byte; it +// commits to the golden output_root and leaf_count, verifyClaim accepts it, and +// refuses it against an altered output (session_output_mismatch), with an object left +// out (session_source_not_received) and with an object miscounted +// (session_counted_mismatch). +// +// node verify_measure_wasm.mjs [path/to/wai_web.js] [path/to/staged-measure-conformance] [--out ] +// +// With --out, each fixture's evaluation is written to /eval-.json, and every +// session above to /sessions.json as a claim-conformance vector document with the +// verdict expected of each in /verdicts-wasm.txt (`nameverdict`), so that +// verify_measure.sh can compare them with the native tool and the other verifiers. +// +// Exit 0 iff every check passes. A missing package or corpus file fails the run. + +import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'; +import { createHash } from 'node:crypto'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const here = dirname(fileURLToPath(import.meta.url)); +const args = process.argv.slice(2); +let out = null; +const pos = []; +for (let i = 0; i < args.length; i++) { + if (args[i] === '--out') out = resolve(args[++i]); + else pos.push(args[i]); +} +const pkg = resolve(here, pos[0] ?? './pkg-node/wai_web.js'); +const corpus = resolve(pos[1] ?? resolve(here, '../../staged-measure-conformance')); +const waiDir = resolve(corpus, '..'); +for (const p of [pkg, join(corpus, 'goldens.json')]) { + if (!existsSync(p)) { console.log(`FAIL missing: ${p}`); process.exit(1); } +} +const wai = await import(pathToFileURL(pkg).href); +if (out) mkdirSync(out, { recursive: true }); + +let fails = 0; +let passes = 0; +const check = (ok, what) => { if (ok) passes++; else { fails++; console.log(`FAIL ${what}`); } }; +const text = (p) => readFileSync(p, 'utf8'); +const json = (p) => JSON.parse(text(p)); +const sha = (b) => createHash('sha256').update(b).digest('hex'); +const printed = (v) => JSON.stringify(v, null, 2) + '\n'; +const rel = (p) => p.slice(waiDir.length + 1); + +// Every number in a document is an integer JavaScript holds exactly. +const exact = (v) => { + if (typeof v === 'number') return Number.isSafeInteger(v); + if (Array.isArray(v)) return v.every(exact); + if (v && typeof v === 'object') return Object.values(v).every(exact); + return true; +}; + +// The files a title needs, fetched as titleMissing names them. +function fetchTitle(dir, patch) { + const files = new Map(); + for (let i = 0; i < 1000; i++) { + const p = wai.titleMissing(dir, files); + if (p === undefined) return files; + if (files.has(p)) throw new Error(`${p} named twice`); + let b = new Uint8Array(readFileSync(join(waiDir, p))); + if (patch) b = patch(p, b); + files.set(p, b); + } + throw new Error(`${dir}: the title names no end of files`); +} + +// ── goldens.json ────────────────────────────────────────────────────────────── +const goldensText = text(join(corpus, 'goldens.json')); +const goldens = JSON.parse(goldensText); +check(printed(goldens) === goldensText, 'JSON.stringify(_, null, 2) reproduces goldens.json byte for byte (the printer this run compares with)'); +check(exact(goldens), 'every number in goldens.json is an integer JavaScript holds exactly'); +const names = readdirSync(join(corpus, 'fixtures'), { withFileTypes: true }) + .filter((d) => d.isDirectory() && existsSync(join(corpus, 'fixtures', d.name, 'title.json'))).map((d) => d.name).sort(); +check(names.length >= 4 && names.length === goldens.fixtures.length, `the fixtures are the goldens' (${names.length})`); +const titles = new Map(); +names.forEach((name, i) => { + const dir = `${rel(corpus)}/fixtures/${name}`; + const golden = goldens.fixtures[i]; + check(golden && golden.title === name, `${name}: goldens.json lists it in this place`); + const files = fetchTitle(dir); + const got = wai.evaluateTitle(dir, files); + check(got === printed(golden), `${name}: evaluateTitle prints its goldens.json block byte for byte`); + const t = new wai.MeasureTitle(dir, files); + check(t.json() === got, `${name}: MeasureTitle gives evaluateTitle's text`); + titles.set(name, { dir, files, t, golden }); + if (out) writeFileSync(join(out, `eval-${name}.json`), got); + // Each object, counted on its own, is the evaluation's. + for (const o of golden.objects) { + const c = wai.countObject(files.get(o.file)); + check(JSON.stringify(c.counted) === JSON.stringify(o.counted) && c.framing === golden.framing, `${name}: countObject(${o.file}) is the golden's`); + } + // The output tree over the golden presentations. + const outputs = golden.presentations.map((p) => ({ unit: p.unit, layers: p.layers, decoder: p.decoder, out_digest: p.out_sha256 })); + check(wai.outputRoot(JSON.stringify(outputs)) === golden.output_root, `${name}: outputRoot over its presentations is its output_root`); + check(wai.sha256Hex(files.get(golden.objects[0].file)) === sha(files.get(golden.objects[0].file)), `${name}: sha256Hex`); +}); + +// A layer changed by one byte: the title is refused, never measured. +{ + const name = names.includes('still') ? 'still' : names[0]; + const dir = `${rel(corpus)}/fixtures/${name}`; + const target = goldens.fixtures[names.indexOf(name)].objects.find((o) => o.layer === 2)?.file; + const files = fetchTitle(dir, (p, b) => { + if (p !== target) return b; + const c = b.slice(); + c[c.length - 9] ^= 0x01; + return c; + }); + let threw = null; + try { wai.evaluateTitle(dir, files); } catch (e) { threw = String(e.message ?? e); } + check(target && threw !== null, `${name}: a layer-2 object changed by one byte is refused (${threw})`); +} + +// ── refusals/ ───────────────────────────────────────────────────────────────── +const refusals = readdirSync(join(corpus, 'refusals'), { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name).sort(); +check(refusals.length >= 5, `the refusal titles are present (${refusals.length})`); +for (const r of refusals) { + const dir = `${rel(corpus)}/refusals/${r}`; + const want = json(join(corpus, 'refusals', r, 'title.json')).refused; + let got; + try { got = wai.checkRefusal(dir, fetchTitle(dir)); } catch (e) { got = `error: ${e.message ?? e}`; } + check(got === want, `refusals/${r}: refused ${want} (got ${got})`); + let threw = false; + try { wai.evaluateTitle(dir, fetchTitle(dir)); } catch (e) { threw = String(e.message ?? e).startsWith(`refused ${want}`); } + check(threw, `refusals/${r}: evaluateTitle's error starts "refused ${want}"`); +} + +// ── counting.json ───────────────────────────────────────────────────────────── +const counting = json(join(corpus, 'counting.json')); +check(counting.cases.length >= 10, 'counting.json holds its cases'); +for (const k of counting.cases) { + const c = wai.countObject(new Uint8Array(readFileSync(join(waiDir, k.file)))); + check(JSON.stringify([c.counted, c.refused, c.component]) === JSON.stringify([k.counted, k.refused, k.component]), `counting: ${k.file} (${c.refused ?? 'counted'})`); +} + +// ── quality.json ────────────────────────────────────────────────────────────── +const quality = json(join(corpus, 'quality.json')); +const picture = (w, h, seed, mul) => { + const v = new Uint8Array(3 * w * h); + let i = 0; + for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) for (let c = 0; c < 3; c++) { + v[i++] = (x * mul + y * (mul + 3) + 29 * c + 17 * seed + 5 * ((x * y + seed) % 13)) % 256; + } + return v; +}; +check(quality.cases.length >= 6, 'quality.json holds its cases'); +for (const k of quality.cases) { + const q = wai.qualityRgb8(k.w, k.h, picture(k.w, k.h, ...k.reference), picture(k.w, k.h, ...k.test)); + const pick = (o) => JSON.stringify([o.n_samples, o.sse_rgb, o.sse_y, o.ssim_y_q32, o.windows]); + check(pick(q) === pick(k) && typeof q.sse_rgb === 'string', `quality: ${k.w}×${k.h} ${JSON.stringify(k.reference)} against ${JSON.stringify(k.test)}`); +} + +// ── sim/results.json ────────────────────────────────────────────────────────── +const resultsText = text(join(corpus, 'sim/results.json')); +const results = JSON.parse(resultsText); +check(printed(results) === resultsText && exact(results), 'sim/results.json is printed as this run prints it, its numbers exact'); +const cases = json(join(corpus, 'sim/cases.json')).cases; +const rebuilt = []; +for (const k of cases) { + const plan = text(join(corpus, 'sim', k.plan)); + const f = k.model.startsWith('fixture:') ? k.model.slice('fixture:'.length) : null; + let s; + if (f) { + const t = titles.get(f); + s = JSON.parse(wai.simulate(t.dir, t.files, plan)); + check(t.t.simulate(plan) === wai.simulate(t.dir, t.files, plan), `sim ${k.name}: MeasureTitle.simulate gives simulate's text`); + } else { + s = JSON.parse(wai.simulateModel(text(join(corpus, 'sim', k.model)), plan)); + } + check(s.label === 'simulated', `sim ${k.name}: labelled simulated`); + rebuilt.push({ name: k.name, stall_bound_us: s.stall_bound_us, max_stall_us: s.max_stall_us, result: s.result }); +} +check(printed({ ...results, results: rebuilt }) === resultsText, `sim/results.json rebuilt from the wasm32 simulator byte for byte (${rebuilt.length} cases)`); + +// ── the session claim ───────────────────────────────────────────────────────── +const HOST = JSON.stringify({ profile: 'browser-baseline', target: 'wasm32-unknown-unknown', threads: 1 }); +const SEED = '44'.repeat(32); +const NONCE = '07'.repeat(32); +const T = '2026-10-06T12:00:00Z'; +const vectors = []; +const expected = []; +const flip = (h) => (h[0] === '0' ? '1' : '0') + h.slice(1); +for (const [name, { files, t, golden }] of titles) { + const native = t.session(HOST, NONCE).finish(SEED, undefined, T); + // The page's recording. + const envelopeOf = new Map(golden.objects.map((o) => [o.object, files.get(o.file)])); + const entry = files.get(golden.objects[0].file); + const h = wai.sessionBegin(entry, HOST, NONCE, undefined); + for (const p of golden.presentations) { + const d = golden.decoders[p.decoder]; + const handle = h.decoderFor(envelopeOf.get(d.object), d.capability, d.pin !== null); + h.presented(p.unit, p.layers, handle, p.out_sha256, undefined); + } + for (const o of golden.objects) h.received(files.get(o.file), true); + const page = h.finish(SEED, undefined, T); + let again = null; + try { h.finish(SEED, undefined, T); } catch (e) { again = String(e.message ?? e); } + check(again !== null, `${name}: a session seals once`); + check(page.claim === native.claim && page.link_hash === native.link_hash, `${name}: the page's recording seals the native tool's claim byte for byte`); + const body = JSON.parse(page.claim).body; + check(body.output_root === golden.output_root && body.leaf_count === golden.leaf_count, `${name}: the session commits to the golden output tree`); + check(body.counted_primary === golden.objects.reduce((a, o) => a + o.counted.total, 0) && body.energy === null, `${name}: counted bytes summed, no energy figure`); + const o = JSON.stringify(page.outputs), j = JSON.stringify(page.objects); + check(wai.outputRoot(o) === golden.output_root, `${name}: outputRoot over the session's outputs`); + check(wai.verifyClaim(page.claim, o, j) === '', `${name}: verifyClaim accepts the session`); + const altered = page.outputs.map((p, i) => (i === 0 ? { ...p, out_digest: flip(p.out_digest) } : p)); + const fewer = page.objects.slice(0, -1); + const miscounted = page.objects.map((x, i) => (i === 0 ? { ...x, counted: x.counted + 1 } : x)); + const variants = [ + [`${name}/accept`, page.outputs, page.objects, `accept link_hash=${page.link_hash}`, ''], + [`${name}/output-altered`, altered, page.objects, 'reject step=6 reason=session_output_mismatch', 'session_output_mismatch'], + [`${name}/object-left-out`, page.outputs, fewer, 'reject step=6 reason=session_source_not_received', 'session_source_not_received'], + [`${name}/object-miscounted`, page.outputs, miscounted, 'reject step=6 reason=session_counted_mismatch', 'session_counted_mismatch'], + ]; + for (const [vname, outputs, objects, verdict, reason] of variants) { + check(wai.verifyClaim(page.claim, JSON.stringify(outputs), JSON.stringify(objects)) === reason, `${vname}: verifyClaim gives "${reason}"`); + vectors.push({ name: vname, procedure: 'claim', receipt: page.claim, context: { outputs, objects } }); + expected.push(`${vname}\t${verdict}`); + } +} +if (out) { + writeFileSync(join(out, 'sessions.json'), printed({ about: 'Sessions sealed by the wasm32 binding over the staged-measure corpus (verify_measure_wasm.mjs).', vectors })); + writeFileSync(join(out, 'verdicts-wasm.txt'), expected.join('\n') + '\n'); +} + +console.log(`${passes} checks passed, ${fails} failed: ${names.length} fixtures, ${refusals.length} refusal titles, ${counting.cases.length} counted objects, ${quality.cases.length} picture pairs, ${cases.length} simulator cases, ${vectors.length} session verdicts`); +process.exit(fails === 0 ? 0 : 1); diff --git a/wai/wai-web/src/lib.rs b/wai/wai-web/src/lib.rs index 2ed3e5e9c..48711a466 100644 --- a/wai/wai-web/src/lib.rs +++ b/wai/wai-web/src/lib.rs @@ -158,6 +158,13 @@ pub mod quantum_qbom; // and stage hash read back, and a layer's declared cost read before it is offered. pub mod stage; +// Staged-delivery measurement (extensions/staged-measurement.md): wai::stage_measure, the +// code the native measurement tool runs, bound for JS — a title's counted bytes, quality +// integers, first presentable bytes, layering overhead, deduplication and output tree, the +// delivery simulator, and the reconstruct-session claim a browser sink seals over what it +// presented (jwp-receipts §2.4.12), with its verifier. +pub mod measure; + // ---- Capability menu ---- // The capabilities this browser sink advertises: a subset of the registry diff --git a/wai/wai-web/src/measure.rs b/wai/wai-web/src/measure.rs new file mode 100644 index 000000000..08af56d77 --- /dev/null +++ b/wai/wai-web/src/measure.rs @@ -0,0 +1,720 @@ +//! Staged-delivery measurement in the browser (`extensions/staged-measurement.md`), and +//! the session claim a browser sink seals over what it presented (`extensions/jwp-receipts.md` +//! §2.4.12). +//! +//! Every figure here is `wai::stage_measure`'s, the code the native tool +//! `wai_stage_measure` runs, compiled to wasm32: a title's counted bytes, quality +//! integers, first presentable bytes, layering overhead, deduplication and output tree +//! (`evaluateTitle`, the text `wai_stage_measure eval --json` prints), the delivery +//! simulator (`simulate`, the text `wai_stage_measure sim` prints), one object's counted +//! bytes (`countObject`), one picture pair's quality integers (`qualityRgb8`), and an +//! output tree's root (`outputRoot`); an output's digest is the crate's `sha256Hex`. +//! Nothing is a second implementation, so the browser computes the native figures byte +//! for byte; `demo/verify_measure_wasm.mjs` proves it over the corpus +//! `staged-measure-conformance/`. +//! +//! A title is read from a map of files (path below `wai/` → bytes) and needs no file +//! system: `titleMissing` names the next file the title needs and does not hold, so a +//! page fetches it and asks again. +//! +//! [`SessionHandle`] is `wai::session_recorder::SessionRecorder`: a page tells it the +//! decoders it used, the objects it received and every presentation with its output's +//! digest, and `finish` seals the `reconstruct-session` claim with a key whose seed the +//! page supplies, checked against what it recorded before it is returned. The decode is +//! never metered here, so a browser session's `energy` is `null`. `verifyClaim` runs the +//! conformance runner of `claim-conformance/` on the claim with the presentations and the +//! objects (§3.1, step 6 included). +//! +//! Integers that can pass 2^53 − 1 (the sums of squares) are decimal strings, as the +//! corpus writes them; every other figure is a number. +//! +//! The pure-Rust half is what the native tests run; the `#[wasm_bindgen]` wrappers only +//! convert. + +use std::collections::BTreeMap; + +use serde_json::{json, Value}; +use wai::claim_receipt::{ObjectSeen, SessionHost, SessionPath}; +use wai::codecs::DeclaredTier; +use wai::container::Wai; +use wai::measure_framing::{count_object as count_framed, FramingError}; +use wai::output_tree::{commit, Presentation}; +use wai::session_recorder::{DecoderKey, RecordedSession, SessionRecorder}; +use wai::stage_measure::run::{self, Evaluation, QualityKind}; +use wai::stage_measure::sim::{self, Model, Plan}; +use wai::stage_measure::title::Title; +use wai::stage_measure::MeasureError; +use wasm_bindgen::prelude::*; + +/// Files by their path below `wai/`. +pub(crate) type Files = BTreeMap>; + +fn hex(b: &[u8]) -> String { + b.iter().map(|x| format!("{x:02x}")).collect() +} + +fn unhex(s: &str, n: usize, what: &str) -> Result, String> { + let b = s.as_bytes(); + if b.len() != 2 * n || !b.iter().all(|c| c.is_ascii_digit() || (b'a'..=b'f').contains(c)) { + return Err(format!("{what}: {n} bytes as lowercase hexadecimal")); + } + (0..n).map(|i| u8::from_str_radix(&s[2 * i..2 * i + 2], 16).map_err(|e| e.to_string())).collect() +} + +fn unhex32(s: &str, what: &str) -> Result<[u8; 32], String> { + Ok(unhex(s, 32, what)?.try_into().expect("32 bytes")) +} + +// ───────────────────────── the pure-Rust half ───────────────────────── + +/// A JSON value as the native tools print it: pretty, then a newline. +pub(crate) fn printed(v: &Value) -> String { + let mut s = serde_json::to_string_pretty(v).expect("a JSON value prints"); + s.push('\n'); + s +} + +/// The next file the title in `dir` needs and `files` does not hold, or `None` when it +/// holds every one. A title that reads as invalid before a file is missing is an error. +pub(crate) fn title_missing(dir: &str, files: &Files) -> Result, String> { + match Title::from_files(dir, files) { + Ok(_) => Ok(None), + Err(MeasureError::Missing(p)) => Ok(Some(p)), + Err(e) => Err(e.to_string()), + } +} + +/// A title, evaluated under the tools' stated limits and checked against the fixture +/// tool's own reconstruction (`expect.json`), as `wai_stage_measure eval` evaluates one. +pub(crate) struct Measured { + pub t: Title, + pub e: Evaluation, +} + +/// A refusal's message, starting with its code: `refused : : `. +fn measure_err(e: MeasureError) -> String { + match e { + MeasureError::Refused { at, code, detail } => format!("refused {code}: {at}: {detail}"), + other => other.to_string(), + } +} + +pub(crate) fn measured(dir: &str, files: &Files) -> Result { + let t = Title::from_files(dir, files).map_err(measure_err)?; + let e = run::evaluate(&t).map_err(measure_err)?; + run::check_expect(&t, &e).map_err(measure_err)?; + Ok(Measured { t, e }) +} + +/// A title that exists to be refused (its `refused`): the code it was refused with, which +/// is the code it states; anything else is an error. +pub(crate) fn refusal(dir: &str, files: &Files) -> Result { + let t = Title::from_files(dir, files).map_err(measure_err)?; + run::check_refusal(&t).map_err(measure_err)?; + Ok(t.refused.clone().unwrap_or_default()) +} + +/// One simulation, as `wai_stage_measure sim` prints it: the plan, its stall bound, the +/// largest stall and the result, labelled simulated. +pub(crate) fn simulated(model: &Model, plan_json: &str) -> Result { + let v: Value = serde_json::from_str(plan_json).map_err(|e| format!("plan: {e}"))?; + let p = Plan::from_json(&v).map_err(|e| e.to_string())?; + let r = sim::simulate(model, &p).map_err(|e| e.to_string())?; + Ok(printed(&json!({"label": "simulated", "plan": p.to_json(), "stall_bound_us": sim::stall_bound(&p), "max_stall_us": r.max_stall(), "result": r.to_json()}))) +} + +/// A `wai-sim-model/1` model from its JSON. +pub(crate) fn model_of(model_json: &str) -> Result { + let v: Value = serde_json::from_str(model_json).map_err(|e| format!("model: {e}"))?; + Model::from_json(&v).map_err(|e| e.to_string()) +} + +/// One object's counted bytes (§3), in the corpus's form (`counting.json`): the split and +/// its framing, or the code it is not countable with and the `WAI2` entry that refused. +pub(crate) fn count_value(envelope: &[u8]) -> Value { + match count_framed(envelope) { + Ok(k) => json!({ + "counted": {"header": k.header, "manifest": k.manifest, "payload": k.payload, "total": k.total}, + "framing": k.framing, "refused": null, "component": null, "detail": null, + }), + Err(e) => json!({ + "counted": null, "framing": null, "refused": e.code(), + "component": match &e { FramingError::NotCountable { component, .. } => json!(component), _ => Value::Null }, + "detail": e.to_string(), + }), + } +} + +/// §4.2's integers for one picture pair, as a record writes them. +pub(crate) fn quality_rgb8_value(w: u32, h: u32, reference: &[u8], test: &[u8]) -> Result { + let (w, h) = (w as usize, h as usize); + let q = wai::quality::image(wai::quality::Rgb8 { w, h, px: reference }, wai::quality::Rgb8 { w, h, px: test }).map_err(|e| e.to_string())?; + Ok(QualityKind::Rgb8(q).to_json()) +} + +/// The presentations of a claim-conformance `outputs` context: `{unit, layers, decoder, +/// out_digest}`. +pub(crate) fn presentations_of(v: &Value) -> Result, String> { + v.as_array() + .ok_or("outputs: an array")? + .iter() + .map(|p| { + let n = |k: &str| p.get(k).and_then(Value::as_u64).ok_or(format!("outputs: `{k}` is not an integer")); + Ok(Presentation { + unit: n("unit")?, + layers: u16::try_from(n("layers")?).map_err(|_| "outputs: layers past 65535")?, + decoder: u16::try_from(n("decoder")?).map_err(|_| "outputs: decoder past 65535")?, + out_digest: unhex32(p.get("out_digest").and_then(Value::as_str).unwrap_or(""), "outputs: out_digest")?, + }) + }) + .collect() +} + +/// The output tree's root (staged-measurement Appendix C) over presentations in the +/// `outputs` form, or `None` for none. +pub(crate) fn output_root_of(outputs_json: &str) -> Result, String> { + let v: Value = serde_json::from_str(outputs_json).map_err(|e| format!("outputs: {e}"))?; + Ok(commit(&presentations_of(&v)?).map_err(|e| e.to_string())?.map(|c| hex(&c.root))) +} + +/// The decoder host from its JSON, `{profile, target, threads}`: `threads` is the number +/// of decode workers, written as §2.4.12 writes it (the largest power of two not above +/// it); the build is this build's. +pub(crate) fn host_of(host_json: &str) -> Result { + let v: Value = serde_json::from_str(host_json).map_err(|e| format!("host: {e}"))?; + let o = v.as_object().ok_or("host: an object")?; + for k in o.keys() { + if !["profile", "target", "threads"].contains(&k.as_str()) { + return Err(format!("host: no member {k}")); + } + } + Ok(SessionHost { + profile: v["profile"].as_str().ok_or("host: profile is a string")?.to_owned(), + target: match &v["target"] { + Value::Null => None, + t => Some(t.as_str().ok_or("host: target is a string or null")?.to_owned()), + }, + build: wai::energy_report::BuildRecord::of_this_build(), + threads: SessionHost::rounded_threads(v["threads"].as_u64().ok_or("host: threads is an integer")?), + }) +} + +/// The decoder entry key for decoding `envelope` here: through `via` (its manifest's +/// capability where absent), on the primary path, with this build's decoders; `pinned` +/// when its decode verified the parameter set its manifest pins, whose SHA-256 is then +/// the entry's `pin` and whose declared tier (SPEC §3.1: an unregistered token, or none, +/// reads as `none`) its `tier`. +pub(crate) fn decoder_key(envelope: &[u8], via: Option<&str>, pinned: bool) -> Result { + let w = Wai::from_bytes(envelope).map_err(|e| e.to_string())?; + let (pin, tier) = if pinned { + let p = w.prior().ok_or("pinned, but the envelope pins no parameter set")?; + let tier = p.tier().and_then(DeclaredTier::from_token).unwrap_or(DeclaredTier::None).token().to_owned(); + (Some(unhex32(&p.sha256, "the pin's sha256")?), Some(tier)) + } else { + (None, None) + }; + Ok(DecoderKey { + capability: via.unwrap_or(w.capability()).to_owned(), + rendition: None, + object: wai::jwp_hash::content_hash(envelope), + path: SessionPath::Primary, + decoder: wai::stage_measure::session::builtin_decoder(), + variant: None, + pin, + tier, + module_status: None, + }) +} + +/// An object received whole on the primary path: its content hash, its counted bytes +/// (`None` where it is not countable) and its length as transferred. +pub(crate) fn object_seen(envelope: &[u8], presented: bool) -> ObjectSeen { + ObjectSeen { + content_hash: wai::jwp_hash::content_hash(envelope), + path: SessionPath::Primary, + counted: count_framed(envelope).ok().map(|c| c.total), + transferred: envelope.len() as u64, + presented, + } +} + +/// A sealed session as a page reads it: the claim's wire form (JCS), its link hash, and +/// what a verifier checks it against at step 6 in the claim-conformance context form. +pub(crate) fn recorded_value(s: &RecordedSession) -> Value { + json!({ + "claim": s.claim.to_json(), + "link_hash": hex(&s.claim.link_hash()), + "outputs": s.presentations.iter().map(|p| json!({"unit": p.unit, "layers": p.layers, "decoder": p.decoder, "out_digest": hex(&p.out_digest)})).collect::>(), + "objects": s.objects.iter().map(|o| json!({ + "content_hash": hex(&o.content_hash), "path": o.path.label(), "counted": o.counted, + "transferred": o.transferred, "presented": o.presented, + })).collect::>(), + }) +} + +/// Seal a recorder's session: `subject` its entry object's content hash, the key from a +/// 32-byte seed, `signer_id` the key's `did:key` where none is given. +pub(crate) fn finish(r: SessionRecorder, subject: [u8; 32], seed_hex: &str, signer_id: Option<&str>, issued_at: &str) -> Result { + let key = ed25519_dalek::SigningKey::from_bytes(&unhex32(seed_hex, "seed")?); + let id = match signer_id { + Some(s) if !s.is_empty() => s.to_owned(), + _ => wai::signer_id::did_key(&key.verifying_key().to_bytes()), + }; + let s = r.finish(subject, &key, &id, 0, None, issued_at).map_err(|e| format!("the session is refused: {e}"))?; + Ok(recorded_value(&s)) +} + +/// A `reconstruct-session` claim checked as the claim-conformance runner checks one +/// (`wai::claim_receipt::corpus_verdicts`): §3.1 steps 1–4, then step 6 against the +/// presentations and the objects. `""` when accepted, otherwise the reason. +pub(crate) fn verify_session(claim: &str, outputs_json: &str, objects_json: &str) -> Result { + let outputs: Value = serde_json::from_str(outputs_json).map_err(|e| format!("outputs: {e}"))?; + let objects: Value = serde_json::from_str(objects_json).map_err(|e| format!("objects: {e}"))?; + let doc = json!({"vectors": [{"name": "session", "procedure": "claim", "receipt": claim, "context": {"outputs": outputs, "objects": objects}}]}); + let vs = wai::claim_receipt::corpus_verdicts(&doc.to_string())?; + let verdict = vs.first().map(|(_, v)| v.as_str()).unwrap_or("error"); + if verdict.starts_with("accept") { + return Ok(String::new()); + } + match verdict.split_once(" reason=") { + Some((_, reason)) if verdict.starts_with("reject ") => Ok(reason.to_owned()), + _ => Err("the claim or its context could not be read".into()), + } +} + +// ───────────────────────── the JS surface ───────────────────────── + +fn js_err(e: impl std::fmt::Display) -> JsError { + JsError::new(&e.to_string()) +} + +fn to_js(v: &Value) -> Result { + use serde::Serialize; + v.serialize(&serde_wasm_bindgen::Serializer::json_compatible()).map_err(js_err) +} + +/// A JS `Map` of path → `Uint8Array`. +fn files_of(m: &js_sys::Map) -> Result { + let mut out = Files::new(); + for entry in m.entries() { + let pair = js_sys::Array::from(&entry.map_err(|_| JsError::new("files: unreadable entry"))?); + let path = pair.get(0).as_string().ok_or_else(|| JsError::new("files: a path is a string"))?; + let bytes = pair.get(1).dyn_into::().map_err(|_| JsError::new("files: a file's bytes are a Uint8Array"))?.to_vec(); + out.insert(path, bytes); + } + Ok(out) +} + +/// A count from JS: a non-negative integer no larger than 2^53 − 1. +fn int(v: f64, what: &str) -> Result { + if !(0.0..=9_007_199_254_740_991.0).contains(&v) || v.fract() != 0.0 { + return Err(JsError::new(&format!("{what}: a non-negative integer"))); + } + Ok(v as u64) +} + +/// The next file the title in `dir` (below `wai/`) needs and `files` does not hold, or +/// `undefined` once it holds every one. +#[wasm_bindgen(js_name = titleMissing)] +pub fn js_title_missing(dir: &str, files: &js_sys::Map) -> Result, JsError> { + title_missing(dir, &files_of(files)?).map_err(js_err) +} + +/// A title's deterministic figures: the text `wai_stage_measure eval --json` prints for +/// it, which is its block of the corpus's `goldens.json`. A refusal's message starts +/// `refused `. +#[wasm_bindgen(js_name = evaluateTitle)] +pub fn evaluate_title(dir: &str, files: &js_sys::Map) -> Result { + Ok(printed(&measured(dir, &files_of(files)?).map_err(js_err)?.e.to_json())) +} + +/// A title that exists to be refused: the code it was refused with, which is the one it +/// states (`refused`). A title evaluated, or refused with another code, is an error. +#[wasm_bindgen(js_name = checkRefusal)] +pub fn check_refusal(dir: &str, files: &js_sys::Map) -> Result { + refusal(dir, &files_of(files)?).map_err(js_err) +} + +/// Simulate a `wai-sim/1` plan over a title's objects and counted bytes: the text +/// `wai_stage_measure sim ` prints. +#[wasm_bindgen] +pub fn simulate(dir: &str, files: &js_sys::Map, plan_json: &str) -> Result { + let m = measured(dir, &files_of(files)?).map_err(js_err)?; + simulated(&Model::from_evaluation(&m.e), plan_json).map_err(js_err) +} + +/// Simulate a plan over a `wai-sim-model/1` model: the text `wai_stage_measure sim +/// ` prints. +#[wasm_bindgen(js_name = simulateModel)] +pub fn simulate_model(model_json: &str, plan_json: &str) -> Result { + simulated(&model_of(model_json).map_err(js_err)?, plan_json).map_err(js_err) +} + +/// One object's counted bytes (§3): `{counted: {header, manifest, payload, total}, +/// framing}` or, where it is not countable, `{counted: null, refused: , component, +/// detail}`. +#[wasm_bindgen(js_name = countObject)] +pub fn count_object(envelope: &[u8]) -> Result { + to_js(&count_value(envelope)) +} + +/// §4.2's integers for two RGB8 pictures of `w × h`: `{kind, n_samples, sse_rgb, sse_y, +/// ssim_y_q32, windows}`, the sums of squares as decimal strings. +#[wasm_bindgen(js_name = qualityRgb8)] +pub fn quality_rgb8(w: u32, h: u32, reference: &[u8], test: &[u8]) -> Result { + to_js(&quality_rgb8_value(w, h, reference, test).map_err(js_err)?) +} + +/// The output tree's root over presentations given as a JSON array of `{unit, layers, +/// decoder, out_digest}`, or `undefined` for none. A (unit, layers) given twice is an +/// error. +#[wasm_bindgen(js_name = outputRoot)] +pub fn output_root(outputs_json: &str) -> Result, JsError> { + output_root_of(outputs_json).map_err(js_err) +} + +/// A title evaluated once, for a page that reads several things of it. +#[wasm_bindgen] +pub struct MeasureTitle { + m: Measured, +} + +#[wasm_bindgen] +impl MeasureTitle { + /// The title in `dir` from `files`, evaluated and checked against its expectation. + #[wasm_bindgen(constructor)] + pub fn new(dir: &str, files: &js_sys::Map) -> Result { + Ok(MeasureTitle { m: measured(dir, &files_of(files)?).map_err(js_err)? }) + } + + /// The text `evaluateTitle` gives. + pub fn json(&self) -> String { + printed(&self.m.e.to_json()) + } + + /// The simulator's model of the title: `wai-sim-model/1`. + pub fn model(&self) -> String { + printed(&Model::from_evaluation(&self.m.e).to_json()) + } + + /// The text `simulate` gives. + pub fn simulate(&self, plan_json: &str) -> Result { + simulated(&Model::from_evaluation(&self.m.e), plan_json).map_err(js_err) + } + + /// The session the native tool records over the title (`stage_measure::session::recorder_of`): + /// every base, then every layer, decoded on the primary path with no deadline, every + /// object received whole and presented. `host_json` as `sessionBegin` reads it. + pub fn session(&self, host_json: &str, nonce_hex: &str) -> Result { + let host = host_of(host_json).map_err(js_err)?; + let nonce = unhex32(nonce_hex, "session_nonce").map_err(js_err)?; + let (r, subject) = wai::stage_measure::session::recorder_of(&self.m.t, &self.m.e, host, nonce).map_err(js_err)?; + Ok(SessionHandle { r: Some(r), subject }) + } +} + +/// One session at this sink, recorded as it happens and sealed as a `reconstruct-session` +/// claim (`wai::session_recorder::SessionRecorder`). +#[wasm_bindgen] +pub struct SessionHandle { + r: Option, + /// The entry object's content hash: the claim's subject. + subject: [u8; 32], +} + +/// A session's recorder over its entry object `entry` (the first envelope the sink +/// dispatches), whose manifest `media` the claim states and whose content hash is its +/// subject. +pub(crate) fn begin(entry: &[u8], host: SessionHost, nonce: [u8; 32], deadline_us: Option) -> Result<(SessionRecorder, [u8; 32]), String> { + let w = Wai::from_bytes(entry).map_err(|e| format!("the entry object: {e}"))?; + Ok((SessionRecorder::new(nonce, w.media(), host, deadline_us), wai::jwp_hash::content_hash(entry))) +} + +/// Begin a session at its entry object `entry`, the first envelope the sink dispatches: +/// the claim states its manifest's `media` and names it as the subject. `host_json` is the +/// decoder host, `{profile, target, threads}` (`profile` one of jwp-receipts §2.4.12's, +/// `target` a term or `null`, `threads` the decode workers); `nonce_hex` 32 fresh random +/// bytes derived from nothing that identifies a person, a device or an account; +/// `deadline_us` a per-unit deadline, or `undefined` for none. +#[wasm_bindgen(js_name = sessionBegin)] +pub fn session_begin(entry: &[u8], host_json: &str, nonce_hex: &str, deadline_us: Option) -> Result { + let host = host_of(host_json).map_err(js_err)?; + let nonce = unhex32(nonce_hex, "session_nonce").map_err(js_err)?; + let deadline = deadline_us.map(|d| int(d, "deadline_us")).transpose()?; + let (r, subject) = begin(entry, host, nonce, deadline).map_err(js_err)?; + Ok(SessionHandle { r: Some(r), subject }) +} + +#[wasm_bindgen] +impl SessionHandle { + fn rec(&mut self) -> Result<&mut SessionRecorder, JsError> { + self.r.as_mut().ok_or_else(|| JsError::new("the session is finished")) + } + + /// The handle of the decoder that decoded `envelope` here, through `via` (its + /// manifest's capability where absent); `pinned` when the decode verified the + /// parameter set the manifest pins. The same decoder on the same object gives the same + /// handle. + #[wasm_bindgen(js_name = decoderFor)] + pub fn decoder_for(&mut self, envelope: &[u8], via: Option, pinned: bool) -> Result { + let k = decoder_key(envelope, via.as_deref(), pinned).map_err(js_err)?; + Ok(self.rec()?.decoder(k) as u32) + } + + /// An object received whole on the primary path; `presented` when any of its outputs + /// was presented. + pub fn received(&mut self, envelope: &[u8], presented: bool) -> Result<(), JsError> { + let o = object_seen(envelope, presented); + self.rec()?.received(o); + Ok(()) + } + + /// A presentation: `unit` at `layers` (1 for the base alone), through the decoder + /// `decoder` names, the SHA-256 of its output's canonical buffer, and how late it was + /// where it missed the session's deadline. + pub fn presented(&mut self, unit: f64, layers: u32, decoder: u32, out_digest_hex: &str, late_us: Option) -> Result<(), JsError> { + let unit = int(unit, "unit")?; + let layers = u16::try_from(layers).map_err(|_| JsError::new("layers: past 65535"))?; + let digest = unhex32(out_digest_hex, "out_digest").map_err(js_err)?; + let late = late_us.map(|l| int(l, "late_us")).transpose()?; + self.rec()?.presented(unit, layers, decoder as usize, digest, late).map_err(js_err) + } + + /// Seal the session, about its entry object: the key from the 32-byte `seed_hex`; + /// `signer_id` the key's `did:key` where absent; `issued_at` an RFC 3339 time. Gives + /// `{claim, link_hash, outputs, objects}`: the claim's wire form (JCS) and what + /// `verifyClaim` checks it against. The recorder checks the claim against what it + /// recorded first, and refuses one a verifier would refuse. A handle seals once. + pub fn finish(&mut self, seed_hex: &str, signer_id: Option, issued_at: &str) -> Result { + let r = self.r.take().ok_or_else(|| JsError::new("the session is finished"))?; + to_js(&finish(r, self.subject, seed_hex, signer_id.as_deref(), issued_at).map_err(js_err)?) + } +} + +/// Check a `reconstruct-session` claim (its wire form) against the presentations +/// (`outputs`, `[{unit, layers, decoder, out_digest}]`) and the objects received +/// (`[{content_hash, path, counted, transferred, presented}]`): the signature and the +/// class's rules, the output tree, the consistency of the members the presentations +/// give, and the byte sums. `""` when accepted, otherwise the reason (jwp-receipts §3.1). +#[wasm_bindgen(js_name = verifyClaim)] +pub fn verify_claim(claim: &str, outputs_json: &str, objects_json: &str) -> Result { + verify_session(claim, outputs_json, objects_json).map_err(js_err) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn wai_dir() -> std::path::PathBuf { + std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("..") + } + + fn corpus() -> std::path::PathBuf { + wai_dir().join("staged-measure-conformance") + } + + fn read_json(p: &std::path::Path) -> Value { + serde_json::from_slice(&std::fs::read(p).unwrap_or_else(|e| panic!("{}: {e}", p.display()))).unwrap() + } + + /// The files a title needs, fetched one at a time as `titleMissing` names them, the + /// way a page fetches them. + fn fetch(dir: &str) -> Files { + let mut files = Files::new(); + while let Some(p) = title_missing(dir, &files).unwrap_or_else(|e| panic!("{dir}: {e}")) { + let b = std::fs::read(wai_dir().join(&p)).unwrap_or_else(|e| panic!("{p}: {e}")); + assert!(files.insert(p.clone(), b).is_none(), "{p} named twice"); + } + files + } + + fn fixture_names() -> Vec { + let mut names: Vec = std::fs::read_dir(corpus().join("fixtures")) + .unwrap() + .flatten() + .filter(|d| d.path().join("title.json").is_file()) + .map(|d| d.file_name().to_string_lossy().into_owned()) + .collect(); + names.sort(); + names + } + + /// Every fixture, its files fetched as `titleMissing` names them and evaluated + /// through the binding, prints its block of `goldens.json` byte for byte (the golden + /// block printed as the native tool prints `eval --json`); the goldens list the + /// fixtures in this order. + #[test] + fn every_fixture_evaluates_to_its_golden() { + let goldens = read_json(&corpus().join("goldens.json")); + let blocks = goldens["fixtures"].as_array().unwrap(); + let names = fixture_names(); + assert!(names.len() >= 4, "the corpus is present"); + assert_eq!(blocks.len(), names.len()); + for (name, block) in names.iter().zip(blocks) { + let dir = format!("staged-measure-conformance/fixtures/{name}"); + let m = measured(&dir, &fetch(&dir)).unwrap_or_else(|e| panic!("{name}: {e}")); + assert_eq!(printed(&m.e.to_json()), printed(block), "{name}: the evaluation is the golden"); + } + } + + /// Every refusal title is refused with the code it states. + #[test] + fn every_refusal_title_is_refused_with_its_code() { + let mut n = 0; + for d in std::fs::read_dir(corpus().join("refusals")).unwrap().flatten() { + let name = d.file_name().to_string_lossy().into_owned(); + let dir = format!("staged-measure-conformance/refusals/{name}"); + let want = read_json(&d.path().join("title.json"))["refused"].as_str().unwrap().to_owned(); + assert_eq!(refusal(&dir, &fetch(&dir)).unwrap_or_else(|e| panic!("{name}: {e}")), want, "{name}"); + let why = measured(&dir, &fetch(&dir)).err().unwrap_or_else(|| panic!("{name}: evaluated")); + assert!(why.starts_with(&format!("refused {want}: ")), "{name}: evaluateTitle's error names the code first: {why}"); + n += 1; + } + assert!(n >= 5, "the refusal titles are present"); + } + + /// `counting.json`, every object's counted bytes or the code it is not countable with. + #[test] + fn the_counting_cases_count_as_the_corpus_states() { + let c = read_json(&corpus().join("counting.json")); + let cases = c["cases"].as_array().unwrap(); + assert!(cases.len() >= 10); + for k in cases { + let file = k["file"].as_str().unwrap(); + let got = count_value(&std::fs::read(wai_dir().join(file)).unwrap()); + assert_eq!((&got["counted"], &got["refused"], &got["component"]), (&k["counted"], &k["refused"], &k["component"]), "{file}"); + } + } + + /// `quality.json`'s picture pairs, drawn from its stated formula, give its integers. + #[test] + fn the_quality_cases_give_the_corpus_integers() { + let q = read_json(&corpus().join("quality.json")); + let pic = |w: usize, h: usize, seed: usize, mul: usize| -> Vec { + let mut v = Vec::with_capacity(3 * w * h); + for y in 0..h { + for x in 0..w { + for c in 0..3 { + v.push(((x * mul + y * (mul + 3) + 29 * c + 17 * seed + 5 * ((x * y + seed) % 13)) % 256) as u8); + } + } + } + v + }; + let cases = q["cases"].as_array().unwrap(); + assert!(cases.len() >= 6); + for k in cases { + let (w, h) = (k["w"].as_u64().unwrap() as usize, k["h"].as_u64().unwrap() as usize); + let a = pic(w, h, k["reference"][0].as_u64().unwrap() as usize, k["reference"][1].as_u64().unwrap() as usize); + let b = pic(w, h, k["test"][0].as_u64().unwrap() as usize, k["test"][1].as_u64().unwrap() as usize); + let got = quality_rgb8_value(w as u32, h as u32, &a, &b).unwrap(); + for m in ["n_samples", "sse_rgb", "sse_y", "ssim_y_q32", "windows"] { + assert_eq!(got[m], k[m], "{w}×{h}: {m}"); + } + } + } + + /// Every simulator case of `sim/cases.json` gives its result in `sim/results.json`. + #[test] + fn every_simulator_case_gives_its_result() { + let cases = read_json(&corpus().join("sim/cases.json")); + let results = read_json(&corpus().join("sim/results.json")); + let mut evals: BTreeMap = BTreeMap::new(); + let cs = cases["cases"].as_array().unwrap(); + assert_eq!(cs.len(), results["results"].as_array().unwrap().len()); + for (k, want) in cs.iter().zip(results["results"].as_array().unwrap()) { + let name = k["name"].as_str().unwrap(); + let plan = std::fs::read_to_string(corpus().join("sim").join(k["plan"].as_str().unwrap())).unwrap(); + let model = match k["model"].as_str().unwrap().strip_prefix("fixture:") { + Some(f) => { + let dir = format!("staged-measure-conformance/fixtures/{f}"); + let m = evals.entry(f.to_owned()).or_insert_with(|| measured(&dir, &fetch(&dir)).unwrap()); + Model::from_evaluation(&m.e) + } + None => model_of(&std::fs::read_to_string(corpus().join("sim").join(k["model"].as_str().unwrap())).unwrap()).unwrap(), + }; + let got: Value = serde_json::from_str(&simulated(&model, &plan).unwrap()).unwrap(); + assert_eq!(want["name"], name); + for m in ["stall_bound_us", "max_stall_us", "result"] { + assert_eq!(got[m], want[m], "{name}: {m}"); + } + } + } + + const T: &str = "2026-10-06T12:00:00Z"; + const HOST: &str = r#"{"profile": "browser-baseline", "target": "wasm32-unknown-unknown", "threads": 1}"#; + + /// A session recorded the way a page records one — each base and each layer named by + /// the envelope its decoder decoded, every presentation with its output's digest, every + /// object received — seals the claim the native tool's recorder seals over the same + /// title, byte for byte, for every fixture; it commits to the golden output tree and + /// counted bytes, and verifies. An altered output, an object left out and an object + /// miscounted are each refused with their reason. + #[test] + fn a_page_recorded_session_is_the_native_session() { + let goldens = read_json(&corpus().join("goldens.json")); + let seed = "44".repeat(32); + let nonce = "07".repeat(32); + for (name, golden) in fixture_names().iter().zip(goldens["fixtures"].as_array().unwrap()) { + let dir = format!("staged-measure-conformance/fixtures/{name}"); + let files = fetch(&dir); + let m = measured(&dir, &files).unwrap(); + // The native tool's recording. + let host = host_of(HOST).unwrap(); + let (native, entry) = wai::stage_measure::session::recorder_of(&m.t, &m.e, host.clone(), unhex32(&nonce, "n").unwrap()).unwrap(); + let want = finish(native, entry, &seed, None, T).unwrap(); + // The page's: begun at the entry object, decoders named by envelope, in + // presentation order. + let (mut r, subject) = begin(&m.t.bases[0].obj.bytes, host, unhex32(&nonce, "n").unwrap(), None).unwrap(); + assert_eq!(subject, entry, "{name}: the entry object is the first base"); + let envelope_of = |object: &[u8; 32]| -> &[u8] { + m.t.bases.iter().map(|b| &b.obj).chain(&m.t.layers).find(|o| wai::jwp_hash::content_hash(&o.bytes) == *object).map(|o| o.bytes.as_slice()).unwrap() + }; + for p in &m.e.presentations { + let (cap, pin, object) = &m.e.decoders[usize::from(p.p.decoder)]; + let h = r.decoder(decoder_key(envelope_of(object), Some(cap), pin.is_some()).unwrap()); + r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); + } + for o in &m.e.objects { + r.received(object_seen(envelope_of(&o.content_hash), true)); + } + let got = finish(r, subject, &seed, None, T).unwrap(); + assert_eq!(got["claim"], want["claim"], "{name}: the page's session is the native tool's"); + let claim: Value = serde_json::from_str(got["claim"].as_str().unwrap()).unwrap(); + assert_eq!(claim["body"]["output_root"], golden["output_root"], "{name}: the golden root"); + assert_eq!(claim["body"]["leaf_count"], golden["leaf_count"], "{name}: the golden leaf count"); + let outputs = got["outputs"].to_string(); + let objects = got["objects"].to_string(); + assert_eq!(output_root_of(&outputs).unwrap().as_deref(), golden["output_root"].as_str(), "{name}: outputRoot"); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &objects).unwrap(), "", "{name}: accepted"); + let mut bad = got["outputs"].clone(); + let d = bad[0]["out_digest"].as_str().unwrap().to_owned(); + bad[0]["out_digest"] = json!(format!("{}{}", if d.starts_with('0') { "1" } else { "0" }, &d[1..])); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &bad.to_string(), &objects).unwrap(), "session_output_mismatch", "{name}"); + let mut fewer = got["objects"].clone(); + fewer.as_array_mut().unwrap().pop(); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &fewer.to_string()).unwrap(), "session_source_not_received", "{name}"); + let mut miscounted = got["objects"].clone(); + let c = miscounted[0]["counted"].as_u64().unwrap(); + miscounted[0]["counted"] = json!(c + 1); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &miscounted.to_string()).unwrap(), "session_counted_mismatch", "{name}"); + } + } + + /// A browser session states its host as given, its workers rounded down to a power of + /// two, and writes no energy figure. + #[test] + fn a_browser_session_states_its_host_and_no_energy() { + let h = host_of(r#"{"profile": "browser-baseline", "target": null, "threads": 6}"#).unwrap(); + assert_eq!((h.profile.as_str(), h.target.as_deref(), h.threads), ("browser-baseline", None, 4)); + assert!(host_of(r#"{"profile": "browser-baseline", "target": null, "threads": 1, "energy": 0}"#).is_err(), "no other member"); + let dir = "staged-measure-conformance/fixtures/still"; + let m = measured(dir, &fetch(dir)).unwrap(); + let (r, entry) = wai::stage_measure::session::recorder_of(&m.t, &m.e, h, [1; 32]).unwrap(); + let s = finish(r, entry, &"11".repeat(32), Some("a label"), T).unwrap(); + let claim: Value = serde_json::from_str(s["claim"].as_str().unwrap()).unwrap(); + assert_eq!(claim["body"]["energy"], Value::Null); + assert_eq!(claim["body"]["host"]["threads"], 4); + assert_eq!(claim["signer_id"], "a label"); + } +} -- 2.54.0 (Apple Git-157) From 671a77615335c775d30543031409e636b997d80e Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Tue, 6 Oct 2026 18:15:32 -0400 Subject: [PATCH 02/21] =?UTF-8?q?wai:=20review=20fixes=20for=20W5-4=20?= =?UTF-8?q?=E2=80=94=20envelopes=20checked=20at=20seal,=20the=20build=20pr?= =?UTF-8?q?ofile=20by=20opt-level,=20the=20audio=20title's=20provenance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - A recorder that holds the envelopes checks the claim against them. SessionRecorder::received_envelope takes an object's bytes and derives its content hash, counted and transferred bytes, and (at the tally) whether any of its outputs was presented; seal_checked takes the envelopes the recorder holds and runs check_session_envelopes, so an entry naming a capability its envelope does not give is refused before it leaves the sink (session_source_mismatch). stage_measure::session::recorder_of hands the title's envelopes to the recorder. - wai-web's SessionHandle: received(envelope) takes the bytes alone and the recorder derives `presented`; decoderFor refuses a via that is neither the manifest's capability nor its fallback; verifyClaim takes the envelopes; presented's layers and decoder and qualityRgb8's w and h are read as JS numbers and refused unless whole and in range (int_in), never truncated or wrapped. - build_info::profile_label decides on OPT_LEVEL alone: 2, 3, s and z are release, 0 and 1 (or an unreported level) debug; cargo's PROFILE is not read. BuildProfile's doc and jwp-receipts §2.4.8's `build` row say so. A size-optimised WebAssembly build is release. - staged-measure-conformance/README.md no longer calls every title synthetic: the wai.audio.int_codec vector codes a recorded sound. Tests: session_recorder::a_recorder_holding_its_envelopes_checks_them; the fixture session test requires the envelopes held and checked; build_info's literals; measure::a_decoder_is_named_through_its_envelopes_capability and integers_from_js_are_whole_and_in_range (wai-web native count 21 -> 23). verify_measure_wasm.mjs adds envelope verdicts (wasm32, native and Python agree), the via refusal, derived `presented`, and the JS integer cases. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-web-wasm.yml | 2 +- wai/CHANGELOG.md | 16 ++ wai/extensions/jwp-receipts.md | 2 +- wai/staged-measure-conformance/README.md | 6 +- wai/wai-rs/build.rs | 7 +- wai/wai-rs/src/build_info.rs | 37 +++-- wai/wai-rs/src/energy_report.rs | 8 +- wai/wai-rs/src/session_recorder.rs | 112 ++++++++++++-- wai/wai-rs/src/stage_measure/session.rs | 23 +-- wai/wai-web/demo/verify_measure_wasm.mjs | 83 ++++++++++- wai/wai-web/src/measure.rs | 177 ++++++++++++++++------- 11 files changed, 360 insertions(+), 113 deletions(-) diff --git a/.github/workflows/wai-web-wasm.yml b/.github/workflows/wai-web-wasm.yml index 70078b152..36d562a48 100644 --- a/.github/workflows/wai-web-wasm.yml +++ b/.github/workflows/wai-web-wasm.yml @@ -137,7 +137,7 @@ jobs: run: | set -euo pipefail cargo test --locked --lib 2>&1 | tee "$RUNNER_TEMP/wai-web-native.log" - grep -q "test result: ok. 21 passed; 0 failed" "$RUNNER_TEMP/wai-web-native.log" + grep -q "test result: ok. 23 passed; 0 failed" "$RUNNER_TEMP/wai-web-native.log" - name: wasm32 int_synth decode equals the frozen native corpus shell: bash working-directory: wai/wai-web diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 9fa6925d7..63b02db77 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -32,6 +32,22 @@ wire format may change and such changes are recorded here. fixture to equal the wasm32 evaluation. A session recorded the way a page records one is the native tool's claim byte for byte and commits to the golden output tree; the wasm32, native and Python verifiers give the same verdict on it and on its altered variants. +- **A recorder that holds the envelopes checks the claim against them.** A sink may hand + `SessionRecorder` an object's bytes (`received_envelope`): the recorder derives its + content hash, counted and transferred bytes, and whether any of its outputs was + presented, and `seal_checked` checks the claim against every envelope it holds, as a + verifier holding the `envelopes` context does, so an entry naming a capability its + envelope does not give never leaves the sink (`session_source_mismatch`). The native + tool's session over a title and the browser's `SessionHandle` both hold their + envelopes; `decoderFor` refuses a capability that is neither the envelope's nor its + fallback, `received` takes the bytes alone, `verifyClaim` takes the envelopes, and + integers from JS are refused unless whole and in range. +- **The build profile is the optimisation level.** `release` is a build at `opt-level` + 2, 3, `s` or `z`, whatever its profile is named, and `debug` one at 0 or 1 + ([jwp-receipts](extensions/jwp-receipts.md) §2.4.8's `build`): a WebAssembly build + optimised for size is `release`. +- **The audio title's provenance.** `staged-measure-conformance/README.md` no longer + calls every title synthetic: the `wai.audio.int_codec` vector codes a recorded sound. ### Staged tracks over MoQ: a track per layer, a receipts track per track, delivery timeouts per hop, chains that recover diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index b2fcc8f15..97e2a9937 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -670,7 +670,7 @@ receipt's identity for every other profile. | `energy_counter_filtering` | string or `null` | As §2.4.5. | | `energy_calibration_ref` | string or `null` | As §2.4.5. | | `bracket` | object or `null` | For a figure obtained under energy-measurement §3: `{ "idle": summary, "busy": summary, "window_us": integer, "completions": integer, "in_flight": integer, "opening": "from-rest" or "running" }`, a summary being `{ "n": integer, "mean_uw": integer, "sd_uw": integer, "live_intervals": integer, "longest_live_run": integer }` as energy-measurement §6.2 defines them. `null` otherwise. | -| `build` | object | `{ "profile": "release" or "debug", "toolchain": string or null, "target": term or null }`: the build of the code measured (energy-measurement §5, §8). `release` is a build optimised as shipped; any other build is `debug`. A finer vocabulary is a new registration. | +| `build` | object | `{ "profile": "release" or "debug", "toolchain": string or null, "target": term or null }`: the build of the code measured (energy-measurement §5, §8). `release` is an optimised build (for a Rust build, `opt-level` 2, 3, `s` or `z`, whatever its profile is named); any other build is `debug`. A finer vocabulary is a new registration. | | `power_reader` | string or `null` | The reader of the power interface (energy-measurement §8). Required under a hardware class (rule 4). | A report carries none of what follows from its values: neither the §4 ratio nor diff --git a/wai/staged-measure-conformance/README.md b/wai/staged-measure-conformance/README.md index fc4b47df9..7eb1e241a 100644 --- a/wai/staged-measure-conformance/README.md +++ b/wai/staged-measure-conformance/README.md @@ -60,11 +60,13 @@ identity (Appendix D). Across the corpus: the record-wide deduplication totals ( with a short timeout (`fifo-timeout-short`), and `fifo` decode on one worker, whose stall passes the bound of the same plan with `base-first` decode (`strict-window`). -**The content is synthetic.** Each base is a committed vector under +**Where the content comes from.** Each base is a committed vector under [`../wai-rs/tests/vectors/`](../wai-rs/tests/vectors/), as the staged-delivery corpus wraps it: a `wai.neural.int_hyper` picture, a `wai.video.int_hyper` clip, a `wai.audio.int_codec` clip and a `wai.splat.int_codec` attribute tensor, each pinned to -its parameter set. Each source is the base's output with fine detail added by integer +its parameter set. The picture, the clip and the attribute tensor are synthetic. The +audio clip is not: the `wai.audio.int_codec` vector codes a recorded sound. Each source +is the base's output with fine detail added by integer functions of position, channel and a seed (for audio, two triangle waves), raised to the final shape by the layer's own predictor where the title changes the shape. The layers are `WIR1` payloads coded toward the source by the reference encoder diff --git a/wai/wai-rs/build.rs b/wai/wai-rs/build.rs index 7c4b6fe51..6005f710c 100644 --- a/wai/wai-rs/build.rs +++ b/wai/wai-rs/build.rs @@ -26,18 +26,17 @@ fn main() { } /// Record the build for a measurement report (`extensions/energy-measurement.md` -/// §5, §8): the profile, from cargo's `PROFILE` and `OPT_LEVEL` -/// (`src/build_info.rs`), the target triple, and the compiler's version line. +/// §5, §8): the profile, from cargo's `OPT_LEVEL` (`src/build_info.rs`), the +/// target triple, and the compiler's version line. /// A part that cannot be determined is left unset and reads as `null`. fn record_build() { - println!("cargo:rerun-if-env-changed=PROFILE"); println!("cargo:rerun-if-env-changed=OPT_LEVEL"); println!("cargo:rerun-if-env-changed=TARGET"); println!("cargo:rerun-if-env-changed=RUSTC"); let var = |k: &str| std::env::var(k).unwrap_or_default(); println!( "cargo:rustc-env=WAI_BUILD_PROFILE={}", - build_info::profile_label(&var("PROFILE"), &var("OPT_LEVEL")) + build_info::profile_label(&var("OPT_LEVEL")) ); let target = var("TARGET"); if !target.is_empty() { diff --git a/wai/wai-rs/src/build_info.rs b/wai/wai-rs/src/build_info.rs index 6b607fa10..e2afdb6c8 100644 --- a/wai/wai-rs/src/build_info.rs +++ b/wai/wai-rs/src/build_info.rs @@ -4,16 +4,17 @@ //! build applies is the one the crate's tests check. It uses nothing but //! `core`. -/// The build-profile label for cargo's `PROFILE` and `OPT_LEVEL`: `release` for -/// a build optimised as shipped — cargo's `release` profile at `opt-level` 2 -/// or 3 — and `debug` for any other, including a `release` profile turned down -/// to a lower level and the size levels `s` and `z`, which are not how this -/// crate ships. The label is a statement about optimisation, not about debug -/// assertions: a release build with assertions on is still `release`, and a -/// dev build with them off is still `debug`. -pub fn profile_label(profile: &str, opt_level: &str) -> &'static str { - match (profile, opt_level) { - ("release", "2" | "3") => "release", +/// The build-profile label for cargo's `OPT_LEVEL`: `release` for an optimised +/// build — `opt-level` 2 or 3, or the size levels `s` and `z`, which is how a +/// WebAssembly build ships — and `debug` for `opt-level` 0 or 1, or a level cargo +/// did not report. Cargo's `PROFILE` is not read: the label is decided by the +/// optimisation the code was built with, whatever the profile is named, so a dev +/// profile turned up to an optimising level is `release` and a release profile +/// turned down to 0 or 1 is `debug`. Nor is it a statement about debug +/// assertions: an optimised build with assertions on is still `release`. +pub fn profile_label(opt_level: &str) -> &'static str { + match opt_level { + "2" | "3" | "s" | "z" => "release", _ => "debug", } } @@ -23,14 +24,12 @@ mod tests { use super::profile_label; #[test] - fn release_means_the_release_profile_optimised() { - assert_eq!(profile_label("release", "3"), "release"); - assert_eq!(profile_label("release", "2"), "release"); - assert_eq!(profile_label("release", "1"), "debug"); - assert_eq!(profile_label("release", "0"), "debug"); - assert_eq!(profile_label("release", "s"), "debug"); - assert_eq!(profile_label("debug", "3"), "debug", "a dev profile turned up is not the shipped build"); - assert_eq!(profile_label("debug", "0"), "debug"); - assert_eq!(profile_label("", ""), "debug"); + fn release_means_an_optimised_build() { + for level in ["2", "3", "s", "z"] { + assert_eq!(profile_label(level), "release", "opt-level {level} is optimised"); + } + for level in ["0", "1", "", "4", "S"] { + assert_eq!(profile_label(level), "debug", "opt-level {level:?} is not an optimised level cargo reports"); + } } } diff --git a/wai/wai-rs/src/energy_report.rs b/wai/wai-rs/src/energy_report.rs index 6ee94c31c..d163e1a8c 100644 --- a/wai/wai-rs/src/energy_report.rs +++ b/wai/wai-rs/src/energy_report.rs @@ -448,9 +448,9 @@ impl BracketValues { /// (jwp-receipts §2.4.4). #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum BuildProfile { - /// Optimised as shipped: cargo's `release` profile at `opt-level` 2 or 3. + /// An optimised build: `opt-level` 2, 3, `s` or `z`, whatever the profile is named. Release, - /// Any other build. + /// Any other build: `opt-level` 0 or 1. Debug, } @@ -471,7 +471,7 @@ impl BuildProfile { } /// The profile this crate was built under, as `build.rs` recorded it from - /// cargo's `PROFILE` and `OPT_LEVEL` (`src/build_info.rs`). + /// cargo's `OPT_LEVEL` (`src/build_info.rs`). pub fn of_this_build() -> BuildProfile { BuildProfile::from_label(env!("WAI_BUILD_PROFILE")).unwrap_or(BuildProfile::Debug) } @@ -859,7 +859,7 @@ mod tests { assert_eq!(BuildProfile::from_label("debug"), Some(BuildProfile::Debug)); assert_eq!(BuildProfile::from_label("Release"), None); // This test binary is built under the dev profile at opt-level 0. - if cfg!(debug_assertions) && crate::build_info::profile_label("debug", "0") == "debug" { + if cfg!(debug_assertions) && crate::build_info::profile_label("0") == "debug" { assert_eq!(BuildProfile::of_this_build().label(), env!("WAI_BUILD_PROFILE")); } let r = BuildRecord::of_this_build(); diff --git a/wai/wai-rs/src/session_recorder.rs b/wai/wai-rs/src/session_recorder.rs index aeb2e54d5..11db4ad0c 100644 --- a/wai/wai-rs/src/session_recorder.rs +++ b/wai/wai-rs/src/session_recorder.rs @@ -11,6 +11,12 @@ //! claim, and checks it against the presentations, the objects and the `stage` claims it //! names (§3.1 step 6) before it returns it. A recorder never emits a claim a verifier //! holding what it recorded refuses. +//! +//! A sink that hands the recorder an object's bytes ([`SessionRecorder::received_envelope`]) +//! rather than its figures has the recorder derive them — the content hash, the counted and +//! transferred bytes, and whether any of its outputs was presented — and the recorder holds +//! the envelope, so `finish` checks the claim against it too, as a verifier holding the +//! envelopes does (§2.4.12 step 6, the `envelopes` context). use crate::claim_receipt::{ session::SESSION_CLASSICAL_SOURCES, ClaimBody, ClaimClass, ClaimReceipt, DecoderEntry, Missed, ObjectSeen, @@ -84,6 +90,8 @@ pub struct RecordedSession { pub objects: Vec, /// The wire forms of the `stage` claims the session names. pub stage_claims: Vec, + /// The envelopes the recorder held, in the order it received them. + pub envelopes: Vec>, } /// One session at a sink (§2.4.12). @@ -107,6 +115,9 @@ pub struct SessionRecorder { /// The wire forms of the `stage` claims named, each once. stage_claims: Vec, energy: Option, + /// The envelopes received as bytes, each with its index in `objects`, whose + /// `presented` the tally derives. + held: Vec<(usize, Vec)>, } impl SessionRecorder { @@ -131,6 +142,7 @@ impl SessionRecorder { stage_signer: None, stage_claims: Vec::new(), energy: None, + held: Vec::new(), } } @@ -150,6 +162,24 @@ impl SessionRecorder { self.objects.push(seen); } + /// An object received whole on the primary path, as its bytes. The recorder derives + /// its content hash, its counted bytes (staged-measurement §3; none where it is not + /// countable) and its transferred length from them, and at the tally whether any of its + /// outputs was presented: whether a presentation's decoder entry names it. It holds the + /// envelope, and [`SessionRecorder::finish`] checks the claim against every envelope it + /// holds. + #[cfg(feature = "stage_measure")] + pub fn received_envelope(&mut self, envelope: &[u8]) { + self.objects.push(ObjectSeen { + content_hash: crate::jwp_hash::content_hash(envelope), + path: SessionPath::Primary, + counted: crate::measure_framing::count_object(envelope).ok().map(|c| c.total), + transferred: envelope.len() as u64, + presented: false, + }); + self.held.push((self.objects.len() - 1, envelope.to_vec())); + } + /// Bytes of receipts and claims received. pub fn receipt_bytes(&mut self, n: u64) { self.receipt_bytes = self.receipt_bytes.saturating_add(n); @@ -285,8 +315,9 @@ impl SessionRecorder { missed_units.sort_by_key(|m| (m.unit, m.layers)); let missed = missed_units.len() as u64; missed_units.truncate(MAX_MISSED); + let objects = self.objects_seen(); let sum = |f: &dyn Fn(&ObjectSeen) -> bool| -> u64 { - self.objects.iter().filter(|o| f(o)).filter_map(|o| o.counted).fold(0u64, u64::saturating_add) + objects.iter().filter(|o| f(o)).filter_map(|o| o.counted).fold(0u64, u64::saturating_add) }; let body = SessionClaim { session_nonce: self.session_nonce, @@ -308,14 +339,24 @@ impl SessionRecorder { counted_primary: sum(&|o| o.path == SessionPath::Primary), counted_fallback: sum(&|o| o.path == SessionPath::Fallback), counted_discarded: sum(&|o| !o.presented), - uncounted: self.objects.iter().filter(|o| o.counted.is_none()).count() as u64, - transferred: self.objects.iter().map(|o| o.transferred).fold(0u64, u64::saturating_add), + uncounted: objects.iter().filter(|o| o.counted.is_none()).count() as u64, + transferred: objects.iter().map(|o| o.transferred).fold(0u64, u64::saturating_add), receipt_bytes: self.receipt_bytes, classical_declared: self.classical, classical_source: self.classical.map(|_| SESSION_CLASSICAL_SOURCES[0].to_owned()), energy: self.energy.clone(), }; - (body, ps, self.objects.clone()) + (body, ps, objects) + } + + /// The objects received, an envelope's `presented` derived from the presentations. + fn objects_seen(&self) -> Vec { + let mut objects = self.objects.clone(); + for (i, _) in &self.held { + let o = &mut objects[*i]; + o.presented = self.presentations.iter().any(|p| self.keys[p.2].object == o.content_hash); + } + objects } /// Tally the record ([`SessionRecorder::tally`]) and seal it with [`seal_checked`]. The @@ -332,21 +373,25 @@ impl SessionRecorder { issued_at: &str, ) -> Result { let (body, ps, objects) = self.tally(); - seal_checked(body, ps, objects, self.stage_claims, subject, key, signer_id, seq, parent, issued_at) + let envelopes: Vec> = self.held.into_iter().map(|(_, b)| b).collect(); + seal_checked(body, ps, objects, self.stage_claims, envelopes, subject, key, signer_id, seq, parent, issued_at) } } -/// Seal a session body and check the claim against the presentations, the objects and the -/// `stage` claims it was tallied from (§3.1 steps 1–4 by [`ClaimReceipt::seal`], step 6 -/// here), so a claim those refuse never leaves the sink. A `stage` claim another key -/// signed is refused there (`context_mismatch`): the key that signs the session signs the -/// stage claims it names. +/// Seal a session body and check the claim against the presentations, the objects, the +/// envelopes it holds (none, or every one it received as bytes) and the `stage` claims it +/// was tallied from (§3.1 steps 1–4 by [`ClaimReceipt::seal`], step 6 here), so a claim +/// those refuse never leaves the sink: a decoder entry naming a capability its envelope +/// does not give, for one, is refused (`session_source_mismatch`). A `stage` claim another +/// key signed is refused there (`context_mismatch`): the key that signs the session signs +/// the stage claims it names. #[allow(clippy::too_many_arguments)] pub fn seal_checked( body: SessionClaim, presentations: Vec, objects: Vec, stage_claims: Vec, + envelopes: Vec>, subject: [u8; 32], key: &SigningKey, signer_id: &str, @@ -357,9 +402,13 @@ pub fn seal_checked( let claim = ClaimReceipt::seal(key, signer_id, SubjectType::Object, subject, seq, issued_at, ClaimBody::ReconstructSession(body), parent)?; claim.check_session_outputs(&presentations, &|_| None)?; claim.check_session_objects(&objects)?; + if !envelopes.is_empty() { + let refs: Vec<&[u8]> = envelopes.iter().map(Vec::as_slice).collect(); + claim.check_session_envelopes(&refs, Some(&objects))?; + } let wires: Vec<&str> = stage_claims.iter().map(String::as_str).collect(); claim.check_session_stage_claims(&wires, Some(&presentations), Some(&objects))?; - Ok(RecordedSession { claim, presentations, objects, stage_claims }) + Ok(RecordedSession { claim, presentations, objects, stage_claims, envelopes }) } #[cfg(test)] @@ -458,7 +507,7 @@ mod tests { r.received(ObjectSeen { content_hash: [1; 32], path: SessionPath::Primary, counted: Some(5_000), transferred: 5_000, presented: true }); r.received(ObjectSeen { content_hash: [2; 32], path: SessionPath::Primary, counted: Some(700), transferred: 700, presented: true }); let (body, ps, objects) = r.tally(); - let seal = |b: SessionClaim, o: Vec| seal_checked(b, ps.clone(), o, vec![], [1; 32], &k, "did:example:sink", 0, None, T).map(|_| ()).map_err(|e| (e.step, e.reason)); + let seal = |b: SessionClaim, o: Vec| seal_checked(b, ps.clone(), o, vec![], vec![], [1; 32], &k, "did:example:sink", 0, None, T).map(|_| ()).map_err(|e| (e.step, e.reason)); assert_eq!(seal(body.clone(), objects.clone()), Ok(())); let mut moved = body.clone(); moved.decoders[0].leaves -= 1; @@ -479,6 +528,45 @@ mod tests { assert_eq!(seal(bad, objects), Err((4, Reason::SessionDecoderMalformed))); } + /// A recorder handed the envelopes themselves derives each object's figures — counted + /// and transferred bytes from the bytes, `presented` from the presentations, so an + /// envelope received and never presented counts as discarded — and checks the claim + /// against the envelopes before it leaves the sink: a decoder entry naming a capability + /// its envelope does not give is refused there (`session_source_mismatch`), as a + /// verifier holding the envelopes refuses it. + #[cfg(feature = "stage_measure")] + #[test] + fn a_recorder_holding_its_envelopes_checks_them() { + let wai = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join(".."); + let read = |p: &str| std::fs::read(wai.join(p)).unwrap_or_else(|e| panic!("{p}: {e}")); + let base = read("staged-conformance/cases/image_int_hyper_2l/base.wai"); + let l1 = read("staged-measure-conformance/fixtures/still/L01.wai"); + let l2 = read("staged-measure-conformance/fixtures/still/L02.wai"); + let hash = crate::jwp_hash::content_hash; + let k = SigningKey::from_bytes(&[0x44; 32]); + let record = |base_capability: &str| { + let mut r = SessionRecorder::new([7; 32], "image", host(), None); + let b = r.decoder(key(base_capability, SessionPath::Primary, hash(&base))); + let l = r.decoder(key("wai.image.int_refine", SessionPath::Primary, hash(&l1))); + r.presented(0, 1, b, d(0, 1), None).unwrap(); + r.presented(0, 2, l, d(0, 2), None).unwrap(); + r.received_envelope(&base); + r.received_envelope(&l1); + r.received_envelope(&l2); + r + }; + let s = record("wai.neural.int_hyper").finish(hash(&base), &k, "did:example:sink", 0, None, T).unwrap(); + assert_eq!(s.objects.iter().map(|o| o.presented).collect::>(), [true, true, false], "presented derived from the outputs"); + assert_eq!(s.objects.iter().map(|o| (o.counted, o.transferred)).collect::>(), + [&base, &l1, &l2].iter().map(|b| (Some(b.len() as u64), b.len() as u64)).collect::>()); + let ClaimBody::ReconstructSession(body) = &s.claim.body else { panic!("a session") }; + assert_eq!(body.counted_discarded, l2.len() as u64, "received and never presented"); + let refs: Vec<&[u8]> = s.envelopes.iter().map(Vec::as_slice).collect(); + s.claim.check_session_envelopes(&refs, Some(&s.objects)).unwrap(); + let wrong = record("wai.audio.int_codec").finish(hash(&base), &k, "did:example:sink", 0, None, T); + assert_eq!(wrong.map(|_| ()).map_err(|e| (e.step, e.reason)), Err((6, Reason::SessionSourceMismatch))); + } + /// A `stage` claim about the set of `n` units over `base`, every unit at stage 0, signed /// with `k`. fn stage_claim(k: &SigningKey, base: [u8; 32], n: u64) -> ClaimReceipt { diff --git a/wai/wai-rs/src/stage_measure/session.rs b/wai/wai-rs/src/stage_measure/session.rs index beae83d41..2b9f5b97b 100644 --- a/wai/wai-rs/src/stage_measure/session.rs +++ b/wai/wai-rs/src/stage_measure/session.rs @@ -4,11 +4,12 @@ //! A tool that decodes a title as a sink does — every base, then every layer, all on the //! primary path, no deadline — records the session a [`SessionRecorder`] would: one //! decoder entry per (capability, pin, object) of the evaluation, in its first-use order; every -//! presentation with its output's digest; every object of the title received whole and -//! presented. Its output tree is the title's (staged-measurement Appendix C), so a session -//! claim over a fixture commits to the root its golden states. +//! presentation with its output's digest; every object of the title received whole, as its +//! bytes, so the recorder derives its figures and checks the claim against the envelopes +//! when it seals it. Its output tree is the title's (staged-measurement Appendix C), so a +//! session claim over a fixture commits to the root its golden states. -use crate::claim_receipt::{ObjectSeen, SessionHost, SessionPath}; +use crate::claim_receipt::{SessionHost, SessionPath}; use crate::codecs::DeclaredTier; use crate::container::Wai; use crate::session_recorder::{DecoderKey, SessionRecorder}; @@ -76,13 +77,9 @@ pub fn recorder_of(t: &Title, e: &Evaluation, host: SessionHost, session_nonce: r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).map_err(|x| invalid(format!("{}: {x}", t.dir)))?; } for o in &e.objects { - r.received(ObjectSeen { - content_hash: o.content_hash, - path: SessionPath::Primary, - counted: Some(o.counted.total), - transferred: o.counted.total, - presented: true, - }); + let held = t.bases.iter().map(|b| &b.obj).chain(&t.layers).find(|x| x.path == o.path); + let bytes = held.ok_or_else(|| invalid(format!("{}: {} is not one of the title's objects", t.dir, o.path)))?; + r.received_envelope(&bytes.bytes); } Ok((r, first.0.info.content_hash)) } @@ -233,6 +230,10 @@ mod tests { s.claim.verify().unwrap(); s.claim.check_session_outputs(&s.presentations, &|_| None).unwrap(); s.claim.check_session_objects(&s.objects).unwrap(); + assert_eq!(s.envelopes.len(), e.objects.len(), "{name}: the recorder holds every object it received"); + let held: Vec<&[u8]> = s.envelopes.iter().map(Vec::as_slice).collect(); + s.claim.check_session_envelopes(&held, Some(&s.objects)).unwrap(); + assert!(s.objects.iter().all(|o| o.presented), "{name}: every object of a completion is presented"); assert_eq!(super::super::run::completion(&t).unwrap(), c.leaf_count, "{name}: one completion is every stage"); } } diff --git a/wai/wai-web/demo/verify_measure_wasm.mjs b/wai/wai-web/demo/verify_measure_wasm.mjs index 4fd0c3f58..3b290f9f1 100644 --- a/wai/wai-web/demo/verify_measure_wasm.mjs +++ b/wai/wai-web/demo/verify_measure_wasm.mjs @@ -22,10 +22,15 @@ // native tool's recorder) and the session recorded the way a page records one // (sessionBegin at the entry object, decoderFor each envelope, presented, received), // both sealed with one key, nonce and time, are the same claim byte for byte; it -// commits to the golden output_root and leaf_count, verifyClaim accepts it, and -// refuses it against an altered output (session_output_mismatch), with an object left -// out (session_source_not_received) and with an object miscounted -// (session_counted_mismatch). +// commits to the golden output_root and leaf_count, verifyClaim accepts it with and +// without the envelopes, and refuses it against an altered output +// (session_output_mismatch), with an object left out (session_source_not_received) and +// with an object miscounted (session_counted_mismatch); +// - the recorder's own checks: decoderFor refuses a capability the envelope neither +// carries nor falls back to; an object received and never presented is recorded as +// not presented, whatever the page would say; and integers from JS (a unit, a layer +// count, a decoder handle, a picture's width and height) that are not whole numbers in +// range are refused, never truncated or wrapped. // // node verify_measure_wasm.mjs [path/to/wai_web.js] [path/to/staged-measure-conformance] [--out ] // @@ -216,7 +221,7 @@ for (const [name, { files, t, golden }] of titles) { const handle = h.decoderFor(envelopeOf.get(d.object), d.capability, d.pin !== null); h.presented(p.unit, p.layers, handle, p.out_sha256, undefined); } - for (const o of golden.objects) h.received(files.get(o.file), true); + for (const o of golden.objects) h.received(files.get(o.file)); const page = h.finish(SEED, undefined, T); let again = null; try { h.finish(SEED, undefined, T); } catch (e) { again = String(e.message ?? e); } @@ -227,22 +232,84 @@ for (const [name, { files, t, golden }] of titles) { check(body.counted_primary === golden.objects.reduce((a, o) => a + o.counted.total, 0) && body.energy === null, `${name}: counted bytes summed, no energy figure`); const o = JSON.stringify(page.outputs), j = JSON.stringify(page.objects); check(wai.outputRoot(o) === golden.output_root, `${name}: outputRoot over the session's outputs`); + const envelopes = golden.objects.map((x) => files.get(x.file)); check(wai.verifyClaim(page.claim, o, j) === '', `${name}: verifyClaim accepts the session`); + check(wai.verifyClaim(page.claim, o, j, envelopes) === '', `${name}: verifyClaim accepts the session with the envelopes`); const altered = page.outputs.map((p, i) => (i === 0 ? { ...p, out_digest: flip(p.out_digest) } : p)); const fewer = page.objects.slice(0, -1); const miscounted = page.objects.map((x, i) => (i === 0 ? { ...x, counted: x.counted + 1 } : x)); const variants = [ [`${name}/accept`, page.outputs, page.objects, `accept link_hash=${page.link_hash}`, ''], + [`${name}/accept-with-envelopes`, page.outputs, page.objects, `accept link_hash=${page.link_hash}`, '', envelopes], [`${name}/output-altered`, altered, page.objects, 'reject step=6 reason=session_output_mismatch', 'session_output_mismatch'], [`${name}/object-left-out`, page.outputs, fewer, 'reject step=6 reason=session_source_not_received', 'session_source_not_received'], [`${name}/object-miscounted`, page.outputs, miscounted, 'reject step=6 reason=session_counted_mismatch', 'session_counted_mismatch'], ]; - for (const [vname, outputs, objects, verdict, reason] of variants) { - check(wai.verifyClaim(page.claim, JSON.stringify(outputs), JSON.stringify(objects)) === reason, `${vname}: verifyClaim gives "${reason}"`); - vectors.push({ name: vname, procedure: 'claim', receipt: page.claim, context: { outputs, objects } }); + for (const [vname, outputs, objects, verdict, reason, envs] of variants) { + check(wai.verifyClaim(page.claim, JSON.stringify(outputs), JSON.stringify(objects), envs) === reason, `${vname}: verifyClaim gives "${reason}"`); + const context = envs ? { outputs, objects, envelopes: envs.map((e) => ({ envelope: Buffer.from(e).toString('hex') })) } : { outputs, objects }; + vectors.push({ name: vname, procedure: 'claim', receipt: page.claim, context }); expected.push(`${vname}\t${verdict}`); } } +// ── the recorder's own checks ────────────────────────────────────────────────── +{ + const { files, golden } = titles.get(names.includes('still') ? 'still' : names[0]); + const env = (o) => files.get(o.file); + const refusedBy = (f) => { try { f(); return null; } catch (e) { return String(e.message ?? e); } }; + const base = golden.objects[0]; + const h = wai.sessionBegin(env(base), HOST, NONCE, undefined); + // A decoder through a capability the envelope neither carries nor falls back to. + check(/neither the envelope's capability/.test(refusedBy(() => h.decoderFor(env(base), 'wai.audio.int_codec', true)) ?? ''), + 'decoderFor refuses a capability its envelope neither carries nor falls back to'); + const p0 = golden.presentations.find((x) => x.layers === 1); + // Integers from JS: whole numbers in range, never truncated or wrapped. Each case on a + // fresh handle, refused for its own field and not for anything an earlier case left. + const fresh = () => { + const x = wai.sessionBegin(env(base), HOST, NONCE, undefined); + return [x, x.decoderFor(env(base), golden.decoders[0].capability, golden.decoders[0].pin !== null)]; + }; + for (const [what, field, f] of [ + ['unit 0.5', 'unit', (x, dd) => x.presented(0.5, 1, dd, p0.out_sha256, undefined)], + ['layers 1.9', 'layers', (x, dd) => x.presented(0, 1.9, dd, p0.out_sha256, undefined)], + ['layers 2^32 + 2', 'layers', (x, dd) => x.presented(1, 2 ** 32 + 2, dd, p0.out_sha256, undefined)], + ['layers 65536', 'layers', (x, dd) => x.presented(1, 65536, dd, p0.out_sha256, undefined)], + ['decoder 0.99', 'decoder', (x, dd) => x.presented(2, 1, dd + 0.99, p0.out_sha256, undefined)], + ['decoder -1', 'decoder', (x) => x.presented(2, 1, -1, p0.out_sha256, undefined)], + ['qualityRgb8 width 1.5', 'w', () => wai.qualityRgb8(1.5, 1, new Uint8Array(3), new Uint8Array(3))], + ['qualityRgb8 height 2^32 + 1', 'h', () => wai.qualityRgb8(1, 2 ** 32 + 1, new Uint8Array(3), new Uint8Array(3))], + ]) { + const [x, dd] = fresh(); + const why = refusedBy(() => f(x, dd)) ?? ''; + check(why.startsWith(`${field}: a whole number`), `${what}: refused for its ${field} (${why || 'accepted'})`); + x.free(); + } + // The same calls with whole numbers in range are recorded. + { + const [x, dd] = fresh(); + check(refusedBy(() => x.presented(0, 1, dd, p0.out_sha256, undefined)) === null, 'a whole unit, layer count and decoder are recorded'); + x.free(); + } + // Present every stage but the last layer's; receive every object, the last layer included. + const top = Math.max(...golden.objects.map((o) => o.layer)); + const last = golden.objects.find((o) => o.layer === top); + const handles = new Map(); + for (const p of golden.presentations) { + const dd = golden.decoders[p.decoder]; + if (dd.object === last.object) continue; + const key = `${dd.object}`; + if (!handles.has(key)) handles.set(key, h.decoderFor(env(golden.objects.find((o) => o.object === dd.object)), dd.capability, dd.pin !== null)); + h.presented(p.unit, p.layers, handles.get(key), p.out_sha256, undefined); + } + for (const o of golden.objects) h.received(env(o)); + const r = h.finish(SEED, undefined, T); + const seen = r.objects.find((o) => o.content_hash === last.object); + check(seen && seen.presented === false && JSON.parse(r.claim).body.counted_discarded === last.counted.total, + 'an object received and never presented is recorded as not presented, and counted as discarded'); + check(wai.verifyClaim(r.claim, JSON.stringify(r.outputs), JSON.stringify(r.objects), golden.objects.map(env)) === '', + 'that session verifies against the envelopes received'); +} + if (out) { writeFileSync(join(out, 'sessions.json'), printed({ about: 'Sessions sealed by the wasm32 binding over the staged-measure corpus (verify_measure_wasm.mjs).', vectors })); writeFileSync(join(out, 'verdicts-wasm.txt'), expected.join('\n') + '\n'); diff --git a/wai/wai-web/src/measure.rs b/wai/wai-web/src/measure.rs index 08af56d77..8afe83f30 100644 --- a/wai/wai-web/src/measure.rs +++ b/wai/wai-web/src/measure.rs @@ -18,12 +18,15 @@ //! page fetches it and asks again. //! //! [`SessionHandle`] is `wai::session_recorder::SessionRecorder`: a page tells it the -//! decoders it used, the objects it received and every presentation with its output's -//! digest, and `finish` seals the `reconstruct-session` claim with a key whose seed the -//! page supplies, checked against what it recorded before it is returned. The decode is -//! never metered here, so a browser session's `energy` is `null`. `verifyClaim` runs the -//! conformance runner of `claim-conformance/` on the claim with the presentations and the -//! objects (§3.1, step 6 included). +//! decoder that decoded each envelope, every presentation with its output's digest, and +//! the bytes of every object it received. The recorder derives each object's figures from +//! its bytes — whether any of its outputs was presented from the presentations — and holds +//! the envelopes, so `finish` seals the `reconstruct-session` claim with a key whose seed +//! the page supplies only after checking it against the presentations, the objects and the +//! envelopes, as a verifier holding all three does. The decode is never metered here, so a +//! browser session's `energy` is `null`. `verifyClaim` runs the conformance runner of +//! `claim-conformance/` on the claim with the presentations, the objects and, where given, +//! the envelopes (§3.1, step 6 included). //! //! Integers that can pass 2^53 − 1 (the sums of squares) are decimal strings, as the //! corpus writes them; every other figure is a number. @@ -34,7 +37,7 @@ use std::collections::BTreeMap; use serde_json::{json, Value}; -use wai::claim_receipt::{ObjectSeen, SessionHost, SessionPath}; +use wai::claim_receipt::{SessionHost, SessionPath}; use wai::codecs::DeclaredTier; use wai::container::Wai; use wai::measure_framing::{count_object as count_framed, FramingError}; @@ -200,12 +203,18 @@ pub(crate) fn host_of(host_json: &str) -> Result { } /// The decoder entry key for decoding `envelope` here: through `via` (its manifest's -/// capability where absent), on the primary path, with this build's decoders; `pinned` +/// capability where absent; otherwise that capability or the manifest's fallback, and +/// nothing else, SPEC §4), on the primary path, with this build's decoders; `pinned` /// when its decode verified the parameter set its manifest pins, whose SHA-256 is then /// the entry's `pin` and whose declared tier (SPEC §3.1: an unregistered token, or none, /// reads as `none`) its `tier`. pub(crate) fn decoder_key(envelope: &[u8], via: Option<&str>, pinned: bool) -> Result { let w = Wai::from_bytes(envelope).map_err(|e| e.to_string())?; + if let Some(v) = via { + if v != w.capability() && w.fallback() != Some(v) { + return Err(format!("via: {v} is neither the envelope's capability ({}) nor its fallback", w.capability())); + } + } let (pin, tier) = if pinned { let p = w.prior().ok_or("pinned, but the envelope pins no parameter set")?; let tier = p.tier().and_then(DeclaredTier::from_token).unwrap_or(DeclaredTier::None).token().to_owned(); @@ -226,18 +235,6 @@ pub(crate) fn decoder_key(envelope: &[u8], via: Option<&str>, pinned: bool) -> R }) } -/// An object received whole on the primary path: its content hash, its counted bytes -/// (`None` where it is not countable) and its length as transferred. -pub(crate) fn object_seen(envelope: &[u8], presented: bool) -> ObjectSeen { - ObjectSeen { - content_hash: wai::jwp_hash::content_hash(envelope), - path: SessionPath::Primary, - counted: count_framed(envelope).ok().map(|c| c.total), - transferred: envelope.len() as u64, - presented, - } -} - /// A sealed session as a page reads it: the claim's wire form (JCS), its link hash, and /// what a verifier checks it against at step 6 in the claim-conformance context form. pub(crate) fn recorded_value(s: &RecordedSession) -> Value { @@ -266,11 +263,16 @@ pub(crate) fn finish(r: SessionRecorder, subject: [u8; 32], seed_hex: &str, sign /// A `reconstruct-session` claim checked as the claim-conformance runner checks one /// (`wai::claim_receipt::corpus_verdicts`): §3.1 steps 1–4, then step 6 against the -/// presentations and the objects. `""` when accepted, otherwise the reason. -pub(crate) fn verify_session(claim: &str, outputs_json: &str, objects_json: &str) -> Result { +/// presentations, the objects and, where given, the envelopes the session received. +/// `""` when accepted, otherwise the reason. +pub(crate) fn verify_session(claim: &str, outputs_json: &str, objects_json: &str, envelopes: Option<&[Vec]>) -> Result { let outputs: Value = serde_json::from_str(outputs_json).map_err(|e| format!("outputs: {e}"))?; let objects: Value = serde_json::from_str(objects_json).map_err(|e| format!("objects: {e}"))?; - let doc = json!({"vectors": [{"name": "session", "procedure": "claim", "receipt": claim, "context": {"outputs": outputs, "objects": objects}}]}); + let mut context = json!({"outputs": outputs, "objects": objects}); + if let Some(es) = envelopes { + context["envelopes"] = es.iter().map(|e| json!({"envelope": hex(e)})).collect::>().into(); + } + let doc = json!({"vectors": [{"name": "session", "procedure": "claim", "receipt": claim, "context": context}]}); let vs = wai::claim_receipt::corpus_verdicts(&doc.to_string())?; let verdict = vs.first().map(|(_, v)| v.as_str()).unwrap_or("error"); if verdict.starts_with("accept") { @@ -305,14 +307,20 @@ fn files_of(m: &js_sys::Map) -> Result { Ok(out) } -/// A count from JS: a non-negative integer no larger than 2^53 − 1. -fn int(v: f64, what: &str) -> Result { - if !(0.0..=9_007_199_254_740_991.0).contains(&v) || v.fract() != 0.0 { - return Err(JsError::new(&format!("{what}: a non-negative integer"))); +/// A count from JS: a whole number from 0 to `max` (at most 2^53 − 1). A JS number is +/// read as given, never truncated or wrapped as wasm-bindgen's integer types would. +pub(crate) fn int_in(v: f64, max: u64, what: &str) -> Result { + let max = max.min((1 << 53) - 1); + if !(0.0..=max as f64).contains(&v) || v.fract() != 0.0 { + return Err(format!("{what}: a whole number from 0 to {max}")); } Ok(v as u64) } +fn int(v: f64, what: &str) -> Result { + int_in(v, u64::MAX, what).map_err(js_err) +} + /// The next file the title in `dir` (below `wai/`) needs and `files` does not hold, or /// `undefined` once it holds every one. #[wasm_bindgen(js_name = titleMissing)] @@ -361,7 +369,9 @@ pub fn count_object(envelope: &[u8]) -> Result { /// §4.2's integers for two RGB8 pictures of `w × h`: `{kind, n_samples, sse_rgb, sse_y, /// ssim_y_q32, windows}`, the sums of squares as decimal strings. #[wasm_bindgen(js_name = qualityRgb8)] -pub fn quality_rgb8(w: u32, h: u32, reference: &[u8], test: &[u8]) -> Result { +pub fn quality_rgb8(w: f64, h: f64, reference: &[u8], test: &[u8]) -> Result { + let w = int_in(w, u32::MAX.into(), "w").map_err(js_err)? as u32; + let h = int_in(h, u32::MAX.into(), "h").map_err(js_err)? as u32; to_js(&quality_rgb8_value(w, h, reference, test).map_err(js_err)?) } @@ -452,39 +462,42 @@ impl SessionHandle { } /// The handle of the decoder that decoded `envelope` here, through `via` (its - /// manifest's capability where absent); `pinned` when the decode verified the - /// parameter set the manifest pins. The same decoder on the same object gives the same - /// handle. + /// manifest's capability where absent; otherwise that capability or its fallback, and + /// any other is refused); `pinned` when the decode verified the parameter set the + /// manifest pins. The same decoder on the same object gives the same handle. #[wasm_bindgen(js_name = decoderFor)] pub fn decoder_for(&mut self, envelope: &[u8], via: Option, pinned: bool) -> Result { let k = decoder_key(envelope, via.as_deref(), pinned).map_err(js_err)?; Ok(self.rec()?.decoder(k) as u32) } - /// An object received whole on the primary path; `presented` when any of its outputs - /// was presented. - pub fn received(&mut self, envelope: &[u8], presented: bool) -> Result<(), JsError> { - let o = object_seen(envelope, presented); - self.rec()?.received(o); + /// An object received whole on the primary path, as its bytes — every object the page + /// received, presented or not, and one it refused too. The recorder derives its + /// figures, and whether any of its outputs was presented from the presentations it is + /// told, and holds it, so `finish` checks the claim against it. + pub fn received(&mut self, envelope: &[u8]) -> Result<(), JsError> { + self.rec()?.received_envelope(envelope); Ok(()) } /// A presentation: `unit` at `layers` (1 for the base alone), through the decoder /// `decoder` names, the SHA-256 of its output's canonical buffer, and how late it was /// where it missed the session's deadline. - pub fn presented(&mut self, unit: f64, layers: u32, decoder: u32, out_digest_hex: &str, late_us: Option) -> Result<(), JsError> { + pub fn presented(&mut self, unit: f64, layers: f64, decoder: f64, out_digest_hex: &str, late_us: Option) -> Result<(), JsError> { let unit = int(unit, "unit")?; - let layers = u16::try_from(layers).map_err(|_| JsError::new("layers: past 65535"))?; + let layers = int_in(layers, u16::MAX.into(), "layers").map_err(js_err)? as u16; + let decoder = int_in(decoder, u32::MAX.into(), "decoder").map_err(js_err)? as usize; let digest = unhex32(out_digest_hex, "out_digest").map_err(js_err)?; let late = late_us.map(|l| int(l, "late_us")).transpose()?; - self.rec()?.presented(unit, layers, decoder as usize, digest, late).map_err(js_err) + self.rec()?.presented(unit, layers, decoder, digest, late).map_err(js_err) } /// Seal the session, about its entry object: the key from the 32-byte `seed_hex`; /// `signer_id` the key's `did:key` where absent; `issued_at` an RFC 3339 time. Gives /// `{claim, link_hash, outputs, objects}`: the claim's wire form (JCS) and what /// `verifyClaim` checks it against. The recorder checks the claim against what it - /// recorded first, and refuses one a verifier would refuse. A handle seals once. + /// recorded first — the presentations, the objects and the envelopes it holds — and + /// refuses one a verifier holding them would refuse. A handle seals once. pub fn finish(&mut self, seed_hex: &str, signer_id: Option, issued_at: &str) -> Result { let r = self.r.take().ok_or_else(|| JsError::new("the session is finished"))?; to_js(&finish(r, self.subject, seed_hex, signer_id.as_deref(), issued_at).map_err(js_err)?) @@ -492,13 +505,23 @@ impl SessionHandle { } /// Check a `reconstruct-session` claim (its wire form) against the presentations -/// (`outputs`, `[{unit, layers, decoder, out_digest}]`) and the objects received -/// (`[{content_hash, path, counted, transferred, presented}]`): the signature and the -/// class's rules, the output tree, the consistency of the members the presentations -/// give, and the byte sums. `""` when accepted, otherwise the reason (jwp-receipts §3.1). +/// (`outputs`, `[{unit, layers, decoder, out_digest}]`), the objects received +/// (`[{content_hash, path, counted, transferred, presented}]`) and, where given, the +/// envelopes received (an array of `Uint8Array`): the signature and the class's rules, +/// the output tree, the consistency of the members the presentations give, the byte sums, +/// and that each decoder entry names what its envelope gives. `""` when accepted, +/// otherwise the reason (jwp-receipts §3.1). #[wasm_bindgen(js_name = verifyClaim)] -pub fn verify_claim(claim: &str, outputs_json: &str, objects_json: &str) -> Result { - verify_session(claim, outputs_json, objects_json).map_err(js_err) +pub fn verify_claim(claim: &str, outputs_json: &str, objects_json: &str, envelopes: Option) -> Result { + let envs = match envelopes { + None => None, + Some(a) => Some( + a.iter() + .map(|e| e.dyn_into::().map(|u| u.to_vec()).map_err(|_| JsError::new("envelopes: each is a Uint8Array"))) + .collect::, _>>()?, + ), + }; + verify_session(claim, outputs_json, objects_json, envs.as_deref()).map_err(js_err) } #[cfg(test)] @@ -676,7 +699,7 @@ mod tests { r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); } for o in &m.e.objects { - r.received(object_seen(envelope_of(&o.content_hash), true)); + r.received_envelope(envelope_of(&o.content_hash)); } let got = finish(r, subject, &seed, None, T).unwrap(); assert_eq!(got["claim"], want["claim"], "{name}: the page's session is the native tool's"); @@ -686,21 +709,73 @@ mod tests { let outputs = got["outputs"].to_string(); let objects = got["objects"].to_string(); assert_eq!(output_root_of(&outputs).unwrap().as_deref(), golden["output_root"].as_str(), "{name}: outputRoot"); - assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &objects).unwrap(), "", "{name}: accepted"); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &objects, None).unwrap(), "", "{name}: accepted"); + let envelopes: Vec> = m.e.objects.iter().map(|o| envelope_of(&o.content_hash).to_vec()).collect(); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &objects, Some(&envelopes)).unwrap(), "", "{name}: accepted with the envelopes"); let mut bad = got["outputs"].clone(); let d = bad[0]["out_digest"].as_str().unwrap().to_owned(); bad[0]["out_digest"] = json!(format!("{}{}", if d.starts_with('0') { "1" } else { "0" }, &d[1..])); - assert_eq!(verify_session(got["claim"].as_str().unwrap(), &bad.to_string(), &objects).unwrap(), "session_output_mismatch", "{name}"); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &bad.to_string(), &objects, None).unwrap(), "session_output_mismatch", "{name}"); let mut fewer = got["objects"].clone(); fewer.as_array_mut().unwrap().pop(); - assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &fewer.to_string()).unwrap(), "session_source_not_received", "{name}"); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &fewer.to_string(), None).unwrap(), "session_source_not_received", "{name}"); let mut miscounted = got["objects"].clone(); let c = miscounted[0]["counted"].as_u64().unwrap(); miscounted[0]["counted"] = json!(c + 1); - assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &miscounted.to_string()).unwrap(), "session_counted_mismatch", "{name}"); + assert_eq!(verify_session(got["claim"].as_str().unwrap(), &outputs, &miscounted.to_string(), None).unwrap(), "session_counted_mismatch", "{name}"); } } + /// A decoder is named only through the envelope's own capability or its fallback + /// (SPEC §4); any other `via` is refused before anything is recorded. A recorder that + /// does not hold the envelopes (told the objects' figures instead) can seal an entry + /// naming a capability its envelope does not give; `verifyClaim` with the envelopes + /// refuses that claim (`session_source_mismatch`), and without them cannot. + #[test] + fn a_decoder_is_named_through_its_envelopes_capability() { + let dir = "staged-measure-conformance/fixtures/still"; + let files = fetch(dir); + let m = measured(dir, &files).unwrap(); + let base = &m.t.bases[0].obj.bytes; + let cap = Wai::from_bytes(base).unwrap().capability().to_owned(); + assert_eq!(decoder_key(base, Some(&cap), true).unwrap().capability, cap); + assert_eq!(decoder_key(base, None, true).unwrap().capability, cap); + let why = decoder_key(base, Some("wai.audio.int_codec"), true).unwrap_err(); + assert!(why.contains("neither the envelope's capability"), "{why}"); + // Sealed without the envelopes, as a recorder told figures may seal it. + let (mut r, subject) = begin(base, host_of(HOST).unwrap(), [7; 32], None).unwrap(); + let mut k = decoder_key(base, None, true).unwrap(); + k.capability = "wai.audio.int_codec".into(); + let h = r.decoder(k); + let p = &m.e.presentations[0]; + r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); + r.received(wai::claim_receipt::ObjectSeen { + content_hash: subject, + path: SessionPath::Primary, + counted: Some(base.len() as u64), + transferred: base.len() as u64, + presented: true, + }); + let s = finish(r, subject, &"44".repeat(32), None, T).unwrap(); + let (claim, o, j) = (s["claim"].as_str().unwrap(), s["outputs"].to_string(), s["objects"].to_string()); + assert_eq!(verify_session(claim, &o, &j, None).unwrap(), "", "without the envelopes, nothing to check it against"); + assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone()])).unwrap(), "session_source_mismatch"); + } + + /// Integers from JS are whole numbers in range, read as given: never truncated (0.5, + /// 1.9, 0.99) or wrapped (2^32 + 2), the cases a review found wasm-bindgen's integer + /// types coerced. + #[test] + fn integers_from_js_are_whole_and_in_range() { + for (v, max) in [(0.5, u64::MAX), (1.9, 65_535), (4_294_967_298.0, 65_535), (0.99, u64::from(u32::MAX)), (-1.0, 9), (f64::NAN, 9), (f64::INFINITY, u64::MAX), (65_536.0, 65_535)] { + assert!(int_in(v, max, "x").is_err(), "{v} refused under {max}"); + } + assert_eq!(int_in(65_535.0, 65_535, "layers"), Ok(65_535)); + assert_eq!(int_in(0.0, 9, "x"), Ok(0)); + assert_eq!(int_in(9_007_199_254_740_991.0, u64::MAX, "unit"), Ok(9_007_199_254_740_991)); + assert!(int_in(9_007_199_254_740_992.0, u64::MAX, "unit").is_err(), "past 2^53 - 1"); + } + /// A browser session states its host as given, its workers rounded down to a power of /// two, and writes no energy figure. #[test] -- 2.54.0 (Apple Git-157) From c1494a57a082ce5807cba80ce0d4a96816ac912c Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 21:29:32 -0400 Subject: [PATCH 03/21] wai: a session's objects, layers and units are what its envelopes give MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The objects: no (content hash, path) is listed twice (session_object_duplicate), and the recorder merges a re-fetch into one listing whose transferred bytes are every byte. After the sums, an object is presented exactly when a decoder entry names it (session_presented_mismatch). With the envelopes, an object listed with a held envelope's content hash states its counted bytes, null exactly when it is not countable (session_counted_mismatch). Inert envelopes: an encrypted envelope, or bytes of neither magic, is refused as unreadable only where a decoder entry names it; one no entry names is a received object, uncounted and not presented. SessionRecorder::received_envelope refuses bytes that are not a WAI1 or WAI2 envelope at once (NotAnEnvelope), and received(ObjectSeen) is gone: an object not held is received_unheld, its figures derived. Layers and units: a decoder entry states first_unit. With the outputs and the envelopes, each presentation through a held entry is at the layer count its envelope gives (session_layers_mismatch) and of a unit it covers (session_unit_outside_object); a re-decode decodes unit - first_unit. The generator builds the model base as a four-frame WIV1 clip and the WAI2 rendition as a one-frame clip, so a verifier counts them and reads their units; the session vectors are regenerated, the pinned prefix unchanged. jwp-receipts §2.4.12 states each rule, its step, order and contexts. claim_verify.py agrees on every vector; differential.py adds random sessions holding a base's and its layers' envelopes and object defects to the random sessions. verify_measure_wasm.mjs requires the browser claim's build profile to be release. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 45 +- wai/claim-conformance/README.md | 58 +- wai/claim-conformance/claim_verify.py | 177 +- wai/claim-conformance/differential.py | 227 +- wai/claim-conformance/vectors.json | 2169 ++++++++++++++--- wai/extensions/jwp-receipts.md | 83 +- wai/signer-conformance/vectors.json | 12 +- wai/wai-rs/Cargo.toml | 8 +- wai/wai-rs/src/claim_receipt.rs | 24 +- .../src/claim_receipt/corpus/session.rs | 407 +++- wai/wai-rs/src/claim_receipt/session.rs | 213 +- wai/wai-rs/src/key_log/corpus.rs | 1 + wai/wai-rs/src/lib.rs | 5 +- wai/wai-rs/src/session_recorder.rs | 179 +- wai/wai-rs/src/stage_measure/session.rs | 14 +- wai/wai-rs/src/staged/claim_tests.rs | 27 +- wai/wai-web/demo/verify_measure_wasm.mjs | 27 +- wai/wai-web/src/measure.rs | 83 +- 18 files changed, 3097 insertions(+), 662 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index e2586356d..7b7801c3c 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -32,16 +32,41 @@ wire format may change and such changes are recorded here. fixture to equal the wasm32 evaluation. A session recorded the way a page records one is the native tool's claim byte for byte and commits to the golden output tree; the wasm32, native and Python verifiers give the same verdict on it and on its altered variants. -- **A recorder that holds the envelopes checks the claim against them.** A sink may hand - `SessionRecorder` an object's bytes (`received_envelope`): the recorder derives its - content hash, counted and transferred bytes, and whether any of its outputs was - presented, and `seal_checked` checks the claim against every envelope it holds, as a - verifier holding the `envelopes` context does, so an entry naming a capability its - envelope does not give never leaves the sink (`session_source_mismatch`). The native - tool's session over a title and the browser's `SessionHandle` both hold their - envelopes; `decoderFor` refuses a capability that is neither the envelope's nor its - fallback, `received` takes the bytes alone, `verifyClaim` takes the envelopes, and - integers from JS are refused unless whole and in range. +- **A recorder that holds the envelopes checks the claim against them.** A sink hands + `SessionRecorder` each object's bytes (`received_envelope`): the recorder derives its + content hash, counted and transferred bytes, and whether an entry names it, and + `seal_checked` checks the claim against every envelope it holds, as a verifier holding + the `envelopes` context does, so an entry naming a capability its envelope does not give + never leaves the sink (`session_source_mismatch`). An object the sink does not hold is + `received_unheld`, by its content hash; the recorder no longer takes an object's figures + as told. The native tool's session over a title and the browser's `SessionHandle` both + hold their envelopes; `decoderFor` refuses a capability that is neither the envelope's + nor its fallback, `received` takes the bytes alone and refuses at once bytes that are + not a `WAI1` or `WAI2` envelope, `verifyClaim` takes the envelopes, and integers from JS + are refused unless whole and in range. +- **An object is listed once, as its envelope gives it** (§2.4.12, the objects). No + (content hash, path) is listed twice (`session_object_duplicate`): a sink that fetches + an object again lists it once, its transferred bytes every byte of every fetch, as the + recorder merges repeats. After the sums, an object is `presented` exactly when a decoder + entry names it (`session_presented_mismatch`). With the envelopes, an object listed with + a held envelope's content hash states that envelope's counted bytes, `null` exactly when + it is not countable (`session_counted_mismatch`). +- **Inert envelopes are received, not refused.** An encrypted envelope, or bytes of + neither magic, is refused as unreadable only where a decoder entry names it + (`session_envelope_unreadable`); one no entry names is a received object, uncounted and + not presented. A page that receives such bytes seals its session. +- **The layers and units an envelope gives.** A decoder entry states `first_unit`, the + unit at which its object's first unit is presented. With the outputs and the + envelopes, each presentation through an entry whose envelope is held is at the layer + count that envelope gives — 1 for a base or a rendition with no `refines`, + `refines.layer + 1` for a layer (`session_layers_mismatch`) — and of a unit it covers: + from `first_unit` plus the span's start, the span's count of units, or the base's units + where a layer has no span or the object is a base (`session_unit_outside_object`). A + re-decode decodes unit `unit − first_unit` of the entry's object. `claim_verify.py` reads + the units from the integer payloads as `wai-rs` does, and `differential.py` adds random + sessions holding a base's and its layers' envelopes. +- **The browser claim is a release build.** `verify_measure_wasm.mjs` requires the wasm32 + claim's `host.build.profile` to be `release` and its target `wasm32-unknown-unknown`. - **The build profile is the optimisation level.** `release` is a build at `opt-level` 2, 3, `s` or `z`, whatever its profile is named, and `debug` one at 0 or 1 ([jwp-receipts](extensions/jwp-receipts.md) §2.4.8's `build`): a WebAssembly build diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index dbb2b8c0d..a8b352c72 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -35,10 +35,12 @@ inclusion at least: `{track_alias, group_id, object_id, content_hash}`), and, fo out_digest}`), `redecoded` (what a verifier that decoded presentations again found, `{index, out_digest}`, the index into `outputs`), `objects` (each object received, `{content_hash, path, counted, transferred, presented}`, `counted` `null` for an object -not countable), `envelopes` (each `WAI2` envelope the session received and any `WAI1` -envelope the verifier holds, `{envelope}`, its bytes in hex; a decoder entry naming one -as its `object` is checked against it, and the classical rendition is read from each -`WAI2` envelope by §2.4.12's rule) and +not countable, each (content hash, path) once), `envelopes` (each `WAI2` envelope the +session received and any `WAI1` envelope the verifier holds, `{envelope}`, its bytes in +hex; an object's `counted` is checked against its envelope's counted bytes, a decoder +entry naming one as its `object` is checked against it, a presentation through such an +entry against the layer count and the units it gives, and the classical rendition is read +from each readable `WAI2` envelope by §2.4.12's rule) and `stage_claims` (the wire forms of the `stage` claims it names). An `object` context may also carry the class its leaf is labelled with (jwp-receipts §2.2), in energy-measurement §2.7's JSON @@ -180,12 +182,14 @@ The vectors cover: A `reconstruct-session` claim (§2.4.12) is signed by a sink (key 0x44) about the entry object of one session. Most vectors edit one model session: six units. Four are a stage -set over a pinned base — the session's entry object, a `WAI1` envelope — refined to up to -three layers, with two late layer objects never presented; each decoder entry names the -object it decoded, so each layer applied has an entry of its own. One unit is decoded from -the first rendition of a `WAI2` envelope, built by `wai-rs`'s container module, whose -classical rendition the sink did not need. The sixth is decoded on the fallback path after -a switch and presented late. +set over a pinned base — the session's entry object, a `WAI1` envelope holding a +four-frame `WIV1` clip — refined to up to three layers, with two late layer objects never +presented; each decoder entry names the object it decoded, so each layer applied has an +entry of its own. One unit is decoded from the first rendition of a `WAI2` envelope, a +one-frame clip, built by `wai-rs`'s container module, whose classical rendition the sink +did not need. The sixth is decoded on the fallback path after a switch and presented late. +Each object's figures are what its envelope gives, where the envelope is held: its +counted bytes (staged-measurement §3), its length, and whether an entry names it. The vectors cover: - **Accepted:** the model unmetered and metered under `OnChipCounter`, each against every @@ -197,7 +201,11 @@ The vectors cover: classical rendition of two other video capabilities; a base forgotten under the record budget and decoded again with no layer sent again (`staged-conformance/`'s `record_budget`, its envelopes and the `stage` claim of each epoch as the sink's - observer states them), naming both epochs' claims and only the first's; output trees + observer states them), naming both epochs' claims and only the first's; the base + fetched twice and listed once; an encrypted `WAI2` envelope received and named by no + entry, uncounted, and inert bytes no entry names; a session holding its base's and a + layer's envelopes, and a layer with no span through which a unit of its base is + presented, with its base held and not; output trees of 1 to 33 leaves, half through a decoder whose replicate class makes it byte-exact and half through one checked for membership only, each re-decoded (the second with another digest, which is not @@ -231,9 +239,16 @@ The vectors cover: not held (`session_source_mismatch`); an entry object never received (`session_entry_not_received`); an entry's object, or an envelope held, the session did not receive (`session_source_not_received`); objects whose counted, uncounted or - discarded bytes differ (`session_counted_mismatch`); an encrypted envelope, a `WAI1` - envelope with no manifest members and bytes of neither magic - (`session_envelope_unreadable`); a second rendition of a capability the session decoded, + discarded bytes differ, and an object's counted bytes stated above what its held + envelope gives (`session_counted_mismatch`); an object listed twice + (`session_object_duplicate`); an object a decoder entry names marked not presented, and + one no entry names marked presented, the sums restated to agree + (`session_presented_mismatch`); an encrypted envelope, a `WAI1` envelope with no + manifest members and bytes of neither magic, each named by an entry + (`session_envelope_unreadable`); a unit presented at more layers than its layer + envelope or its base gives (`session_layers_mismatch`); a unit past the base's frames, + outside a layer's span or a `WAI2` rendition's frame, and through an entry whose + `first_unit` is moved (`session_unit_outside_object`); a second rendition of a capability the session decoded, of another media, WAI's own, a companion, a record, a parameter set, a neural codec, an unregistered string, or a text capability in a text envelope — none a classical rendition the session did not need — and a length one byte off @@ -245,8 +260,8 @@ The vectors cover: first and a second layer the claim lists as late and a first layer it lists as refused — a `stage` claim about a base the session never received, objects received that hold none of the layers it says arrived, and the forgotten base's session naming - only its last epoch's claim, which lists no layer, or presenting a unit past both - epochs' layers (`session_stage_disagrees`); a session context given to a `stage` claim; + only its last epoch's claim, which lists no layer, or presenting a unit, through a + layer it did not hold whole, past both epochs' layers (`session_stage_disagrees`); a session context given to a `stage` claim; and a `measurement` claim on an unmetered session, which carries no figure. @@ -365,8 +380,15 @@ sink states it, then given a defect or two in the body or in a context (units, l paths off by one, switches and missed presentations past their caps, a `null` deadline with misses, presences that disagree, decoder indices out of range, leaves moved between entries, entries out of first-use order, outputs dropped or changed, re-decodes that match -and that do not, objects counted otherwise, every acquisition class), checked against its -presentations, objects, WAI2 envelopes and a `stage` claim. Further session families: +and that do not, objects counted otherwise, listed twice or marked presented otherwise, +counted bytes that are not a held envelope's, a `first_unit` moved, inert bytes received +and named by an entry or not, every acquisition class), checked against its presentations, +objects, WAI2 envelopes and a `stage` claim; and sessions holding their envelopes — a base +of one to six frames and layers refining it at layer 1 or 2 over a span or all of its +units, or naming another base — with presentations through each at one to three layers, +within what each envelope covers and past it, entries whose `first_unit` is the base's or +one off, and objects whose figures are each envelope's or one told otherwise, listed +twice, fetched again, or beside inert bytes, the base held or not. Further session families: sessions that pass steps 1–5 against a `stage` claim whose first layer applied to some units and arrived late for others, presented at one to three layers, with objects that hold or lack the set's base and layers (both bounds of §2.4.12's check); sessions naming diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index f44277ce6..68debe5c2 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -38,6 +38,9 @@ sys.path.insert(0, os.path.join(HERE, "..", "oer-conformance")) import oer2_verify as OER # noqa: E402 (the OER reference verifier: grades + receipt checks) sys.path.insert(0, os.path.join(HERE, "..", "staged-conformance")) import staged_verify as SV # noqa: E402 (the strict JSON and manifest reader http_verify.py uses too) +sys.path.insert(0, os.path.join(HERE, "..", "staged-measure-conformance")) +import measure_verify as MV # noqa: E402 (staged-measurement §3's counted bytes, written from that text) +import int_payload_verify as IPV # noqa: E402 (the integer payload parsers; measure_verify puts them on the path) sys.path.insert(0, HERE) from cryptography.exceptions import InvalidSignature # noqa: E402 @@ -290,7 +293,7 @@ GRADES = OER.GRADES # §2.4.12: a session's host, decoder entries, switches, missed presentations, stage sets # and energy, the enumerations it defines, and delivery-telemetry.md §5's switch reasons. SESSION_HOST = ["profile", "target", "build", "threads"] -SESSION_DECODER = ["capability", "rendition", "object", "path", "decoder", "variant", "pin", "tier", "module_status", "leaves"] +SESSION_DECODER = ["capability", "rendition", "object", "first_unit", "path", "decoder", "variant", "pin", "tier", "module_status", "leaves"] SESSION_SWITCH = ["unit", "from", "to", "reason"] SESSION_MISSED = ["unit", "layers", "late_us"] SESSION_STAGE_SET = ["first_unit", "claim"] @@ -565,6 +568,7 @@ def check_session_body(b): need(is_token(d["capability"]), 2) need(d["rendition"] is None or is_int(d["rendition"]), 2) need(is_hex(d["object"], 32), 2) + need(is_int(d["first_unit"]), 2) need(d["path"] in PATHS, 2) need(isinstance(d["decoder"], str), 2) need(d["variant"] is None or is_token(d["variant"]), 2) @@ -778,8 +782,13 @@ def objects_seen(v): def check_session_objects(c, objs): + """§2.4.12 against the objects received: each (content hash, path) once; the entry + object and each entry's object among them; the counted sums; and an object presented + exactly when a decoder entry names it.""" b = c["body"] need(c["class"] == "reconstruct-session", 6, "context_mismatch") + keys = [(o["content_hash"], o["path"]) for o in objs] + need(len(set(keys)) == len(keys), 6, "session_object_duplicate") need(any(o["content_hash"] == c["subject"] for o in objs), 6, "session_entry_not_received") received = {o["content_hash"] for o in objs} need(all(d["object"] in received for d in b["decoders"]), 6, "session_source_not_received") @@ -797,6 +806,8 @@ def check_session_objects(c, objs): need((sums["primary"], sums["fallback"], discarded, uncounted, transferred) == (b["counted_primary"], b["counted_fallback"], b["counted_discarded"], b["uncounted"], b["transferred"]), 6, "session_counted_mismatch") + named = {d["object"] for d in b["decoders"]} + need(all(o["presented"] == (o["content_hash"] in named) for o in objs), 6, "session_presented_mismatch") def wai2_read(data): @@ -873,55 +884,157 @@ def envelopes(v): return out -def check_session_envelopes(c, envs, objs): +def counted_of(e): + """staged-measurement §3: an envelope's counted bytes, or None where it is not + countable, for whatever reason (measure_verify.py's reading of the byte rule).""" + try: + return MV.count_any(e)["total"] + except Exception: # noqa: BLE001 (every way an object fails the byte rule is "not countable") + return None + + +def payload_units(cap, p): + """§2.4.12: the units a base payload holds where WAI reads them from its format: a + WIV1 clip's frames, one for a WIH1 picture, a WIA1 clip or a WIS1 tensor; None for a + capability with no pinned integer format, or a payload not in its own.""" + m = IPV.CAP_MAGIC.get(cap) + if m is None: + return None + try: + if m == b"WIV1": + return IPV.parse_wiv1(p, None)["n_frames"] + {b"WIH1": IPV.parse_wih1, b"WIA1": IPV.parse_wia1, b"WIS1": IPV.parse_wis1}[m](p) + return 1 + except Exception: # noqa: BLE001 (a payload that does not parse has no units to read) + return None + + +def read_envelope(data): + """A WAI1 or WAI2 envelope whose payloads are plaintext, read: ("one", manifest, + payload) or ("multi", manifest, payloads); None for any other bytes (inert).""" + if data[:4] == b"WAI2": + r = wai2_read(data) + if r is None or not plaintext_v2(r[0]): + return None + m, lengths = r + o = 8 + struct.unpack_from("= len(rs): + return None + e = rs[d["rendition"]] + ref = e.get("refines") + if ref is None: + n = payload_units(e["capability"], payloads[d["rendition"]]) + return 1, (None if n is None else (0, n)) + try: + ref = SV.parse_refines_ids(ref) + except SV.Malformed: + return None, None + span = ref["span"] + if span is None: + j = next((j for j, x in enumerate(rs) if x.get("id") == ref["base"]), None) + if j is not None: + n = payload_units(rs[j]["capability"], payloads[j]) + span = None if n is None else (0, n) + return ref["layer"] + 1, span + + if ps is not None: + ds = b["decoders"] + for p in ps: + g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None + need(g is None or g[0] is None or p["layers"] == g[0], 6, "session_layers_mismatch") + for p in ps: + g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None + if g is not None and g[1] is not None: + a, n = g[1] + f = ds[p["decoder"]]["first_unit"] + a + need(f <= p["unit"] < f + n, 6, "session_unit_outside_object") decoded = {d["capability"] for d in b["decoders"]} total = None - for _, kind, r in read: - if kind != "multi": + for r in readable: + if r[0] != "multi": continue - m, lengths = r + m = r[1] i = classical_rendition(m) if i is not None and m["renditions"][i]["capability"] not in decoded: - total = (total or 0) + lengths[i] + total = (total or 0) + len(r[2][i]) need(total == b["classical_declared"], 6, "session_classical_mismatch") @@ -1411,7 +1524,7 @@ def check_context(c, ctx): if objs is not None: check_session_objects(c, objs) if "envelopes" in ctx: - check_session_envelopes(c, envelopes(ctx["envelopes"]), objs) + check_session_envelopes(c, envelopes(ctx["envelopes"]), objs, ps) if "stage_claims" in ctx: check_session_stage_claims(c, ctx["stage_claims"], ps, objs) if "declaration" in ctx: diff --git a/wai/claim-conformance/differential.py b/wai/claim-conformance/differential.py index 6096582f5..7aaa2f09a 100644 --- a/wai/claim-conformance/differential.py +++ b/wai/claim-conformance/differential.py @@ -25,7 +25,9 @@ reconstruct-session claims built from random presentation lists, around every ru their caps, a null deadline with misses, presences that disagree, decoder indices out of range, leaves moved between entries, entries out of first-use order, every acquisition class — with their outputs, re-decodes, objects, entry envelopes and stage claims that -reach their stages or miss them — +reach their stages or miss them, and sessions holding a base's and its layers' envelopes, +presented within and past the layers and units each envelope gives, with objects whose +figures are each envelope's or told otherwise — writes them in the corpus's format with no declared outcome, runs both verifiers' `verdicts` mode, and reports every input on which they differ. @@ -48,7 +50,7 @@ there is still a difference in the claim verdict, and is reported like any other listing marks it, since its cause is in the two OER verifiers rather than the claim rules. Those two are compared on their own by `../oer-conformance/fuzz_differential.py`. """ -import argparse, copy, io, json, os, random, subprocess, sys, tempfile +import argparse, base64, copy, io, json, os, random, subprocess, sys, tempfile from decimal import Decimal, localcontext HERE = os.path.dirname(os.path.abspath(__file__)) @@ -591,6 +593,25 @@ def session_stage_claim(rng, n_set, at_stage_1, signer, subject, late=0): return CV.jcs(sign(c, signer)) +def restate(body, objects): + """The session's counted sums and transfer restated from `objects`, as a sink states + them from the objects it lists.""" + body["counted_primary"] = sum(o["counted"] for o in objects if o["counted"] is not None and o["path"] == "primary") + body["counted_fallback"] = sum(o["counted"] for o in objects if o["counted"] is not None and o["path"] == "fallback") + body["counted_discarded"] = sum(o["counted"] for o in objects if o["counted"] is not None and not o["presented"]) + body["uncounted"] = sum(1 for o in objects if o["counted"] is None) + body["transferred"] = sum(o["transferred"] for o in objects) + + +def encrypted_envelope(wai2): + """The model session's WAI2 envelope with a `security` member that encrypts it: inert + (SPEC §6.4).""" + ml = int.from_bytes(wai2[4:8], "little") + m = json.loads(wai2[8:8 + ml]) + m["security"] = {"encryption": "mls-sframe", "kid": 1} + return wai2_with(json.dumps(m, separators=(",", ":")), wai2[8 + ml:]) + + def sessions(ins, rng, n): """§2.4.12 around its rules: a random presentation list — units with gaps, one to three layers each, through one to four decoder entries — and the session it gives, then a @@ -598,6 +619,7 @@ def sessions(ins, rng, n): base = ins.receipt("session_accept") wai2 = model_envelope(ins, b"WAI2") envelope, wai2_hash = wai2.hex(), SV.content_hash(wai2) + encrypted = encrypted_envelope(wai2) reasons = list(CV.SWITCH_REASONS) for i in range(n): # The entry object: a WAI1 envelope of one capability or another, so that an @@ -635,7 +657,12 @@ def sessions(ins, rng, n): source = wai2_hash if rng.random() < 0.9 else entry else: source = rng.choice([entry, entry, CV.blake3(b"differential: a source %d %d" % (i, j)).hex(), wai2_hash]) - decoders.append({"capability": cap, "rendition": rendition, "object": source, "path": path, + # Its first unit: the first unit decoded through it, as an honest sink states it, + # or one off; a rendition of one frame covers that unit alone. + used = [p["unit"] for p in ps if p["decoder"] == j] + first = min(used) if used else 0 + decoders.append({"capability": cap, "rendition": rendition, "object": source, + "first_unit": rng.choice([first, first, first, first + 1, max(0, first - 1), 0]), "path": path, "decoder": "builtin:wai@0.4.0", "variant": None, "pin": CV.blake3(b"differential: a pin").hex() if pinned else None, "tier": "decode-equivalence" if pinned else None, "module_status": None, @@ -656,12 +683,14 @@ def sessions(ins, rng, n): objects = [obj(CV.blake3(b"differential: object %d %d" % (i, k)).hex(), rng.choice(["primary", "primary", "fallback"]), rng.choice([None, 700, 1200, 0]), rng.random() < 0.8) for k in range(rng.randint(0, 5))] if rng.random() < 0.85: - objects.insert(rng.randint(0, len(objects)), obj(entry, counted=5000)) + # The entry object's counted bytes: its envelope's, or a figure that is not. + objects.insert(rng.randint(0, len(objects)), obj(entry, counted=CV.counted_of(base_env) if rng.random() < 0.9 else 5000)) # The envelopes held, chosen here so the objects received can hold them or not. envs = rng.choice([None, None, [], [envelope], [envelope] * 2, [base_env.hex(), envelope], [base_env.hex()]]) for h in sorted({d["object"] for d in decoders} | ({wai2_hash} if envs and envelope in envs else set())): if h != entry and rng.random() < 0.9 and all(o["content_hash"] != h for o in objects): - objects.append(obj(h, counted=rng.choice([None, 700]))) + held = h == wai2_hash and rng.random() < 0.9 + objects.append(obj(h, counted=CV.counted_of(wai2) if held else rng.choice([None, 700]))) stage_wires, stage_sets = [], [] if fin and rng.random() < 0.5: # A stage claim over n_set units from a presented unit f: its first `at1` units @@ -685,6 +714,10 @@ def sessions(ins, rng, n): objects.append(obj(base_hash, counted=4000)) if at1 and rng.random() < 0.85: objects.append(obj(CV.blake3(b"differential: a stage layer").hex(), counted=700)) + # Presented exactly when an entry names it, as an honest sink states it. + named = {d["object"] for d in decoders} + for o in objects: + o["presented"] = o["content_hash"] in named counted = lambda path: sum(o["counted"] for o in objects if o["counted"] is not None and o["path"] == path) body = dict(base["body"], decoders=decoders, units=len(fin), leaf_count=len(ps), output_root=root, primary_units=primary, fallback_units=len(fin) - primary, switches=switches, @@ -699,8 +732,9 @@ def sessions(ins, rng, n): body["classical_declared"], body["classical_source"] = None, None ctx = {"outputs": copy.deepcopy(ps), "objects": objects} # One or two defects, in the body or in a context. + inert = None for _ in range(rng.choice([0, 1, 1, 2])): - k = rng.randrange(26) + k = rng.randrange(31) ds = body["decoders"] if k == 0: body["primary_units"] += rng.choice([1, -1]) if body["primary_units"] else 1 @@ -759,6 +793,28 @@ def sessions(ins, rng, n): body["counted_primary"] += rng.choice([1, -1]) if body["counted_primary"] else 1 elif k == 25 and switches: body["switches"] = [dict(switches[0], to="primary")] + switches[1:] + elif k == 26 and objects: + # An object listed twice, or a fetch listed apart from the one before it, on + # the other path; the sums restated to agree. + o = dict(rng.choice(objects)) + if rng.random() < 0.3: + o["path"] = "fallback" if o["path"] == "primary" else "primary" + objects.append(o) + restate(body, objects) + elif k == 27 and objects: + o = rng.choice(objects) + o["presented"] = not o["presented"] + restate(body, objects) + elif k == 28: + inert = rng.choice(["encrypted", "bytes"]) + elif k == 29 and ds: + d = rng.choice(ds) + d["first_unit"] = d["first_unit"] + 1 if d["first_unit"] == 0 or rng.random() < 0.5 else d["first_unit"] - 1 + elif k == 30 and objects: + # A held envelope's object told a figure other than its counted bytes. + o = rng.choice(objects) + o["counted"] = rng.choice([None, 0, (o["counted"] or 0) + 1, max(0, (o["counted"] or 0) - 1)]) + restate(body, objects) if rng.random() < 0.5: ctx["redecoded"] = [{"index": j, "out_digest": rng.choice([p["out_digest"], CV.blake3(b"differential: redecoded").hex()])} for j, p in enumerate(ps) if rng.random() < 0.3] @@ -768,6 +824,21 @@ def sessions(ins, rng, n): if n2: body["classical_declared"], body["classical_source"] = rng.choice( [(700, "wai2-table"), (700 * n2, "wai2-table"), (701, "wai2-table"), (None, None)]) + if inert: + # Inert bytes received — an encrypted envelope, or bytes of neither magic — listed + # as an object neither counted nor presented, held or not, and named by an entry + # or not. + data = encrypted if inert == "encrypted" else b"differential: inert bytes %d" % i + h = SV.content_hash(data) + if rng.random() < 0.8: + ctx.setdefault("envelopes", []).append({"envelope": data.hex()}) + if body["decoders"] and rng.random() < 0.3: + d = rng.choice(body["decoders"]) + d["object"], d["rendition"] = h, None + if "objects" in ctx: + named = {d["object"] for d in body["decoders"]} + ctx["objects"].append(obj(h, counted=None, presented=h in named)) + restate(body, ctx["objects"]) if stage_wires: ctx["stage_claims"] = stage_wires if rng.random() < 0.1: @@ -811,7 +882,8 @@ def session_stage_bounds(ins, rng, n): for h, cnt in [(base_hash, 4000), (CV.blake3(b"differential: a stage layer").hex(), 700), (CV.blake3(b"differential: a late stage layer").hex(), 650)]: if rng.random() < 0.9: - objects.append({"content_hash": h, "path": "primary", "counted": cnt, "transferred": cnt, "presented": cnt != 650}) + objects.append({"content_hash": h, "path": "primary", "counted": cnt, "transferred": cnt, + "presented": h in {d["object"] for d in decoders}}) entry = objects[0]["content_hash"] if objects else base_hash ordered = sorted(ps, key=lambda p: (p["unit"], p["layers"])) body = dict(base["body"], decoders=decoders, units=n_set, leaf_count=len(ps), primary_units=n_set, fallback_units=0, @@ -898,6 +970,9 @@ def session_stage_epochs(ins, rng, n): # The refinement's entry names a layer the session received, or its base. layer = next((o["content_hash"] for o in objects[1:] if o["presented"]), base_hash) decoders.append(dict(dec[1], object=layer, leaves=sum(1 for p in ps if p["decoder"] == 1))) + # Presented exactly when an entry names it, as an honest sink states it. + for o in objects: + o["presented"] = o["content_hash"] in {d["object"] for d in decoders} units = n_set + 1 ordered = sorted(ps, key=lambda p: (p["unit"], p["layers"])) sets = sorted({(f, CV.link_hash(json.loads(w))) for f, w in named}) @@ -912,6 +987,143 @@ def session_stage_epochs(ins, rng, n): ins.add(f"session_epochs_{i}", CV.jcs(sign(dict(base, subject=base_hash, body=body), VIEWER)), ctx) +def wiv1(frames, keyframe): + """A WIV1 clip of `frames` frames, 16 by 16, built as the corpus generator builds its + own: `keyframe` its WIH1 keyframe, its residual stream filler that nothing decodes.""" + block = 1 if frames == 1 else 16 + nb = (16 // block) ** 2 + return CV.IPV.wiv1_from_json({"n_frames": frames, "h": 16, "w": 16, "block": block, "q": 1, "offset": 0, + "cdf": [0, 32768, 65536], "mvs": [[]] + [[[0, 0]] * nb for _ in range(frames - 1)], + "rans_b64": base64.b64encode(b"\x33" * 8).decode()}, keyframe=keyframe) + + +def session_held(ins, rng, n): + """§2.4.12 step 6 against the envelopes with the outputs and the objects, around the + rules that read what a held envelope gives: a base WAI1 envelope of one to six frames, + and layer envelopes refining it at layer 1 or 2 over a span or over all of its units, + or naming another base; presentations through each at one to three layers, of units + within what the envelope covers and past it, through entries whose `first_unit` is the + base's first unit or one off; the objects each envelope's figures — counted bytes, + length, fetched once or more, presented exactly when an entry names it — or one told + otherwise, listed twice, or inert bytes received beside them; the base held or not.""" + model = ins.by_name["session_held_layer_accept"] + base = json.loads(model["receipt"]) + envs = [bytes.fromhex(e["envelope"]) for e in model["context"]["envelopes"]] + whole = [bytes.fromhex(e["envelope"]) for e in ins.by_name["session_unit_whole_layer_accept"]["context"]["envelopes"]][1] + base_m, _, base_p = SV.read_wai1(envs[0]) + keyframe = CV.IPV.parse_wiv1(base_p)["wih1"] + one_m, _, one_p = SV.read_wai1(envs[1]) # a layer coding one unit + _, _, four_p = SV.read_wai1(whole) # and one coding four + jtext = lambda m: json.dumps(m, separators=(",", ":")).encode() + dec = {d["capability"]: d for d in base["body"]["decoders"]} + encrypted = encrypted_envelope(model_envelope(ins, b"WAI2")) + for i in range(n): + frames = rng.choice([1, 2, 3, 4, 4, 6]) + cap = rng.choice(["wai.video.int_hyper", "wai.video.int_hyper", "wai.video.int_motion"]) + bm = dict(base_m, model_requirement={"capability": cap}) + base_env = SV.wai1(jtext(bm), wiv1(frames, keyframe) if rng.random() < 0.95 else b"\x33" * 16) + bh = SV.content_hash(base_env) + first = rng.choice([0, 0, 1, 2, 5]) + # The layers: at layer 1 or 2, over a span or the whole base, refining this base or + # another; layer 2's previous producer the layer-1 envelope before it. + layers = [] + for k in range(rng.choice([0, 1, 1, 2, 3])): + lm = copy.deepcopy(one_m) + level = 1 if k == 0 or rng.random() < 0.5 else 2 + frm = rng.randint(0, frames) + count = rng.randint(1, max(1, frames - min(frm, frames - 1))) + span = None if rng.random() < 0.3 else {"from": frm, "count": count} + ref_base = bh if rng.random() < 0.9 else CV.blake3(b"differential: another base %d" % i).hex() + prev = ref_base if level == 1 or not layers else SV.content_hash(layers[-1][1]) + lm["refines"] = {"base": ref_base, "prev": prev, "layer": level} + if span is not None: + lm["refines"]["span"] = span + payload = one_p if span is not None and span["count"] == 1 else four_p + layers.append((level, SV.wai1(jtext(lm), payload), span)) + # Each unit at one layer through the base, and some at two or three through a layer + # of that level — one covering the unit, or any. + units = list(range(first, first + frames)) + if rng.random() < 0.2: + units.append(rng.choice([first + frames, max(0, first - 1)])) + ps = [] + for u in sorted(set(units)): + ps.append({"unit": u, "layers": 1, "decoder": 0}) + for level in (1, 2): + cands = [j for j, (lv, _, sp) in enumerate(layers) if lv == level] + cover = [j for j in cands if layers[j][2] is None or layers[j][2]["from"] <= u - first < layers[j][2]["from"] + layers[j][2]["count"]] + pick = cover if cover and rng.random() < 0.85 else cands + if not pick or rng.random() < 0.4: + break + ps.append({"unit": u, "layers": level + 1, "decoder": 1 + rng.choice(pick)}) + if rng.random() < 0.15 and layers: + # A presentation through an entry whose envelope gives another layer count: a + # layer's for a unit at one layer, or a layer of the other level, or the base's. + p = rng.choice(ps) + p["decoder"] = 1 + rng.randrange(len(layers)) if p["layers"] == 1 or rng.random() < 0.6 else 0 + for p in ps: + p["out_digest"] = CV.blake3(b"differential: held %d %d %d" % (i, p["unit"], p["layers"])).hex() + # Entries in first-use order, the unused layers named by none. + order = [] + for p in sorted(ps, key=lambda p: (p["layers"], p["unit"])): + if p["decoder"] not in order: + order.append(p["decoder"]) + for p in ps: + p["decoder"] = order.index(p["decoder"]) + decoders = [] + for j, old in enumerate(order): + if old == 0: + d = dict(dec["wai.video.int_hyper"], capability=cap, object=bh, first_unit=first) + if cap != "wai.video.int_hyper": + d.update(pin=None, tier=None) # no pin above its capability's class + else: + d = dict(dec["wai.video.int_refine"], object=SV.content_hash(layers[old - 1][1]), + first_unit=first if rng.random() < 0.9 else rng.choice([0, first + 1])) + d["leaves"] = sum(1 for p in ps if p["decoder"] == j) + decoders.append(d) + if rng.random() < 0.1: + decoders[0]["first_unit"] = rng.choice([first + 1, max(0, first - 1)]) + held = [base_env] + [e for _, e, _ in layers] + named = {d["object"] for d in decoders} + objects = [{"content_hash": SV.content_hash(e), "path": "primary", "counted": CV.counted_of(e), + "transferred": len(e) * rng.choice([1, 1, 1, 2, 3]), "presented": SV.content_hash(e) in named} + for e in held] + # One or two defects among the objects and envelopes. + inert = None + for _ in range(rng.choice([0, 0, 1, 1, 2])): + k = rng.randrange(6) + o = rng.choice(objects) + if k == 0: + objects.append(dict(o)) + elif k == 1: + o["presented"] = not o["presented"] + elif k == 2: + o["counted"] = rng.choice([None, 0, (o["counted"] or 0) + 1, max(0, (o["counted"] or 0) - 1)]) + elif k == 3: + held = held[1:] if rng.random() < 0.5 else held # the base not held + elif k == 4: + inert = rng.choice([encrypted, b"differential: inert bytes %d" % i]) + elif k == 5: + objects.append(dict(o, path="fallback")) # fetched again on the other path + envelopes = list(held) + if inert is not None: + ih = SV.content_hash(inert) + envelopes.append(inert) + if rng.random() < 0.3 and len(decoders) > 1: + decoders[-1]["object"] = ih + objects.append({"content_hash": ih, "path": "primary", "counted": None, "transferred": len(inert), + "presented": ih in {d["object"] for d in decoders}}) + rng.shuffle(envelopes) + fin = CV.finals(ps) + ordered = sorted(ps, key=lambda p: (p["unit"], p["layers"])) + body = dict(base["body"], decoders=decoders, units=len(fin), leaf_count=len(ps), primary_units=len(fin), + fallback_units=0, output_root=CV.out_mth([CV.out_leaf(p) for p in ordered]).hex()) + restate(body, objects) + ctx = {"outputs": ps, "objects": objects, "envelopes": [{"envelope": e.hex()} for e in envelopes]} + if rng.random() < 0.05: + del ctx["outputs"] + ins.add(f"session_held_{i}", CV.jcs(sign(dict(base, subject=bh, body=body), VIEWER)), ctx) + + def wai2_with(manifest_text, rest): """A WAI2 envelope of the manifest text (or bytes) given, with the rest of the session corpus's envelope: its rendition count, table and payloads.""" @@ -1618,6 +1830,7 @@ def main(argv): session_caps(ins) session_stage_bounds(ins, random.Random(f"session bounds {a.seed}"), a.random) # its own stream, as classes() session_stage_epochs(ins, random.Random(f"session epochs {a.seed}"), a.random) # its own stream, as classes() + session_held(ins, random.Random(f"session held {a.seed}"), a.random) # its own stream, as classes() session_envelopes(ins) session_wai1_envelopes(ins) session_classical_sweep(ins) diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index e64d52d2f..28dd24e1b 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -5037,7 +5037,7 @@ "name": "session_accept", "about": "an unmetered session: six units, a stage set refined to three layers, a unit from a WAI2 envelope whose classical rendition was not needed, a switch to the fallback and one late presentation; every context held", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -5113,10 +5113,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -5162,10 +5162,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -5178,26 +5178,26 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { "outcome": "accept", - "link_hash": "4b8be05ca08d4114e5da8c86dac9d4323872fdc4220fa08b795ffdb2768b4bfc" + "link_hash": "1ce61b7c6ee7a0a7057342bfd0fb55b90e67d84027d42da129fd1fe24879412b" } }, { "name": "session_metered_accept", "about": "the same session metered under OnChipCounter with its declared uncertainty and filtering state", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"280ba0067da0cfc8f8e2a01d9a3585b94710dde2fc0122e5b55e1a09b6b4d57978f6fe322948978e772a795f95cd1b4b5bc31c0477d72001ef4ce98d601e4a09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6785d661baa4e32f53a43679f5e9a70f08558490f445e3000ce9153a32238b76c4a09f3a797a7e5662df86cf9823906b6cecf7e2eae5b43bdd9378201469b702\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -5273,10 +5273,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -5322,10 +5322,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -5338,51 +5338,51 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { "outcome": "accept", - "link_hash": "e1ff3fc96640eaccc2049432a8a08bee5927fa08c98751848dc8d45fec035044" + "link_hash": "e3055bb90e81973a5cb22ffe4d6ca2c3e630fdf70031e97917235fa6c6038d21" } }, { "name": "session_no_context_accept", "about": "the model session checked with no context: steps 1-5 only", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "accept", - "link_hash": "4b8be05ca08d4114e5da8c86dac9d4323872fdc4220fa08b795ffdb2768b4bfc" + "link_hash": "1ce61b7c6ee7a0a7057342bfd0fb55b90e67d84027d42da129fd1fe24879412b" } }, { "name": "session_stage_claim_without_outputs_accept", "about": "the stage claim the session names, held without the outputs or the objects: only its identity is checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { "outcome": "accept", - "link_hash": "4b8be05ca08d4114e5da8c86dac9d4323872fdc4220fa08b795ffdb2768b4bfc" + "link_hash": "1ce61b7c6ee7a0a7057342bfd0fb55b90e67d84027d42da129fd1fe24879412b" } }, { "name": "session_path_sum", "about": "primary_units counts one unit more than were presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0f139b43f248a9ea5746988d371299811b4ac232562faceea5f66e5a08351d858b74fedd322c0619c4ad1253f197b13f963bbd48b4840eb491e861fe349f600a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"50c24586a950e2df2ffd1f261a065513a374a25ce7e9a31639e15d011a27cf1cafbc9bea0e3c5c660eda4a92a71bc61165785bc5d7a8a7f88cc78d6f546b3e09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5393,7 +5393,7 @@ "name": "session_leaf_sum", "about": "the entries' leaves sum to one more than leaf_count", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":5,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"29e66eca322e48c08213c706cbebd2549d00edc24870980ceae5109d332915d8015c72f99102227ed28146ad7ff0c27de54e2db2e988c12aec0cbc926ea41809\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bce13e8110022208301932012c820f238d3558e661ca5b91993f0b8eb8a3d7c3e1761cfae1761f1e3999bbfbb2522284a09656213141f21d9726c98a220c110b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5404,7 +5404,7 @@ "name": "session_leaf_count_below_units", "about": "fewer leaves than units: a unit counted as presented with no presentation", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":10,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":11},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"202c01e9737880fc58fec4cdaabd5c3e867d7840c2e331bb44b2f10532cd461885b645afde54cd1c15c1f64a22ea7e9bfce3c39f873002e4659827e78a631e0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":10,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":11},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f2ae457cf03f02b96f66178855533b6a2ab3bfb417f0db8a9b064cebdb453d6fb53b08c4f47cb500fbce4878d45b1c955c1da9bccb2e517337935403bc46fe06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5415,7 +5415,7 @@ "name": "session_no_units_with_leaves", "about": "leaves with no unit presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":0,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":0},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9229196f8c660265ba5e6c8a76cbb381370de971f088b2fc4e60adf26cb9f001b39d3ca41b6a1b3d2bb389629a6766d91cdc69dbeb8ea2e09bd5600a36a3af05\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":0,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":0},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"32415bdaf83382ee8aba47f6d1de4584d16bff645025ec939bbc4b486a4d738f6ea3d86d1c80ba7440f6bec99643383b4f82760ccd8653f3b32a66811da98a0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5426,7 +5426,7 @@ "name": "session_root_absent", "about": "presentations and no output root", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":null,\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"606b23f3d07dbff697f242bbe0c794158b7b8550b3092f4b63ae99c5a7a1725dc7a0f429fed4adce69ca8ab35af534508d0d26d449f56f50414202910a61510d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":null,\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2e06fb72de262db649010b17f644c7f697478ebeaa167112cd839059dae88f9dbc1ef9e7f6fe345fc660e626cb734a6eabddb43037be93d47486df924b171706\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5437,7 +5437,7 @@ "name": "session_root_without_leaves", "about": "an output root over no presentation", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":0,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":0,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":0},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"831d033160f917f5216e0e0b12841f60eda6f74ef6d5ec7f902725cbcd7ab845201d29208ae30972e7298b1fa75073dbb1730985ebe788ac726490ea78641907\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":0,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":0,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":0},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f2763ae07ffd386cd7a32a903c46016a7e9a7b97e11b6967c85d4cb65371eaa005f175b1661f293439421ce2aa9af3928298d18d5cc8bf3ffaac8a86bf621f0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5448,7 +5448,7 @@ "name": "session_threads_not_power_of_two", "about": "three decode workers, written as they are rather than rounded down to two", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":3},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f965cfc8006a73b6bd43a7e292a8f4791e7a25529d5e10586ade602cfc4aee581145a06442520cc1a77c0f744e696477cd84f0c0623bc3aeb0dc4fc60c0a2106\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":3},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c159036e37dc31c20f6e99c7e68f6a27d3fcb53ddf32625c728ddecf4977675fea60080160801b2a25000fb39738a54beb30006e0ade93459d3c95065ccf4006\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5459,7 +5459,7 @@ "name": "session_decoder_no_version", "about": "a builtin decoder with no version", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fcbabdd0d16fe75059b65b7ff22827c2adc5b9b07ff5e1aec17c187b51be90e517d349d8e5c6b9414ce8736669bf9fb3d95eb771c50518daf1b6a0a08be2c901\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7ddc0da3bfbe9eebd22a392fe8750ef3f8a8131568dd1a97c19e085106a532dc609803e182d60a686890042544926cedbf7b7b093e7a8ab2560198d729d1b808\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5470,7 +5470,7 @@ "name": "session_decoder_version_not_a_digit", "about": "a builtin decoder whose version begins with a letter", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@v0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1ff69e1dc47b21c4bc0f6be16c0a909e3211b04fc4d8e7c1e5857f7658f4400f0a6fd50439a6b3e118b9739241c93c873bb1ecb2d47525a1dab8916192a89e0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@v0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"966c2a9fd5d41d870e31000b6061b66214a6fc7ffa897d0587703a2e2b6dff8ede515eb03862ee6560d299092e8b606d7f9c1fc23571172cafcefdd7fe59210c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5481,7 +5481,7 @@ "name": "session_decoder_module_short_digest", "about": "a module decoder whose digest is 63 digits", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"module:sha256:7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164\",\"leaves\":1,\"module_status\":\"pinned\",\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b23addf5486905601d4b85214a1b8ef1eedbc216c54a28005b05a27df2b40f78909b26e957aa015b8caab665836f94770c83aa2961b0883f489f9e9266baaa0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"module:sha256:7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164\",\"first_unit\":5,\"leaves\":1,\"module_status\":\"pinned\",\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b70b88aa72ca264a1727e4c3543111d336caf78390f940f6d5c65fafd374e61dd708f214962d731a44fcdadd27ae8cd90332c1e4103cfa19d8faa001d853280f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5492,7 +5492,7 @@ "name": "session_decoder_tier_without_pin", "about": "a tier with no pin verified", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":\"none\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"99a0f38b424006dd665fddf45143ad47dcca245a4d46e2f91e8ec82cb8a106bab062d2534be1b9dff889928613389801fb1391ec0ea976f04a1f865257d98808\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":\"none\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3ea97f34745444f523890bc5bfce6f8aefa7818a85e0b89f6c061ba2a696d6c3b32ae6030d510295c511ea7dcedb05b4f3a807f2e2e0f03cd31b9f07da514800\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5503,7 +5503,7 @@ "name": "session_decoder_unknown_tier", "about": "a pin whose tier is not a tier of SPEC 3.1", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"bit-exact\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3e3b7473db45e38dada3cf8ca6b0914eff8b68542e7fa1b004fefd9c2f2e5d6ef88a07192a1a813e5ae9c7c79ac018b87d68fac8becc7f6b8f0920b396d43404\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"bit-exact\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e0ef9239cf2f331c80edf3a703e7e260c7c2825c15e8f1c15b2bc52bd4571a6cc73624ecd8319656763b55c4959dc4a69b5be1df173e50fbeae846c3ac1be007\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5514,7 +5514,7 @@ "name": "session_decoder_builtin_with_module_status", "about": "a module status on a builtin decoder", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":\"fetched\",\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1b9bb35bf9ead4231effca435ce1c9e8b5dc0e70ae8699630ad41f9c98004dccf00a0c38c927693f830fa81a1f9cbbe90bb273075f98f6c9538b98395131720b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":\"fetched\",\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8bab5f6752e36916d3304934a51f9027385d1b00c6d5722cb72725358e9e632b4b75c59ada025e5184039656181a49dc3a3bf21205b7598e63271ed0f455b105\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5525,7 +5525,7 @@ "name": "session_decoder_module_without_status", "about": "a module decoder with no module status", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"module:sha256:7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fb5fade1a4f4a9ade6df9a6c45931e045be157f36f188cd116719d4da66b26a4f23e94d9c4622ea7dcb3c13b2e8e33d2ef0f8c54984ebfebd2adfb6cc604820a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"module:sha256:7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1531395e8a8516ddc1effe543a74efe38aee4ee69f51089d8b8f07defe3e0085f6476f6d393ad0f0f9e52787b70ac169f478788193973cb998cfab02f4685b06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5536,7 +5536,7 @@ "name": "session_decoder_rendition_past_u16", "about": "a rendition index past 65535", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":65536,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e1e3a41c31dd60d043bb3efebd1310f9329380297ffb274f96c8beed41cd9620ad52b2238068e5df4548a1bfa8c35ae5cfb46b3777be837fe203a52bafafb20a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":65536,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"979f67f0d0adf1faa41e0ccadc31826caf26324d413f97d0aa5a6b50882ee65a62534fc38d0bb60621660a42a0118c5b7c2b1218e80fc6ecee7cd37f48c4c307\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5547,7 +5547,7 @@ "name": "session_decoder_twice", "about": "two entries that differ only in their leaves", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1ef3a93c3187525548d2754e12b7458e0b481353a9506663d6455ac98dca106ab99ebeaa9ee90afbadc91a869a01930df2bbbf8f32fec87c9c3b4870fac16909\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":3,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"99041ff0852dfbe051889202a12a988746511ce152843da17d305a9089fbcbce7086431a9f234f0ea0139ef589f5ad8e4576d1ed278fb092d5887f108c10ba0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5558,7 +5558,7 @@ "name": "session_decoder_no_leaves", "about": "an entry through which nothing was presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.avc\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":0,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"19139647273cce432bbac34010e4b19c72f53722dca7ef876e8e5d84cdb858e5fd51731c64e7a7ac00875d9d9f3e24f538af2535b2855182c417cc477fd7ca04\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.avc\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":0,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a3a13c661acb6b85810749dd0b8fc2e2305784675b03a9a5e879d4932b73f03dc1f0aacd65d30f50ebb2bbef97bf96f1a3cc4a5100e5cc0320d5c64d041f1f09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5569,7 +5569,7 @@ "name": "session_tier_exceeds_class", "about": "a refinement capability's entry pinned at decode-equivalence, above its class's tier", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1153c50b1cf61eab17ef00d40cd5355ffb59ce4cda9cb3e286aad8ad6bdc31d216e6b40901064f81ac03fccf3bcaee7e16433fcad3325d31a8c2d253fdb64002\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"809d8ca648c3c43080b9e64db6e5dad058bdae9b3a883da31015c8d98e3f6a896a88480b59814dd1162b7bd9627f4089078c0e67a745e4da7c9af162d7fb9404\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5580,7 +5580,7 @@ "name": "session_switch_to_same_path", "about": "a switch from the primary path to the primary path", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"primary\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"09cfcb9709ead6be7f42f95b500eb1e47fc30f3e5b5006744232d26084bf60dea3da4e2567859d896cbbf8d4ae9c146edb1ea242460047d07941406344bd850a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"primary\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"66d96d6b2dd5be3669cd56925871e369e808cdbf886e944558d5cd0eb0f776248a53feadcbac640b00449a0ac4e86d8b576598c4e9c56b0d3dc109e814ccd800\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5591,7 +5591,7 @@ "name": "session_switch_unknown_reason", "about": "a switch for a reason delivery-telemetry section 5 does not list", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"too-slow\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1086a42cb6986abb20d51dffa969238dc77cbd3232a9a178b29ef58e75437eb6a3289d2441e7955ca0023257bf9ddf7b66009700ebaf15ca0588189a122b5604\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"too-slow\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbbee3bc6bbd6da95d57c7b024a04e46c4510fe1c97ca5e7929ea6961b23d92688bdac4083d05d83c0beb635f0662ae6e1e670ae19fbcc43e922081a517c680d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5602,7 +5602,7 @@ "name": "session_switch_out_of_order", "about": "two switches in decreasing order of unit", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"fallback\",\"reason\":\"recovered\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":2,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fefea64cafc75c22ef10b613965fe27519800982d5efe97e6317c06e24699eb9ad41713cac4a144225433de2e758b645355d4c136bcd8fab6f65d65a6825a903\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"fallback\",\"reason\":\"recovered\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":2,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c9a8a27f1a627c79ba44508874905da246d6375e416834efa65dfc90fe536c006563fbdfbce41f9ad4104b74bb274ae4993d047253c38801dcd21e11b0a59303\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5613,7 +5613,7 @@ "name": "session_switches_above_total", "about": "one switch written and switches_total 0", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"57d7b0b3b097c76837cbb6f0e8e01654608ee66d5a6f87d0d77031e20695d4e05672c6f84a179e5cb73f04ee7a8110ebc19f62b451ae787c4bbaa69bc0c05602\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9e63cb04147bf69954278bb1b493c42f7b4658e0f329f8eaaa1d768e0922a60f0e2f1d14b09a446cad1ffb81f0dfe6b091544e7a8b1cdc81f5caa07050ac6003\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5624,7 +5624,7 @@ "name": "session_switches_below_total", "about": "one switch written of two, below the cap: every switch is written up to 1024", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":2,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b7fe209fe3615d3276470584115e45d53a49b00071bbbe4763262719c3a746e4978bc4a0212a8c59953e4af55fd00d656a7719c19a0bafa693826f2a8b917402\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":2,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"609bd9ef74dc14dd8df9f42824aa93e33fe2e5d79f464f8eb9a3f454265c1724ac5ec72fc60dcbfe2025186d38e26804d90b1a4fddb803b95abd0c1a65e25905\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5635,7 +5635,7 @@ "name": "session_missed_without_deadline", "about": "a presentation counted as missed with no deadline to miss", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f5183ff5f857eb59bf943a23d24867350ecc027dbee204da864e21f61f4575770c14a8504e1559325e199826768f72b7b133e51e9937c8a75f555f14c7f97a09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c12a74692569f4c45ec91ad36cd55edc3022acc1ccef51297b57a684a610cb4a9b09ba587272447927223f670d1d889c39ac8f88489ef14cfdc43d450f8f0a08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5646,7 +5646,7 @@ "name": "session_missed_above_leaves", "about": "more presentations missed than presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":11,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bfad743dd6c791f409601c96ddbad1a57de0121421eb1fd132e5c37d59fd3cc0ce4cd42bea7e067495918d720055e2ce1965afb50d7237add3b65574b432eb0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":11,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a16dab0a603bd7d7018e8b6253ecaf02b9f7aacdd3f7dcf0af104250e59749ef7348e6b781028037a303836bd4d39547275100cc130fffb93ebf316443d51700\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5657,7 +5657,7 @@ "name": "session_missed_units_above_missed", "about": "two missed presentations written and missed 1", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":10,\"layers\":1,\"unit\":3},{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e74826fa218a665f4673247290472006edc262c3b7fdca0fc1ce72bf92ab452699ab8ebbeaca104b772c9997c94c437720c959c5154fcaca29d90e6f2dbcb608\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":10,\"layers\":1,\"unit\":3},{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"992e124202b34fc8d9799ca3f30800b9bf9d69bfdd3a2f54e402e15c55038b72ae006766542cf1596ca733512b877d966a061fc82264af9a7f7c124ad826e50f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5668,7 +5668,7 @@ "name": "session_missed_units_below_missed", "about": "one missed presentation written of two, below the cap: every one is written up to 256", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":2,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"35a25d6d700d58e1409d3642055e841691c2d2a31b97ac673e1f224bcb354af337dd6c2ed62a31e208f4c341eaa8e089dfa384b49473062086f3a97e70d4c208\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":2,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c5673645c8f6bb40c0f32d8b0bd7330b29acac95521693df8c0a97b668a84418663460914d374b1a44395db27fe685806e7a6d28c30e0b9c905d3139e32cf00c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5679,7 +5679,7 @@ "name": "session_missed_not_late", "about": "a missed presentation zero microseconds late", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":0,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c36f47adae17c3b7ea35506028b68bf81b26c316b8c27859fdb18711a3e9357b26ba8e0db167db60a66e2b30b42d8079d2ed441eff1fc8b32bddb109f2d7d80a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":0,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"77638b27ebf3f706dc6f819d9ada216a66c4f711898b01ee68ecff93e251fd54cc88ea18d9486adef59b96c4446e11a4ed90590d6f15091bced3e9e86b67c30c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5690,7 +5690,7 @@ "name": "session_missed_out_of_order", "about": "missed presentations out of order", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":2,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5},{\"late_us\":10,\"layers\":1,\"unit\":3}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"58537dab04a66ac69acf53f3ada286f7b424750e39fce096c7af97be2cafcbdc8d0a5cfad3eb5bfa208f78f9b00174dd143bc4dcda268593bbe58eff2001f90a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":2,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5},{\"late_us\":10,\"layers\":1,\"unit\":3}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ea7721ab058f50d6a5831faceb15c82e297cff9108669be837349ea9d216f3698b786a8b0a05adabb7d1668d4895d2b2cd175309f49a3f23f5ba4cf08d61ab02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5701,7 +5701,7 @@ "name": "session_stage_set_twice", "about": "one stage set listed twice", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0},{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f5f7208147a6fc221ddc12b0f0a633c734f39becd6ad5ea1617ce268047bc9b219d7ad1cd5d1a6411e1f01521700c00f5dcc8cbbf8a2b6a64566f3f9e3075203\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0},{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"092e03997e4302f9ad29833a084ef28573776693edca3c3c341c53fb727f907fe314b00f3cfac5e8660772ad6e3e9cdbf7f7c65457eb07003f79bcc47f886105\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5712,7 +5712,7 @@ "name": "session_discarded_above_counted", "about": "more bytes discarded than were counted", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":10608,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5ea86108110d3ec94d48aa78e8664eb26c9d22f181a35c5b6ea7f735c634e99bbd48e2275f9132005572b55a6e7df82142d8dda3cd35319c3cb636ccc0a76305\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":5936,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dcb2430da9824ce358404becf54b919b4eafd9b37820d0bd89ec10d5e3d096c58d62ce50d2cadf2c15578fb7321dc6abf3064fec0a4d772e474910721e0c0c0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5723,7 +5723,7 @@ "name": "session_classical_without_source", "about": "a classical length with no source", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":null,\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c01dc4bcd3d1adb9bc769214027dce64a0b5a5b8158502d29b47971913a30927acb3ef1abbc32090d11672acda484fd4949a7789731721557c9c5d4a29f59e0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":null,\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f22bf350251927eee947170435ac44840db82bfeaf88cd2d862eadb5f25df7692499a574c2d4b86520c75e2f937f9d06ac9daf2b57f1027374dba1003f50a10c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5734,7 +5734,7 @@ "name": "session_classical_source_unregistered", "about": "a classical source no extension registers", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"referenced\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bfad0554a2757f5207e7a075fd7f8a2c216137be0964a8d471e464858fdc52d24652e902dd5f562c456656ebddc05ac443b5a7d1b70d876f9bf55c4d10b90504\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"referenced\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c2b61ba9d669404be55c26f764e833255f0b35c816113f499ef53c4ab8aade5ba7eb35d7fdbc8d81fd9429c5824d181beb9aa7cb7915004c3317f1b4be7a5901\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5745,7 +5745,7 @@ "name": "session_energy_zero", "about": "a decode figure of zero: the unmetered session is energy null", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":0},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2c608b96717f1f41e3f21ead3989a0760763954c9a362d3cc8ee1b6d7c67b39ebce052fa99f8aa63f5f0eb8caa0e7fe6702f6248284ef7dc8b0145c35d770408\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":0},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cc0775dbde7bd8a65b0bc9b985eb5763b5b8f34499dc45e1519ed66b8a73e7024eada6e7d375c64ac74087a117f893e045d376a8846ab0591245dcfa88b4ca0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5756,7 +5756,7 @@ "name": "session_energy_unknown_acquisition", "about": "a class energy-measurement section 2 does not name", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"Measured\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5bfddf25d28d535b41339dcc3ecd0962c9eab6849b4a96f34bdb8dc7e735f72970cdb79c790d74237c8ca237315afbd9712f30b2dd7dfc0eef03aa1c8fff1f0d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"Measured\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cbcd122a78c2f441b5f31e799c8e04f291a42037714d47c8ffe257323079e0724db6a0862e69b48a00431d176b42b8661ce8dc3aa6c5caafef3fd18fd72c3108\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5767,7 +5767,7 @@ "name": "session_energy_legacy_acquisition", "about": "the legacy HwShunt", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"HwShunt\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"be7dab46b406c0e8e54f29991b6cb5e903b2f4f96f8bfac7572fed1ae1dac621f2fcd5464c705f67a7a304f89c08cef08a33c3459da838cb3fae71dd75ae8c0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"HwShunt\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"66d2812be88295556be4acada9543b99050cbaccc8b0033a6efd8f04fc2040fd60b964f03b08c693fdd8c7c945dba4ec1829fd28faf592aaeb8fa96984311a0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5778,7 +5778,7 @@ "name": "session_energy_no_uncertainty", "about": "an OnChipCounter figure with no declared uncertainty", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":null,\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"65e094b79f83fdd4d525d3c6d6490f1d89107f054cdf6683c3e977007b005f46fecd745fd2541cc428dd2285ceaefbdb573c4f6c7c4565a5f17ccf837e223508\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":null,\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"193ca0fb70b27f4e9f81afd0ab91b16536563a8b4bb4727ddf0addf8efeec2eb4367b9560e988ebe7ce40fef431e74457ae047101c2f8f1cb5d19d56f0ba7c00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5789,7 +5789,7 @@ "name": "session_energy_below_resolution", "about": "a 1 microjoule OnChipCounter figure declared below the resolution floor", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":288675,\"window_us\":1000000},\"joules_micro\":1},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"123bb3522807c5044f5a147118fc907ad6756935e66655f3af2ecfe4523f90cec503c90553e336d42f5a27399ecb9d9a27d249959a0566ef7ad6e72db72fe201\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":288675,\"window_us\":1000000},\"joules_micro\":1},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"177b3c34523ea98178a4d5443d228eb9bd3f1c6ee03c676e9a415baea34b8b6c8deaab3cd4f97d18d664d661d1644e17bc1bf038a495dae3ff7fede2a2603201\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -5800,7 +5800,7 @@ "name": "session_about_a_receipt", "about": "a session whose subject is a receipt", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8543bdef3ce490366dc0ea9155256880ff0359863e2bb2c517ae3d76b3a8046f921c72e1bd8e104fff85513e76ad0e66661561ede4b7f3bcb22d8ff77714f90b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"receipt\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"85722af6839a1da621f271e9623a21d4c39999fec191260daa18c9d99d5c836e9fd17c54d6ae2b1722be39693884cd87c114c6d7d10deab3aac729f4e1407900\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"receipt\"}", "expected": { "outcome": "reject", "step": 1, @@ -5811,7 +5811,7 @@ "name": "session_missing_member", "about": "a session with no uncounted member", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cfd04ecd5aaba7ae98db9aa951fb500fcafdff8542cdba39ceb867d62f5ee70b74866099206a5d3c5ab08b7abc74eb739d6a6b203a91e20c5e1f162995655703\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"08125e32541a809f76ca6538b1ae8a7deff75bbbb1ed3d9a76e37ad8ec59d44afeedc97646774ce4e540c6965fd06d61126436e259a3cbca106df83fd1270a09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5822,7 +5822,7 @@ "name": "session_unknown_member", "about": "a session with a member the class does not define", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"refinements_missing\":0,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f8aa4a9c83e79db32a80942bce5e39749f3545f579392cebc336f540d20638b58b51ac50d004952ff377271d78056754ff284d3f45138b7a820f05a5f99f070a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"refinements_missing\":0,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fdcf87fcc951caaf72471957dc864b892fbe2cf450aaf422a5ce4937f315edf53a9356f40eb94af306b6bb87d68bc0d0897944be067c1266c050aa0520434d08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5833,7 +5833,7 @@ "name": "session_media_uppercase", "about": "media with an uppercase letter", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"Video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0c852c744cff648e22c7f147adcaffc5238811dd4c61af62ad82af4dbc0448aa87d46f2b82b387f57aeed0ee20f87bd55185dffa722bbc853b030987c085410d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"Video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7e27be1ad1df0060b986ac7c084c8d03ee10f4f2e57e46e78d951ed929a6d3ee792ab9046d1ee9c7c4ee284af219bf53e69d64bccc8a1e88b6abb43da4d8a501\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5844,7 +5844,7 @@ "name": "session_framing_unknown", "about": "a framing label this revision does not define", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"wai-measure/0\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9149a91898f9588fc2b38f0c5fda3f4ae70aab4631a51ffa567944edfc83847776fb66dfaf5ec408b6e0e5e94e37d95c10e26b32a22a0d9cd89cfd7c15be0609\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"wai-measure/0\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"21008c41a8ac4c96444158409eaba43c61d1bf730157a9ee94de897d664115d0f16efe1baccd110c6a2c5f676f507996c7e21d635413babc12104e43e88cc000\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5855,7 +5855,7 @@ "name": "session_host_profile_unknown", "about": "a host profile outside its enumeration", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4e14821e5264cb3893893921de2ed602e25c16d9ef9c6a1e6b041465100ece433edc58b43a64219151bbe800f6341013abb3483693448e5f41a369bd323db506\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"639618d0924ca59dc2fa65420fa108b75bf294aa98dcb73ceff7b8ed36eecb5355c5607ce1e6e49e6ca6e8bd8d9d6b093dd33c0bb575b74bec02713ccc12cf0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5866,7 +5866,7 @@ "name": "session_decoder_path_unknown", "about": "a decoder entry on a path that is neither primary nor fallback", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"secondary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dd1d34e16a275b22d1f29a733ea7af206a12f581ac1f5702c7fcdd6cc7d69f186130dcb1c6709b1711e87d6e3bbbe2db1b5bfc830a53fc4d68bb9d5b599aaa03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"secondary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a2908cc9968581874484a988465158fb00e9da5d9ba68378ffe45ecdb0ce7ea8affd2fde012b8478a07bd0c451021a28e55bb7c4216577eb0b1cefc1e33e520e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5877,7 +5877,7 @@ "name": "session_decoder_entry_unknown_member", "about": "a decoder entry with a component member, which the entry does not define", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"component\":\"c0\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7a6c9d48e10abf7ac75df0f6cd2d8401b227312fdfb87149d418074f2c5d197cbae115421c731382a575ca102de20bf0c68ef911e18cd41f3817f6b877985d07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"component\":\"c0\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"df9fffbf9d8d7df500ab08dce4fdbdef8720364ec4a6bc109937b5e9e5a2859729843b60071c7188016bcb389f9a22aca8ba0c5c12479a1dd5e98cd67e393004\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5888,7 +5888,7 @@ "name": "session_count_as_string", "about": "units written as a string", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":\"6\"},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ccb72c06182900e7f0b7b59f8a23e13cadfc2a6539279ba0567a62e53b8aea676b06562af428e8ab16212dc05c7f27014b1a722fb86f26d4491efd9eb50d9f0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":\"6\"},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"71b6c6b3245ac2efe5c659f682ae3cbe5afcfdf16d808a841e6fb2b1da5634dae6027c0012b900f753d006c941905b5907c13aa8a9aad8004cefcb1e8c29e90b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5899,7 +5899,7 @@ "name": "session_host_read_before_decoders", "about": "a host profile outside its enumeration and a decoder entry with no leaves member: the host is read first", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4c42c521554358d6b36a30d6502516631cc134828ff6899d4e0ba38f97c38c51ba6d1a298ddf2fcacd3c2b040360a63458a7ffedc213ed5a4e524bbf3691ba0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fe18dccb04714aff59a6d3a3ab6e8b228fa01135f52fe50925ca8ca276f1fb78c74d14191fdec7a298dd079a5f2cc3f24c31c137e9a543e87b2fca6a09239105\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5910,7 +5910,7 @@ "name": "session_energy_member_missing", "about": "an energy object with no calibration reference member", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dfb836efc4beb9bd79d29c8b2c5bbba8a060d896b010bb93cb77a1e50708f5fc7656f0c78c7117406588bf008f2d875b9b069b4f4845fda37ce386db4fe9100f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"14d18108bf7e7309257611310f908c2211fe855aeb5d0e71797e68d6234a393ca8ae9e98d5eedc02edaca0bcedf74e1e7cfd255a4778fed8c94cd75146d60105\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 2, @@ -5921,7 +5921,7 @@ "name": "session_energy_rewritten", "about": "an unmetered session given a figure after signing", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"joules_micro\":9},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":null,\"energy_provenance\":\"ModelBased\",\"energy_uncertainty\":null,\"joules_micro\":9},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 3, @@ -5932,7 +5932,7 @@ "name": "session_output_mismatch", "about": "a presentation's output differs from the one the tree commits to", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6007,7 +6007,7 @@ "name": "session_output_one_short", "about": "a list one presentation short of leaf_count", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6076,7 +6076,7 @@ "name": "session_output_repeated", "about": "a (unit, layers) presented twice", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6151,7 +6151,7 @@ "name": "session_output_leaves_moved", "about": "a leaf moved from the base's entry to the refinement's: the sums still agree", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f7375b912944cc769161cff010c772ef8110f3e5198fe0f2f77f9001799844b458fed13837b935ebcd4ca370c0e4c58e4dcd6b970d1185d99fcbada4cda84f03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":3,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"337145a06c098c319cbc66c929d1cc6b4bdbe043fcf14c14fee09127c7bf97495d47379ca685c64a727df1e746bf479a2916016b4e0a816711e58fd002ba6109\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6226,7 +6226,7 @@ "name": "session_output_no_such_entry", "about": "a presentation naming an eighth entry of seven", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"fce4806576ddec91603ae0d6df8a0f31413c366b303b2843f6a0400d76705a02\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"825008c20e705a0f594d87a31656bfe954a1f6356ca7127a122196e47e6eff39170f8854dc9cdb144084f1c197fbdd30ae2081c309a8f5131405c913f51d7d09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"fce4806576ddec91603ae0d6df8a0f31413c366b303b2843f6a0400d76705a02\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"960518b5ab7519aa88206d2db7e83d482cfa50d15e3abf7369bb5ccf85a985ca2b153e9b56528f65316c375f41d1c8e7d3cb51c5f9a95e5462e7c3eabc39250a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6301,7 +6301,7 @@ "name": "session_output_not_first_use_order", "about": "the first refinement entry listed before the fallback's, which is first named earlier taking the presentations by layers and unit", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"3e6ba13727eaac6a81f2e5614f21c4ffb34b0effe6d7108639fd99fdc015fbb6\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4649ccc94f2fffcaf388f7075d45480b82837940b3bca1da6af7fec5e0bd990756a7356d8bdd284f1c772759b31f7d149f56622e54d58e6c3632ec7f41ec350c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"3e6ba13727eaac6a81f2e5614f21c4ffb34b0effe6d7108639fd99fdc015fbb6\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d5a8fc16530bf69498b61ef669fc79018c6c6b90ae8fbe23fb25b88ffc8c6ddf428c0fc516052cafa717f28c3eeca0064f0e18191b1f78eb38dc91ed6f573402\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6376,7 +6376,7 @@ "name": "session_output_paths_disagree", "about": "four units counted on the primary path and two on the fallback, where the presentations give five and one: the sum still agrees", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":2,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":4,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a30747bf7c6a91df5843b8fe4a818d68e22798c5177c4c5fd749bc0b7620cddb2868f5bedc7803f682f4b98d8dacfde458240eece082572a37428e6316354b0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":2,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":4,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1ffb288cd694a5c936372aafef98ea9b750e78b06a80a09e1127d73b4dc22fcf7ec533461f80b027d17772b61adfcf9bb0656e31b31984b850243edf9023b502\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6451,7 +6451,7 @@ "name": "session_output_units_disagree", "about": "seven units stated over six presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":7},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"26781a02a8a81569148863ee0e1d87dc28ad21ca9b00bf84395ecdc1c4542b6fa1b24cd6ce7602a52354223d0f9ec7287de346ee32d528316e7b5d7eaf394405\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":7},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"db4215a00dee4058bca6cdb935d4a29f5cc162a344dfa58b3cfe0bbdcaac5deb01eca39ba7f19cf20276a00f04857e18fab629aba34f57bac33bd48ca38e5803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6526,7 +6526,7 @@ "name": "session_output_missed_not_presented", "about": "a missed presentation of unit 5 at two layers, which was never presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":2,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ffb8599439190c18e6ba6098198c0d59ac00be121f03a4385db9080d4a22808e6454b845282f631447748cf08f9fa1ecf028cc000d18b958e00a78822fdcc80f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":2,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6f969d5dc9da2f2c9ed38ecc5c35ca15fca185d3c20c0cddf8733525aa18bd4b8a9f6f76083a2b82b1d62281807856bfe14054b8f8a224fb27534dc8fd3e2709\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6601,7 +6601,7 @@ "name": "session_output_irreproducible", "about": "the base's first presentation decoded again gives another digest", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6682,7 +6682,7 @@ "name": "session_output_membership_only_accept", "about": "the fallback's presentation, through a decoder checked for membership only, decoded again with another digest: not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -6755,21 +6755,21 @@ }, "expected": { "outcome": "accept", - "link_hash": "4b8be05ca08d4114e5da8c86dac9d4323872fdc4220fa08b795ffdb2768b4bfc" + "link_hash": "1ce61b7c6ee7a0a7057342bfd0fb55b90e67d84027d42da129fd1fe24879412b" } }, { "name": "session_entry_not_received", "about": "a session whose entry object is not among the objects it received", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f0d3848b9b0257c03a5938220f8abad4d867e9ed0a9a46f6dcddd58b7c3a2c1ca0aa078562e690cdb50e4ba965dd42e75747ea9300c8aa51bbdc9a7010ad2408\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"5fceaaa5e0db136969dde9510f90231f2639c52aab26e61930d050bed4085aca\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"138d2b9c74a7e532107f65ecf643ae51ba754c483883be91fa91ecac4c524a712f16975cc7ebb94ef0e397ce24624ffc93cb2bbf20d5dec5a0a7924920092b00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"5fceaaa5e0db136969dde9510f90231f2639c52aab26e61930d050bed4085aca\",\"subject_type\":\"object\"}", "context": { "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -6815,10 +6815,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -6840,14 +6840,14 @@ "name": "session_source_not_received", "about": "the objects received without the one the fallback's entry decoded; its counted members unchanged, so only the source is wrong", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -6893,10 +6893,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true } ] @@ -6911,14 +6911,14 @@ "name": "session_counted_mismatch", "about": "an object received counted one byte short of the session's sum", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -6964,10 +6964,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -6989,14 +6989,14 @@ "name": "session_uncounted_mismatch", "about": "the fallback envelope given as countable: one object fewer is uncounted", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -7042,10 +7042,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -7067,14 +7067,14 @@ "name": "session_discarded_mismatch", "about": "a late layer object given as presented: fewer bytes discarded", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -7120,10 +7120,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -7141,49 +7141,611 @@ "reason": "session_counted_mismatch" } }, + { + "name": "session_object_listed_twice", + "about": "a layer object listed twice on one path, the counted members restated to match", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":6835,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":10895,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bcc3e7acc4042ed87f9797514610f150caffcea8bb5f87e64407f5f2ad0abe490293bb8d5c672634410039f0b646a80eaf860083ee851bbdff4b7b28b972c402\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_object_duplicate" + } + }, + { + "name": "session_object_refetch_accept", + "about": "the base fetched twice and listed once, its transferred bytes twice its length; every context held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":10323,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9e719f2580af34265b31c39bd4430cdf2e5dc9db132caa34492adb9d674bf521b2af15f5178436ccb01737b94042a34d7f6f8ceaf6228652479af684dda79b08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "redecoded": [ + { + "index": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "index": 4, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 656, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "092ec273dd732cc9118a60f14fcb791c182b1362a0726b3583880adfb7534e2c" + } + }, + { + "name": "session_counted_not_the_envelopes", + "about": "the base's counted bytes stated 1000 above what its envelope gives, the counted members restated to match; the envelope held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":6935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"01bfa26008a777e74307b7a9fb3c9e6b512f98e76b476ac78097b874de525d507a5e5fe5b1f31110afedbf72bb7170a00605621420472f4c8eef0331c72a3b00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "redecoded": [ + { + "index": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "index": 4, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 1328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_counted_mismatch" + } + }, + { + "name": "session_presented_not_named", + "about": "a layer object a decoder entry names given as not presented, the discarded bytes restated to match", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":2804,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4648069d3f39994c7da3321532d218e555fe2a36ab7ed9e4d69c7729f8e644453470079194cc502cb52071e5e2a43ab6e4a91f4bf393fa96d77248f7874fca08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": false + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_presented_mismatch" + } + }, + { + "name": "session_presented_unnamed", + "about": "a late layer object no decoder entry names given as presented, the discarded bytes restated to match", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1001,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"53984dd2acaa7ccf350f81330d778a33f2586d69ca5a80af77bf5632eea8416308e3a21944e586c3152a28266dcec80ec095411361f7f43b24936f05751c8a0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": true + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_presented_mismatch" + } + }, { "name": "session_classical_hevc_accept", "about": "the envelope's second rendition, wai.video.hevc: a classical capability of its media that no entry decoded", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"a66eea0b283acbd09925e4fefaa13eea60a6df5e0c3a4030e414f02b6a913f6c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"23d6b2d3992527fdedfd39205d2e77ac87019e58b36fc7f1689ae666238246a6135ae7cf2dd08e9af86d5d355a84a329dce078a1cbadadf56db6fd1760c27805\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"5eb3ca01825b2e8df6ff066802af3a15683487fee85e6c7e9ab77e060c343032\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"95d6676dbd394097acbd9a0fe746da0738a327c9ab2461d00a464b87fff2f83ab2d7d5ed8d86c41dd549901e660800eb630d4c47852c1d4347f9f58da8f94f09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b70000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e68657663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b70000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e68657663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, "expected": { "outcome": "accept", - "link_hash": "21f5a8a9bce8e8e4f8e496239a0869f8e86c1c2470f1d75cd86d37bec699802b" + "link_hash": "abf17462918c420f64da68ad47bbfaf382bf9875fc4db3b2fce71ab868683f16" } }, { "name": "session_classical_av1_lossless_accept", "about": "the envelope's second rendition, wai.video.av1.lossless: a classical capability of its media that no entry decoded", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"c682fdee45202a768b23fb5d02ccfb636d1f3e7374f3fa3c76e6a7d0a10edb04\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1df6bfe0ba38a8989c8f445a8cbc0f8a713bbbd9d60552502b00991da4d500022da8db2434c79340deaec7555bc206891431b2cae2f3fb397980f35e95fe4f05\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"0743bd478cb9137a5397d5f6b657e248703ae02ffa601efc0aa5064ace3a0b3c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7ede0d028a4d5bf565516eb088412198bdeceddec72624f94583b0660c7a7cca28425b19713fb9357b326a984b023838ef5bc5b7717bc218dfcc2b0fe86ef209\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932bf0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e6176312e6c6f73736c657373222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932bf0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e6176312e6c6f73736c657373222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, "expected": { "outcome": "accept", - "link_hash": "faab34fd752384c886c82934aae68fbfc3cc9bed0541fecfdabe8c2d0cf74fb3" + "link_hash": "a6b4c660b1174dfbaa58401e0da10a9f3ef3928c4c6307ea6374dc381b271c47" } }, { "name": "session_classical_decoded", "about": "the envelope's second rendition, wai.video.av1: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"e9198500010ec05ea56a8f7064f8ce6de31e2918c006ec1ce0d1744b47d8e21e\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0fac111dd6401b7e6567e83a0bb5c404858b90718109b6df1c53ae4bff6853f3f54fb7474ad4b94cc6a985389f76ce51aa810cc6d7c2f3118366f07ef74c790c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"610b7fe4561c8d2480aa1a6eabcb66b5c0c717544527f621a2fedbba2619c577\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a9ca7910a3abb376f7a18934bd0eaa3a83b70a44e6f58160048f25d7c1168536918bbdaba3c3737e9a7c798dd4b2bf3f4fdadf66b8fe16a1be419afd580d0703\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617631222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617631222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7197,11 +7759,11 @@ "name": "session_classical_other_media", "about": "the envelope's second rendition, wai.image.jpeg: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"af6235240ce28d292c3e13358c41fd1e290475ba72f71f0bef76a3b16d93998e\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1970194563876f1e0d599468da7669742336c06e153147d0e8ea96cdc5a937e337da05ed4df198fa0f6f4f8687d8f1260b9897c8a8deae479a4e0ab72986b709\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"968f54a49a31fda2262b6cb83f69f0873433913b2bed55071b725af7d3ce805c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0cabaca08b15803b4aa2a2907f7b1a2204a401f6494ee83e43be0366afea4413169185207ef066a2d54d50f31f9abfe9f76c103abe8f6f3f2d5457558273fe0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b70000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e696d6167652e6a706567222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b70000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e696d6167652e6a706567222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7215,11 +7777,11 @@ "name": "session_classical_wai_native", "about": "the envelope's second rendition, wai.video.int_motion: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"d01adf1674a481e952c92171c043f27f9e73dc1cf608e1236f5f478207495300\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bcc2dfca2b3cb08243658e1d8197b3737f6e9c22d6c646f5cec42fc6b352c9b6a083b759d72f0ad7af7cea5395eb12b747c9e5911032abe8bb83886a18996504\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"7bf59652fb0b166d6d29651816e5dc18e83b732799b0de62e6c84fc316bbf86f\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6d4b2313ff0efda5fa8d0775a9d3466e56dccff6c2ef6b17743ba4048d1dd554c16b6ede0ff03903cba1c71696b087c4b0faa3f7340244036250ce2c09fdbd0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932bd0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f6d6f74696f6e222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932bd0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f6d6f74696f6e222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7233,11 +7795,11 @@ "name": "session_classical_companion", "about": "the envelope's second rendition, wai.video.lcevc: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"1a7c5789b334bafd64b46887f5fd1b5eb656f0f328903dce834200315d93ec66\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0f020b3477a814ea994abaf6a104977408f9d8c3a0284b986f448fd9269e2d43809d332f70a24e87cca9a3984491f0fa20dde3ae6de26755b5a8f58cb5cbe904\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"27a0c17fc22b9b8f24ea574d7ae4c100d0298cb923cd7a5fdd28e7720fffeb19\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0915b28c5445bad27985acdbc640aaa9e2d03eb6702745dd9408e361c55b68d2781abfdd7dcc6280fb5fcba86e88942ff98b3323253f92d18d694afe96c8430b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b80000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e6c63657663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b80000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e6c63657663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7251,11 +7813,11 @@ "name": "session_classical_record", "about": "the envelope's second rendition, wai.asset.provenance: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"36aefb32971f2f7cd141340e5bd2c967342dd0ee6383e428546b86bb6b5d2302\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c826c6d66facb79d49f380ebe3b29876b6d2db33d227825af82eeba22c45fa8c12b821139d818a6e7a73a780e1d3007c639144d7947ec3c681e3214272feb001\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"c8e41284fe490b212315c4d52391d20e1d25789b6f16c5dbe516476483633e0d\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"115a5e766ee1635636552a18491d39fde84afa0a5006245d86cc81047c5468123a252329572af43a3814679aa1430e2a24b9e42fa3fe61b6e9b311c2a995d604\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932bd0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e61737365742e70726f76656e616e6365222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932bd0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e61737365742e70726f76656e616e6365222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7269,11 +7831,11 @@ "name": "session_classical_prior", "about": "the envelope's second rendition, wai.prior.set: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"f71b2bb6fe63fd1d288ccab2c6a797572b428c9803bfdffd9a40813b130bc588\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"53c3c8017fbc45912dbfa01b97786b1cc7b9ba4db770f58e2b1dc3c281ac7910f2b2e392a358c2bd14989e15b3f7a730f181c885bfaf1714daa911a63d87e90f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"c7b554678afb314e307e182dc4cbdfe5f65b7e709dbabee9ad3b3f13162b3ab6\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0ca85f4c6bba53eb31596fbb57db63a494f2c8b30b5c08cb7564842ebb2e11f8f2f11f7bcaffb43d860124b1321b7d701e10e588bf0ef0561dac487a4ec4ca0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e7072696f722e736574222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e7072696f722e736574222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7287,11 +7849,11 @@ "name": "session_classical_neural", "about": "the envelope's second rendition, wai.neural.dcvc_fm: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"432792416ad8091a8dc09eaf8a1c2c81386dce7dc53d26613b784c4c06db9b71\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2c795f5942a0f3bef660d663f95781a94b880b6d1d9a961017a0015f80e8068999c0e3f14e9ae699a726649b42fe8f9bd210b7edb38138fb49a5c19163464a06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"3e4853634b272236903d10c004a39363336fb9de2e06d646776495e3ed1295e5\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"abbe24fc5d2c611a5e0949883c28a213e34d2923bd72ed443970c4014e2925b582a8257f112dee24f2926f77e7e8a4f4192e3fa99ed483028847ce5b06f05804\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932bb0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e6e657572616c2e646376635f666d222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932bb0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e6e657572616c2e646376635f666d222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7305,11 +7867,11 @@ "name": "session_classical_unregistered", "about": "the envelope's second rendition, org.example.codec: no classical rendition the session did not need, so no classical length", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"a06750f56d2bd1bc8927a066ad95be0531d4712c9928e594a8ecbe0ed4d869b5\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"de14a043c919885fef6a6026a840159562c94857afba5eddb6bed47da46bccf730a400f7f3a6edd3b8f18b8783ff5436cc15e936cee5eff2f0ad363167fc490a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"0097288dbb8b955072ea55d215243dca8d2936010298933ee544fc90b9feb5f0\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c77b860e85858d42b38ebc98663988853b9f8b9edbc8201532a4c2b64fbca64c8334b18c9eec94bd6133a367de52510d29fcdfb1fcf8f9c44fc245577ec62d00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932ba0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a226f72672e6578616d706c652e636f646563222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932ba0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a226f72672e6578616d706c652e636f646563222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7323,11 +7885,11 @@ "name": "session_classical_text", "about": "a text envelope whose second rendition is a classical text capability: text is never a classical rendition", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"d2fab468e70ade347575f5548f23196675c6936d693d54e7cc1265ffba7d5d8d\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dc9b9fb29fba12c90be29b6964d38fd4b379dd4ae9939a9fe0b55f2aedd6d67769b9bc84d32639d75b50b6062f3456949f3f5e0d136a36a9890007a9070fbb09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"05437f9be59819c5d818a30b1ae2a3fe2b09e9b25aad31b8d27c6d1ae81262a3\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"400e7a632612923fe3c8f2bef33575664d26640779feff69a100b5577555488358b5513e811e188e3f9c372a2805340258bfd9915a9f5dbc9c8bf9dcd3a29402\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b50000007b22776169223a22312e31222c226d65646961223a2274657874222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e746578742e7a737464222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b50000007b22776169223a22312e31222c226d65646961223a2274657874222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e746578742e7a737464222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7341,11 +7903,11 @@ "name": "session_classical_length", "about": "a classical length one byte more than the rendition table gives", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":701,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7f0e4003d42b7fff0e7f159e24b62c1670efb407394a475883ff7df56bd5f1b48208c74f100948566e9655855810673007fa38412395356c567c6c7da29d1a06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":701,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"edb4f2a18e5b3f9e5fe4ae3e33ea4f582d66fedcb4b500d645fb6a9e393b7845c2a05e60d39f844c1df63ba47f96fb79ecc041d3a50aa010c47d71ca2670c605\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7359,11 +7921,11 @@ "name": "session_envelope_encrypted", "about": "the WAI2 envelope encrypted: inert at every sink that cannot open it", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"38b04e09d7caf1e692401453afd875bd6e79b906d7ae2b4c6a2708fa03e12fe4\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"21ac22fbe459b2add6b0d8c68adc440012a966a5d51f6f325c999405221ad800f72b480bdc59fcbce7320398805196b3166f75e1613b5dadd59f174e4f741c02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"645e21c03105a434c53b0c0b2da54576bc3a42e4186703df7bf67171c12a6cd9\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3eb85f501060ba5f57ee04ae0781b722a3a1bd8a2dfbbfce347188558ff89ca9ea8961bfdcae5ccc063584f4d7640deee7292feaa6bc6d6f8c28394fef90060b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932e50000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932e50000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7375,16 +7937,16 @@ }, { "name": "session_envelope_unreadable_wai1", - "about": "a WAI1 envelope whose manifest has none of its members", + "about": "the base's entry names a WAI1 envelope whose manifest has none of its members", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"5aaf65b40b625d24259c31acbdd3fce8f70e96f60fd64a2d0fec2c5f5b69d924\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c025b21175160922e3b427bd2780d3a4892384d61881ad4285883133a5d531f1fb78e2da7cd47b66d09e6cbb9a4f2955fb3a9b7b1b220142030af526b8f5f50e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { "envelope": "57414931020000007b7d00000000" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7396,16 +7958,16 @@ }, { "name": "session_envelope_neither", - "about": "bytes that are neither a WAI1 nor a WAI2 envelope", + "about": "the base's entry names bytes that are neither a WAI1 nor a WAI2 envelope", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d5815835c3f78ad707748a40a2a885f7a4923cfde327713196569d58bb8d2dc8\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a8c8720b721f7121f0d39fd3464cd14bfd1ffa2c63eeb78f9eeb7c5fdea778dc5c9d6346ff5f713a57db13f293a6f95735e53f23d523e4dacd9d960d36700706\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { "envelope": "5741493300000000" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7416,27 +7978,891 @@ } }, { - "name": "session_no_classical_accept", - "about": "a session with no classical length, beside an envelope whose second rendition is WAI's own", + "name": "session_envelope_unnamed_unreadable_accept", + "about": "bytes that are not an envelope, held and named by no entry: an inert object, nothing to read", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"d01adf1674a481e952c92171c043f27f9e73dc1cf608e1236f5f478207495300\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3292ef4d7a24158375de7527971742e20bd929d3d57a19df7a309870e910f535eb5e6e26b414e4ab0ee510d0dd3b90a6f16f54c8247cee50a9602b807251450b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [ { - "envelope": "57414932bd0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f6d6f74696f6e222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "5741493300000000" + }, + { + "envelope": "57414931020000007b7d00000000" + }, + { + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, "expected": { "outcome": "accept", - "link_hash": "265edaebc7021b14b6eda920541e793d1d1487522b3fe881faca0cabc1296a4b" + "link_hash": "1ce61b7c6ee7a0a7057342bfd0fb55b90e67d84027d42da129fd1fe24879412b" + } + }, + { + "name": "session_envelope_inert_unnamed_accept", + "about": "an encrypted WAI2 envelope the session received and could not open, named by no entry: listed uncounted and not presented, and held; every context held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":11102,\"uncounted\":3,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8c1629a4d0b808c8ecbba5a9ad9ed22ef7cea2fef77caee5b4d430f04b70dd2b150803f0e5342eb45f86e919858b2e4f2861c96b502575e50487b9051fcb740c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "redecoded": [ + { + "index": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "index": 4, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + }, + { + "content_hash": "645e21c03105a434c53b0c0b2da54576bc3a42e4186703df7bf67171c12a6cd9", + "path": "primary", + "counted": null, + "transferred": 1107, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + }, + { + "envelope": "57414932e50000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "4298e3350c1e2fe6bd6b298827cf537b75e63c5c54ca3fd35f946ff21e68de2a" + } + }, + { + "name": "session_unit_outside_rendition", + "about": "the WAI2 rendition's entry states first_unit 3, so its one frame is unit 3, and unit 4 is presented through it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":3,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e03b95b91bb526c459cc8e155aee6748ad5376270ef6adc66785086a916cedc158e8d42d7f38072a4d23598f680decbf5e47d0c0a2e1767bf50b48a57e15510d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "redecoded": [ + { + "index": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "index": 4, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_held_layer_accept", + "about": "a four-frame base and a layer over unit 1, both envelopes held: unit 1 at two layers through the layer, each unit at one through the base", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f2c69965bbb39efe75e25a9c80452609d2b5cc1b9186b3523c7b27e5373b0e7de631cdd7196fc609b9aaf1d75d7cc3d2de174e1a3b3ad9ee88279dc360883b06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "4600352eca713726b07f322c76426963d7f2d081338b7a97b0b100e7b8c75f26" + } + }, + { + "name": "session_layers_past_the_object", + "about": "unit 1 at three layers through a layer object whose refines gives layer 1, so two layers", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"5439e29b94cae585f4b2ad2e64b837e829c8c702f9eb4b14a83c7f0d80847437\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1c631f8b7b14b966dea54c9360a9705b0db70d87d7ef93c8ab140925e0c6d2d98e4284b9d133d2e1f0d891d0be6772cac7596d94925aca83d16c2d8345601f01\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 3, + "decoder": 1, + "out_digest": "f422310242ff0aa741c4ac2b87de241b27cfb625307225ee151e243c6386c647" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layers_mismatch" + } + }, + { + "name": "session_layers_base_past_one", + "about": "unit 0 at two layers through the base, which gives one", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":328,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"d5fa5ebe512950587b520c455ce2d64499b63d1914014af0357d9a6472e77efa\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":328,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"139a0df24612154837167a3c00e0c18f8de1e2d9fb3ccacb148efb2849ce1dac7f1ed51f2dbf145d1e9b803ac038be4fd5a142215c9786eb0dee70e9e879220a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 0, + "layers": 2, + "decoder": 0, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layers_mismatch" + } + }, + { + "name": "session_unit_past_the_title", + "about": "unit 4 at one layer through a base of four frames, units 0 to 3", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":328,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"fa37ea0655ada9f3145c9709da6e299eba15ae7b117dfabc5becd78dc864f38e\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":328,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4114adc009fe8d115b0f402c3a42e066411f30bed73fbd3519b8002ed60b753f62ab779cc98e413e6c6070ed5b78c8057bd1230c92598b1f2c7b308ab9b8fd0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 0, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_unit_outside_span", + "about": "unit 2 at two layers through a layer whose span is unit 1 alone", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"840c02e94c8485a99f76e1def8b451685d30535c45add2b4fbe7fdc14c7631b5\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ba64294c5e2dd515b254e66d36e1abea247d781f7fec9049fc8abfa8a7c21b96d6e9e4f1058fcd42b83ccb45b2d0a9d021de0111d7b9fa8043f3ed1900f0870f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 2, + "layers": 2, + "decoder": 1, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_unit_first_unit_shifted", + "about": "the base's entry states first_unit 1, so its four frames are units 1 to 4, and unit 0 is presented through it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":328,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":1,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":328,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a0396079171856ee448fdc1665024d31ca694388867d5015782d6b33bfe257323463e24a84e252e7f4398b3e2f351abdcc999d9227d1dadb426fe4483c84a308\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_unit_whole_layer_accept", + "about": "a layer with no span covers its base's four units: unit 3 at two layers through it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1515,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"8fbff2c32d91f96ef6be3ea5357b773baadfc3e001c1c1f5a95221c5eeb722de\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"cc7121f4fec07c71c75dc99e9088bc945e6571d836ca7be6914d7a0143f11683\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1515,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"29a02b593389a18be01ae9eaf02237df8362c6e5691d735fcc13536964e654883cf9ad5ed701412588fac744c5e3c41286097e5722ead26c22ab2de668815808\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 3, + "layers": 2, + "decoder": 1, + "out_digest": "ab18c5a26c59ff8de3da644ea5f2f8c4914d50fc361c7c84d3395f3846dc5bcf" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "8fbff2c32d91f96ef6be3ea5357b773baadfc3e001c1c1f5a95221c5eeb722de", + "path": "primary", + "counted": 1187, + "transferred": 1187, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414931430100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a317d2c22746172676574223a6e756c6c7d54030000574952310101000004000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c0000000c0000000c0000000c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "7a377a15e9880643af13a85fa36a94955e9e1d15d1b9129ce22f1017d6fe0de5" + } + }, + { + "name": "session_unit_whole_layer_base_not_held_accept", + "about": "unit 3 at two layers through a layer with no span whose base is not held: the units it covers are not read, so the unit is not checked", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1515,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"8fbff2c32d91f96ef6be3ea5357b773baadfc3e001c1c1f5a95221c5eeb722de\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"cc7121f4fec07c71c75dc99e9088bc945e6571d836ca7be6914d7a0143f11683\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"a684d3a3e5bad99162db331b8852096f9f56d41092d5ed63b7d0446aab1603d0\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1515,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"29a02b593389a18be01ae9eaf02237df8362c6e5691d735fcc13536964e654883cf9ad5ed701412588fac744c5e3c41286097e5722ead26c22ab2de668815808\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 3, + "layers": 2, + "decoder": 1, + "out_digest": "ab18c5a26c59ff8de3da644ea5f2f8c4914d50fc361c7c84d3395f3846dc5bcf" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "8fbff2c32d91f96ef6be3ea5357b773baadfc3e001c1c1f5a95221c5eeb722de", + "path": "primary", + "counted": 1187, + "transferred": 1187, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931430100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a317d2c22746172676574223a6e756c6c7d54030000574952310101000004000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c0000000c0000000c0000000c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "7a377a15e9880643af13a85fa36a94955e9e1d15d1b9129ce22f1017d6fe0de5" + } + }, + { + "name": "session_no_classical_accept", + "about": "a session with no classical length, beside an envelope whose second rendition is WAI's own", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"7bf59652fb0b166d6d29651816e5dc18e83b732799b0de62e6c84fc316bbf86f\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c66e44dd4fa9973f48bcd0c49209968bf615dc397782f2190af3fbcef5266999948b67c4370585e1d10db5d9d35cbd8064c915aab634d1c99f9243220b72400f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "envelopes": [ + { + "envelope": "57414932bd0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f6d6f74696f6e222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "af6b17ad612aebad51d717a37be9129372b1802115d336d23633e83db3508989" } }, { "name": "session_rendition_no_envelope", "about": "an entry that names a rendition, and its envelope not held, though the context holds every WAI2 envelope the session received", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "envelopes": [] }, @@ -7450,7 +8876,7 @@ "name": "session_relabel_wai1_base", "about": "Ra: the base's entry, decoded from a WAI1 envelope with no rendition, relabelled wai.video.av1; held beside the base's envelope, whose capability is wai.video.int_hyper", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2c8518586fa7c1936ec9fff0027162750679930e5d934b0726075c3de368fdbf20b78207bee92c3e016011d388ec3bed2552ebad910ab381ae72f7fa22a3a209\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2aa3d371e4dc86261b3f1ed8d867a0c63ec4d089000c126f8a548f85a5e322d4d7aaf6eb71251d78f6bf3ed610d00cde83f23048c8708f2f25948facd181e006\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -7522,10 +8948,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7539,7 +8965,7 @@ "name": "session_relabel_av1", "about": "Rb: the entry decoded from the envelope's first rendition relabelled wai.video.av1, a class checked for membership only", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dd971b782a1a8e7f945e76ac57c64af313a02454262df3cefc32e5321df7b73fefcfe27e7d25fe1a3a14c1e7f6ddfc6b94db78e7f6585ead6d99a6bf13579306\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b9fad3a6e1cecb3b933485e3dda5d68fe78c2435a3777f65e1e02bdc76a2d0c4d898a5380edd5a439fa9129f206797153397ccabb293c98b9b2528833aaaca09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -7611,10 +9037,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7628,7 +9054,7 @@ "name": "session_relabel_j2k", "about": "Rb: the entry decoded from the envelope's first rendition relabelled wai.video.j2k, a class checked for membership only", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.j2k\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e4b2a0910c373718e931faaeec1968a7f03291e2ab228bddd174c61f009d5387f3436ad7efe8c50ae80fcce695d32bb251d31755ba2e3d85460532f6d16ec805\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.j2k\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"eea2ecdcaf5e889872342d93c5b520701bf2985ea2cb4e4cdd22ef219aef49763e0cbc191cdb9e17c89afeab333c6a1b9f52c7e3dce908627041627a7fd02106\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -7700,10 +9126,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7717,7 +9143,7 @@ "name": "session_relabel_rendition_nulled", "about": "Rc: the entry decoded from the envelope's first rendition relabelled wai.video.av1 with its rendition null, as a WAI1 entry's would be; its object is the WAI2 envelope", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d3d34bfbea490eddec125ff5923ccbdca6818230fa2c99487664569f9f0d8f3a3a24eda9cf40c205d5f106c993f31bf42d9a1e5c1eb469d2376c8d7d4ad58108\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"156ca76b759245e8edbcbebe6c7588fdd075e0c891debf48e30083bef9167ce232d60faaf5709085478c1b6446437beab8f007df14f3e4f5134a2372ab11ba00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -7789,10 +9215,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -7806,7 +9232,7 @@ "name": "session_relabel_other_envelope", "about": "Rd: the entry relabelled wai.video.av1, which another WAI2 envelope the session received has as its first rendition; the entry's object is still the envelope it decoded", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14906,\"uncounted\":3,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c6786ee11cb55b006c8994217c60c97889be757f6b709417abe1a7a092833d6762246aeaaf3b102917fb4a8b0075bf00423113c486766d17c99e0606767c5f0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":10186,\"uncounted\":3,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"be749d9214c29de62c7fe10e91b2c661bc5e02b470f524b83c79c6b4132382e588c89eff0e49d5017d62b0c7a43f7415b0c0919734209215d13f7544ecd2ca0c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -7878,10 +9304,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -7927,10 +9353,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -7950,10 +9376,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" }, { "envelope": "574149327b0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e617631222c226b696e64223a22617631227d5d2c22746172676574223a6e756c6c7d010000000000320000004444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444" @@ -7970,7 +9396,7 @@ "name": "session_relabel_envelope_not_received", "about": "Re: the same, the other envelope held as the session's and not among the objects it received", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dd971b782a1a8e7f945e76ac57c64af313a02454262df3cefc32e5321df7b73fefcfe27e7d25fe1a3a14c1e7f6ddfc6b94db78e7f6585ead6d99a6bf13579306\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b9fad3a6e1cecb3b933485e3dda5d68fe78c2435a3777f65e1e02bdc76a2d0c4d898a5380edd5a439fa9129f206797153397ccabb293c98b9b2528833aaaca09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8042,10 +9468,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -8091,10 +9517,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -8107,10 +9533,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" }, { "envelope": "574149327b0000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e617631222c226b696e64223a22617631227d5d2c22746172676574223a6e756c6c7d010000000000320000004444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444" @@ -8127,7 +9553,7 @@ "name": "session_relabel_control", "about": "the same re-decode through the entry as written: byte-exact, so checked, and it differs", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8199,10 +9625,10 @@ ], "envelopes": [ { - "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d4000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333" + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" }, { - "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d020000000000c8000000c8000000bc020000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" } ] }, @@ -8216,7 +9642,7 @@ "name": "session_stage_claim_invalid", "about": "the stage claim the session names, with its signature broken", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8282,10 +9708,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -8331,10 +9757,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -8346,7 +9772,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a932ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4cd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -8359,7 +9785,7 @@ "name": "session_stage_claim_other_signer", "about": "a stage claim signed by another key, named by the session", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"67825cd462003e47e08a88cddc2700cd6443f592db0e351d36385031b8a1a546\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"552c8fe218a8be0b12106d65327d22b2004bb278b79ce37982799b6930e33c1bf98f07075db84cacff5af1537d63e904fce6e0150979b235dcecc6fd02b46506\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"e7410ce98e05a6fe4cf5d843c08c484a1e09837e9ff776eb13d20aef94f13bc8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8e5c7081475169f2db24636402daff411388d85d5d5698381cf9005762e49e7bc5f2f94be2b7122f5e6f0f8a86acab9c5bfc6c912b2da176c0d474a28c22e10b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8425,10 +9851,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -8474,10 +9900,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -8489,7 +9915,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"73b26bc3f3b7b227b4c9b9cb12403435afada1fe3b1537eed0223a2f71c7d7160aeff803ff3e2ee15df485814da94ecb3fda2c127fe6bb277edb3abf7d9a9b0d\",\"signer_id\":\"did:example:relay\",\"signer_pubkey\":\"34b4d9043156cb6dcf0beb0a2949b7559c940d2bcb6dbe8c53a9b30278e3a746\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"58d98510c6d0bb9ef11def8114d7f697edd0986ae8358736496ab728257846d2e73aa3964016b6a581ff34b73677163f2fc9a3f9193d03ea87262beb8bc88004\",\"signer_id\":\"did:example:relay\",\"signer_pubkey\":\"34b4d9043156cb6dcf0beb0a2949b7559c940d2bcb6dbe8c53a9b30278e3a746\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -8502,7 +9928,7 @@ "name": "session_stage_claim_not_named", "about": "a stage claim the session does not name", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8568,10 +9994,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -8617,10 +10043,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -8645,7 +10071,7 @@ "name": "session_stage_disagrees", "about": "a stage claim with two units at stage 2 where the session presented one unit at three layers", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"3766609f51732e81bebee3589add9ab54eb19eeff5c98d77a2b90558a964ba13\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9b88c8580184b0c8bcbd52a24bd0052620938ee1495d24dbd7c2aaeb09f440efc74b08e6d3f1bcfa72026c56f1ea3f74821ed17ad6a09c57f3a5701b3443070a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"ec8ae5d06a3b734586984958b67efe95559084c4b45db672479834fff7318ecf\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"27750b0d906fa4b88c8ef097e3e1a1b56612d77e1dfbd6ed7878064e34262b618081487b8c25aab872cbd9f10cf8b5d2ee8f35780e87247e330b48e5c5a2a208\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8711,10 +10137,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -8760,10 +10186,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -8775,7 +10201,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":1,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,1,2],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4241442dced72409aa568ee50e12e710c4bf3399fade77d8f7dd9d2d35cc580660e8675d75daacf78eba20bb87450af4fe152615772ae27d6337ebeffd2ed008\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":1,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,1,2],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a94b7c4756a6a4a6102e4c2d78f6d48d327768b9551875509db75fac7033c43ea159a35258ee75a44d1de35d52c9722f7af7fe983a87b6a8b14d7550c601e40b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -8788,7 +10214,7 @@ "name": "session_stage_unit_not_presented", "about": "the stage set placed at unit 3, so its last unit is a unit the session never presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":3}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"851c5f56eb0ebf09be39eba3eeedbdc774f03b3dc3ff38a1c179ac0ffce5c8ce185ea437f6064dc0b46ddba85b4c1893668ff533f553f85589bba90c60093f02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":3}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"50e0b23ffaf4fac790eea746bb85f537226b04cbd0c0752abbdf10e55914749e4f0e9e7d44c39dcd7369b062061bc2a64405cb857faeca8e70bee24ffe8e240b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -8854,10 +10280,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -8903,10 +10329,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -8918,7 +10344,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -8931,7 +10357,7 @@ "name": "session_stage_beyond_applied", "about": "unit 2 presented at three layers and unit 3 at two and three, where the stage claim lists no layer applied over them at those stages", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":13,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"817368d56a81a6d39d49a449988d5aa6fec0f425efe9ff384cc650687fb16d54\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6f27da0dcbaf665f9edb38b856d616a615840b9e9700171bf503f6cc83fbdf9bba8d6cc10eed03c154661f149447623d546356b08841a7cc92877819eb01210f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":13,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"817368d56a81a6d39d49a449988d5aa6fec0f425efe9ff384cc650687fb16d54\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1a8aa5c658518b3ebf41049bd132819dd004bd216e33937224d58bfb816374caa76ea816ca897d3a9bc6f87acd312303c89e2aa2947dcc6a9f93c2d0a18ab20b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9015,10 +10441,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -9064,10 +10490,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -9079,7 +10505,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -9092,7 +10518,7 @@ "name": "session_stage_through_late_layer1", "about": "unit 3 presented at two layers, through the first layer the stage claim lists as late", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"a1e49d6413bf29d83b994d9fae595e93d3bdb08f56e281cd91e3e341283ea4b0\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1c4cb733163877bde678eaa78134710f6b752b76a580b3c0fbc1f46a520b6cb398c0086df056b3695bfc92e01da80690a410a60be6a3379e9ba45586e2be0500\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"a1e49d6413bf29d83b994d9fae595e93d3bdb08f56e281cd91e3e341283ea4b0\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e3150ee727af3a75d4f5eed58921929fd5b517e2c3430add989ba8456a6a807eeceebb3c2cf0055b138595f8eb5480492f2f9cba92857878557777f913a8b203\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9164,10 +10590,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -9213,10 +10639,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -9228,7 +10654,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -9241,7 +10667,7 @@ "name": "session_stage_through_late_layer2", "about": "unit 1 presented late at three layers, through the second layer the stage claim lists as late", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":2,\"missed_units\":[{\"late_us\":400,\"layers\":3,\"unit\":1},{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"2192944a9a7f20dbc600ec727b2849b8cba16b04fdc91294f85eae59937d00ae\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0bfb59077393ef3b7b957f4dbc5b3e6b95edb3a7c66b970c3a7657e91a9f4eed9fb851e67f95516c6edab96ed6e09b486459c87bcf9604cc85cffc91672f1b07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":2,\"missed_units\":[{\"late_us\":400,\"layers\":3,\"unit\":1},{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"2192944a9a7f20dbc600ec727b2849b8cba16b04fdc91294f85eae59937d00ae\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"27aa59372182c05b92e14096ba969b59727e5b19752f15d36e42986b2e40ac733bb59d3c8ebd1942c4f8251bad8af6019333912ffb3384d81c742da48550f904\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9313,10 +10739,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -9362,10 +10788,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -9377,7 +10803,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -9390,7 +10816,7 @@ "name": "session_stage_through_refused_layer", "about": "unit 3 presented at two layers, through the first layer the stage claim lists as refused", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"a1e49d6413bf29d83b994d9fae595e93d3bdb08f56e281cd91e3e341283ea4b0\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"47f50165dec619b5ecf68b3b831b181b47e9d958420e4ea92d5742e0da057322\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"95177f661927dae379b53b1e1d7773edaf19649b5d00ad41e07434043f3627c2576c6cc913105b3b158dd78068348a693aed174e33001af8360a908a0eac050a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"a1e49d6413bf29d83b994d9fae595e93d3bdb08f56e281cd91e3e341283ea4b0\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"9a5b5e945dc9bdc06b43ca86cbd8bb773304cabbbe6ea666e82df3f80ca710d4\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"03b348325707a0c36671d1c16cd1b9c618d8c2249b278fbf1293b20bbb58a7c0c6384499b5a2572024725816b40786db32597e83625d25f0a91b12df42729c0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9462,10 +10888,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -9511,10 +10937,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -9526,7 +10952,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":1,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":\"geometry-mismatch\",\"status\":\"refused\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a75622c0315457705c4887284b65dfa4f861c7546284688a6cfec5360d50a62e7397897babb9f84d33fdd87d37a1cf2623f97c1fb46eccc8906540c7b7b94d0d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":1,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":\"geometry-mismatch\",\"status\":\"refused\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a726258aacef75ff55cb3a2639cdd687377dbaf98a72edc498f805f1bd70986d8058153c5790100e1241a5086dd1f46ce6596c6273ecadafb2ea89d893af1707\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -9539,7 +10965,7 @@ "name": "session_stage_about_another_base", "about": "a stage claim by the sink's key about a base the session never received", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"ff1cbe581af87fa47cec30537ab111784c0c8d9576e37fca08029eae566571be\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e8cf7219d25cb20f9f31f56a60921f57e0cca2b9991aba76bc427fea11524ad2ce3f14c86a9065a06888c2c52ca455c2f6a859d2c79cd7d58211d92a6948a30f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"ff1cbe581af87fa47cec30537ab111784c0c8d9576e37fca08029eae566571be\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"587b89c5c985566e7cce13011e07f9e162c7849789f6b11887fdfb37a40f2b4b8d2bd0b1f55a013f334f31c1b8483d0434e1d4f1c7ec75d78215d8880f8a120b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9605,10 +11031,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -9654,10 +11080,10 @@ "presented": false }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -9682,7 +11108,7 @@ "name": "session_stage_layers_never_received", "about": "the objects received lack the two late layer objects the stage claim says arrived, which no entry decoded; the counted members are restated to match", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":8703,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":12811,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b835145737d8042189302004cdb91952cf5a0d17b67fbef80248d636c64df1657fe854506f2c547ef6d0dedd0e63dbf8b1c894125df42ff26606d7c61047510a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4031,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":8091,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"002ba791d8800bbb5876f49a41279995211a5917df5aa7db0d018d2d89e785a7aae24185d3f56c987071d0153491835742bb9c69c3a3bdd27c51a684c0ea5107\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9748,10 +11174,10 @@ ], "objects": [ { - "content_hash": "be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec", + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", "path": "primary", - "counted": 5000, - "transferred": 5000, + "counted": 328, + "transferred": 328, "presented": true }, { @@ -9783,10 +11209,10 @@ "presented": true }, { - "content_hash": "50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c", + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", "path": "primary", "counted": null, - "transferred": 1108, + "transferred": 1060, "presented": true }, { @@ -9798,7 +11224,7 @@ } ], "stage_claims": [ - "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" ] }, "expected": { @@ -9811,7 +11237,7 @@ "name": "session_context_on_another_class", "about": "presentations given as the context of a stage claim", "procedure": "claim", - "receipt": "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a832ea259b95831ddb2c69dd81f3c4d52503ae1532ab8339bbfd318c877f65091fb3de7b2926c2fb27d86f4b4cb7508224fd924a82eace3828e75c57b224e803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9886,7 +11312,7 @@ "name": "session_forget_accept", "about": "a base refined at stage 1, forgotten under the record budget and decoded again with no layer sent again (staged-conformance record_budget), naming the stage claim of each epoch", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a522c8b1c8fb2cbe7400965086f7a7b3fdbd01985ac20f2a0ec6a021c2175965\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"1892934bc60bce37d7658cef7aa661ff921413e90daece364d13b0aefab37a8e\",\"first_unit\":0},{\"claim\":\"4ab545ea45183f54e1783a49f11966638cc8925defd9b3d00a1e11e0c9dae16e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":2,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2b2d446e83edef617b0d98e0d56b78a10ba04adc8106cb559bb09690054e87541575c9c076a3f681fd526f738042ffb753ebdc17f9fca3f4e30c91da051c0c03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1142,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a522c8b1c8fb2cbe7400965086f7a7b3fdbd01985ac20f2a0ec6a021c2175965\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"1892934bc60bce37d7658cef7aa661ff921413e90daece364d13b0aefab37a8e\",\"first_unit\":0},{\"claim\":\"4ab545ea45183f54e1783a49f11966638cc8925defd9b3d00a1e11e0c9dae16e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":0,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"096caf069338f53babc3dfcd163b72c140cbfe3429505f711df44fbea1c8e1e50f711318d3e188e1d814f81956d89511106e2089527145b9111af300bd0c1c02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9918,14 +11344,14 @@ { "content_hash": "af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf", "path": "primary", - "counted": null, + "counted": 555, "transferred": 555, "presented": true }, { "content_hash": "729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300", "path": "primary", - "counted": null, + "counted": 587, "transferred": 587, "presented": true } @@ -9945,14 +11371,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "98294f3b34da4653f20ad89ae8679e81bef9555d5bbf3e3a0b01c6023c110bad" + "link_hash": "8f10a2e43fb1a12bada80b2e98b5e19a4359395c38ee89ee85b0bc0797084489" } }, { "name": "session_forget_first_epoch_accept", "about": "the same session naming only the first epoch's stage claim", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a522c8b1c8fb2cbe7400965086f7a7b3fdbd01985ac20f2a0ec6a021c2175965\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"4ab545ea45183f54e1783a49f11966638cc8925defd9b3d00a1e11e0c9dae16e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":2,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"834a6bfbf77520578b8657b33f350a6683462dce4e2bc49e5efde668b83ef8d28a7bd10e31ea2495b63fcdebfe3475d159cd9826199be49640e714c5444d7105\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1142,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a522c8b1c8fb2cbe7400965086f7a7b3fdbd01985ac20f2a0ec6a021c2175965\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"4ab545ea45183f54e1783a49f11966638cc8925defd9b3d00a1e11e0c9dae16e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":0,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"780f63b0cbcb838b5ddc9e861df183b3ff5e10abafdf5194f2f67f779b9f671a00317ac0cd4418eb498dcdab64b4f8420bee0a7a84f898cbd58c225abba98400\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -9984,14 +11410,14 @@ { "content_hash": "af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf", "path": "primary", - "counted": null, + "counted": 555, "transferred": 555, "presented": true }, { "content_hash": "729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300", "path": "primary", - "counted": null, + "counted": 587, "transferred": 587, "presented": true } @@ -10010,14 +11436,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "23aeb684848cf8bc7510eb4346ff3bbb78db56827d146fc8840d7ed4ae26ad19" + "link_hash": "76c379bffcb238e8118d21221692900d577ece04459ea0fe941412a7617c1d74" } }, { "name": "session_forget_last_epoch_only", "about": "the same session naming only the last epoch's stage claim, which lists no layer: nothing bounds the units at two layers", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a522c8b1c8fb2cbe7400965086f7a7b3fdbd01985ac20f2a0ec6a021c2175965\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"1892934bc60bce37d7658cef7aa661ff921413e90daece364d13b0aefab37a8e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":2,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"623b107a1062b9227c7f9f9429dd9812716aff4a8f0c84dc21a534552b1cbf07f0c97dd5d827a49c2bfc3a81ea2d58ea78b967036324223b042622df28e3e909\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1142,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a522c8b1c8fb2cbe7400965086f7a7b3fdbd01985ac20f2a0ec6a021c2175965\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"1892934bc60bce37d7658cef7aa661ff921413e90daece364d13b0aefab37a8e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":0,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fd8d2ebcfafba17c2107f37918ad1a93a9d02bd69cb396ee9cf19a3d1aea951010f96cfc4ab5817a29cc588a65decd0b96a4d0912baed904fa703837f457e00e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10049,14 +11475,14 @@ { "content_hash": "af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf", "path": "primary", - "counted": null, + "counted": 555, "transferred": 555, "presented": true }, { "content_hash": "729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300", "path": "primary", - "counted": null, + "counted": 587, "transferred": 587, "presented": true } @@ -10081,9 +11507,9 @@ }, { "name": "session_forget_beyond_both_epochs", - "about": "the session naming both epochs' stage claims, a unit also presented at three layers, which no layer of either reaches", + "about": "the session naming both epochs' stage claims, a unit also presented at three layers through a second layer not held whole, which no layer of either claim reaches", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a8ea80901167a27237587bd2a9a789a4e3e38ea667d25139fbcb14f72590c8cf\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"1892934bc60bce37d7658cef7aa661ff921413e90daece364d13b0aefab37a8e\",\"first_unit\":0},{\"claim\":\"4ab545ea45183f54e1783a49f11966638cc8925defd9b3d00a1e11e0c9dae16e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1142,\"uncounted\":2,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6a667d1215b25f7adf67f7b35e60fcce4a74d63bcc2130d959d1bbea8af779a092ce15aa9f77449ab038929153df9ec5eb3a84f7618a09bb7b4776644c26200a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1142,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_motion\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"df918c3cd6ad3d88c66792e98dad1f7153fca96a7a5de027b64ec57a9b51eac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"14458030d58a5c244e85ac965062eed54353b11a68b565333ff30b1df08fd279\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"f69b6a1f5e4bea9d8d8be1fac9728182dfdde6b6819986ebe4016dc8030bc4f8\",\"stage_sets\":[{\"claim\":\"1892934bc60bce37d7658cef7aa661ff921413e90daece364d13b0aefab37a8e\",\"first_unit\":0},{\"claim\":\"4ab545ea45183f54e1783a49f11966638cc8925defd9b3d00a1e11e0c9dae16e\",\"first_unit\":0}],\"switches\":[],\"switches_total\":0,\"transferred\":1842,\"uncounted\":1,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"135ebc08a767b220d1d9acaffb32c9409c49edd9382406d3ef4c009a598cab07c0f1bc0dcc53b90ca2efa0053073d575dc6d73beeac076d5d1e08b4ec486b602\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10113,7 +11539,7 @@ { "unit": 0, "layers": 3, - "decoder": 1, + "decoder": 2, "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" } ], @@ -10121,16 +11547,23 @@ { "content_hash": "af699aa62e0c73746f529abac02aa628ce7413349b97d6b554af7fadd81f4cbf", "path": "primary", - "counted": null, + "counted": 555, "transferred": 555, "presented": true }, { "content_hash": "729200a3f8b525f4699768200762fc53a43c57a4a11c5b91a5adb52bec5d2300", "path": "primary", - "counted": null, + "counted": 587, "transferred": 587, "presented": true + }, + { + "content_hash": "df918c3cd6ad3d88c66792e98dad1f7153fca96a7a5de027b64ec57a9b51eac3", + "path": "primary", + "counted": null, + "transferred": 700, + "presented": true } ], "envelopes": [ @@ -10156,25 +11589,25 @@ "name": "session_figure_report_accept", "about": "a measurement claim on a metered session's figure, by the session's key", "procedure": "claim", - "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":250000,\"power_reader\":\"a counter reader\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"1dc37a698c9b5e45161a42eec9c5376c7c2a135167d1cace57646556830d6426e285728f4b7a175328e0ebc55908264289547f1a209b7bef79c69e1d4163800f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"e1ff3fc96640eaccc2049432a8a08bee5927fa08c98751848dc8d45fec035044\",\"subject_type\":\"receipt\"}", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":250000,\"power_reader\":\"a counter reader\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"13b1ab08472395d87f4b6c71696ca3a05cd16eeabaad1d1f25d0fc4d61154a156f26e580b575b65ce4f1872f1147bf9243dcb75485615c21e07979f0dce1c105\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"e3055bb90e81973a5cb22ffe4d6ca2c3e630fdf70031e97917235fa6c6038d21\",\"subject_type\":\"receipt\"}", "context": { "figure": { - "claim": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"280ba0067da0cfc8f8e2a01d9a3585b94710dde2fc0122e5b55e1a09b6b4d57978f6fe322948978e772a795f95cd1b4b5bc31c0477d72001ef4ce98d601e4a09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "claim": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":250000},\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6785d661baa4e32f53a43679f5e9a70f08558490f445e3000ce9153a32238b76c4a09f3a797a7e5662df86cf9823906b6cecf7e2eae5b43bdd9378201469b702\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" } }, "expected": { "outcome": "accept", - "link_hash": "d19d8f2eafb42884f353e98403a81d11f7057996c85ede7ca3cb0f9a7b26986e" + "link_hash": "8a4d00759441b970daebf2b768585ce5c12a2f706c3329ed26efe4cc4f2a0aec" } }, { "name": "session_figure_report_unmetered", "about": "a measurement claim on an unmetered session, which carries no figure", "procedure": "claim", - "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":250000,\"power_reader\":\"a counter reader\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"7dc9dde15a7a8d2dab82be89cbc7e064ae6602d7a96e5be281ef204e3fcd0cc498179a8b34ccb8a73c7afd6247190be4db119cd9d0ef62e0e60e2c27c1a4a507\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"4b8be05ca08d4114e5da8c86dac9d4323872fdc4220fa08b795ffdb2768b4bfc\",\"subject_type\":\"receipt\"}", + "receipt": "{\"body\":{\"bracket\":null,\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"figure_index\":null,\"figure_profile\":\"moq-jwp:claim-link\",\"group\":null,\"joules_micro\":250000,\"power_reader\":\"a counter reader\"},\"class\":\"measurement\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":1,\"sig\":\"23873b2e12debe98d07d8e67256dad03476dba261d2b8f15b946de3c5015f645623d274037b7d8e7726d704e68142ced921763d135060416818eb031d364970e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"1ce61b7c6ee7a0a7057342bfd0fb55b90e67d84027d42da129fd1fe24879412b\",\"subject_type\":\"receipt\"}", "context": { "figure": { - "claim": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"50dbd88478a116e4dc87b018127e8e95ece2049db8e9d897449e7e8e6ded420c\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"686dd5c467fbd879d476b39c09163dfc34de0d370ea029ad40c4887c01f9efb8\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1305529a4550524032f59282bc22f97ab84034c9f4ac9d8f89208076e326d77b5bc9898ceefc994f92bd8f420fcab52fd62532101bc10a3c581fb47e2827e704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}" + "claim": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bbfcbd8cbcb7ee6a43e5bab151cc2c8a66ca2c1ae9f5ee415c6cf2e361ce76d393a2be5ea796894079e7239a5bc6b170661245e41c3890ca7ab0fc3afe6dea0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" } }, "expected": { @@ -10187,7 +11620,7 @@ "name": "session_tree_01", "about": "an output tree of 1 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":1,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9bbb2c453e90eab8c5e9ca19a9b9f355103fa5d112ba9b50f23f277b3849e7e7\",\"primary_units\":1,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b1ddc9a2ee296fe11d1472be1ddcf9d964f034ade85501c4ad463c9a974ae5279d92123d6c93f5ca0277c64948d2ba5963bd25e422d12b4f7ccb842708bc7f01\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":1,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9bbb2c453e90eab8c5e9ca19a9b9f355103fa5d112ba9b50f23f277b3849e7e7\",\"primary_units\":1,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"02b9279fd9cb9c3bec22bfff7600ebec0bd7ec4a8d0904c458460814390d63a4dc9c2524b88288d09a7606b5d162ad58c6333d5b1491e33dcd759696f563c404\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10206,14 +11639,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "5a2d0e46c6ffe279f2afc92c6b0a2dc1f4eabd515d59d51d7468a6e700d1567a" + "link_hash": "f1c400a71316f8d9e21986285e589760ae0328fddd5affbb30b418b27585ca66" } }, { "name": "session_tree_02", "about": "an output tree of 2 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"edede5b8e2369aa378253e97eea8a58f22a5842c32b39e6ce6737f3a7fdc95e4\",\"primary_units\":1,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"abf9348b523bd5b19fca1624f54b5bb1522809d85aa9e43190c7204ec636ed33a04fa155f5b299265dc703de0b98a6dc7ef813a32c53e6ff8d9859564ca06e02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"edede5b8e2369aa378253e97eea8a58f22a5842c32b39e6ce6737f3a7fdc95e4\",\"primary_units\":1,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"065d5de1714d045933ec2a3cfb6af8b9fe75f1f58a8a66ddb9219b24440948a1a66698f94a9466a09ddc37a759e8b270121c4e96ecb4f754c01f301404d9d403\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10242,14 +11675,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "e528d63d116230327fe8139e86d08fd60c3d5301b5b65355d943565ef1e0b13a" + "link_hash": "bea10539b98be233abc465129a9a0684a9d3c16a2dfb77c1e2b5c78d9395e423" } }, { "name": "session_tree_03", "about": "an output tree of 3 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":3,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"36d9bc31e2f1709e278a45d7d91b4a25a6a8535ac30e4316090b89694d118d9b\",\"primary_units\":2,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":3},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"978925d6f5d1150ca7c616cacb2104c7e4d1f6ba0c6738254d9e149c66adee7cf4dccc478c0533b1c6d6ded6efef4049a373e4ac4207a49c7b7ac3671863b104\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":3,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"36d9bc31e2f1709e278a45d7d91b4a25a6a8535ac30e4316090b89694d118d9b\",\"primary_units\":2,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":3},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"86097e69357fe252682d6f3918176c091939ec3d0453c016e3e71a6ac282eb1b6e5ed73210adfbdee0d3881485fcab9a286d3cc815d2d3ef82f4267eecea9802\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10288,14 +11721,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "4bdd44a6b87763e158ef111db84ceca1015dfe3a03af5f7d87b28f96c737d2ef" + "link_hash": "c84056ba50fbb740e6fac5a094dec33d0e4b2e23bcff8b8116d59e54ad05dd05" } }, { "name": "session_tree_04", "about": "an output tree of 4 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":2,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e1e21838f409b14b26055e52eee94f6e34a771c1de2094fd669fa85b0999a08d\",\"primary_units\":2,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"05d8c18ea49195ad55e3da926dac9c473bc58659299c45ce52a2d028c02006fd0015aef353a45fb1f18560dffde6409198bcbb82e564ceff35479a2e92cf3a07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":2,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e1e21838f409b14b26055e52eee94f6e34a771c1de2094fd669fa85b0999a08d\",\"primary_units\":2,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1436ccdbc1056c5221b805043c6186bbb162c5470c99395e9a8d2d5c5c4ece4ec917e5de38ea74033da53e65347092f9a121e69affa7c4e50e1f4ad995e14407\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10344,14 +11777,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "43d3355411f4f504b243c530cd596ba3e71998623a2589df1a05345c44412506" + "link_hash": "3588b78cce36262c97568c52028e645b9ffdb18909db6b5f8ac22ce2a1973833" } }, { "name": "session_tree_05", "about": "an output tree of 5 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":2,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":2,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"af31725e4b35075a8dbc2fad6026446f710ab15f6d93d6a9a9743ade4ce6675c\",\"primary_units\":3,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"434c58481158c2804530a191560363db30bf5b6a2a138b1b62fb946a25bbab58975dc71ca4768de87306b62755b050e7f46248d6b749d8df71a869b59418c302\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":3,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":2,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":2,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"af31725e4b35075a8dbc2fad6026446f710ab15f6d93d6a9a9743ade4ce6675c\",\"primary_units\":3,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9cb96d713fefa735f9aa8035afcdc6f54a9f45720ac3c9b1e42d69a5e832abb3901b42b0c11a2566459bc07e79e2c726f1baf8e958389187c2378609d3ef9703\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10410,14 +11843,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "bd71761c11067d9ca5a7875ce76c3fdedb852d943fc0e4397cdb3bb3c3f6840f" + "link_hash": "d1969b8c06c0314302a8e6f98f187b13fe0f1cf6047566ea2e6c3c09d40d3f41" } }, { "name": "session_tree_06", "about": "an output tree of 6 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":3,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":6,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e80808b9eab897bf811a82da19e20154bd3e7bdb49d912b639bc4a2d3abb2be4\",\"primary_units\":3,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"800d5cc1e01e24e330f098fd57fd4f3ab22b177963d7af2466a9f7d1badd776e6404a093c8dfa5de33b8011c2064ff988b54730cd4b3471b5f2819d06370a409\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":3,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":3,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":3,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":6,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e80808b9eab897bf811a82da19e20154bd3e7bdb49d912b639bc4a2d3abb2be4\",\"primary_units\":3,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3cbe218e753f4d54af2f5e2c2980bd02ea2916a172309a3859e3caded531a8c9db3898da98f07c4f5930a6db24121e18014d50ba958275ed8311406b59675809\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10486,14 +11919,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "27f64a3b24cf1425f7d6686393eebc59733eb86c4a6d03080f3a0f3d8648c914" + "link_hash": "7ef3abfe067141c4ab65fa9e2bd272aee8688758b4b62f17a5fe42a8d58d9fc6" } }, { "name": "session_tree_07", "about": "an output tree of 7 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":3,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":3,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":7,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c7b5f28385542cd8cffb5681ec7a5d9597dacc12d0f1517f4d986822132074bc\",\"primary_units\":4,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":7},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b142520d4261e67793df91255c45073ab793ff077bdaafa314f5e69809986ee7a558a3333a7fd9d80552efcdfd2af428661850148c6f2ec6b6a5f313466f640e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":3,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":3,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":7,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c7b5f28385542cd8cffb5681ec7a5d9597dacc12d0f1517f4d986822132074bc\",\"primary_units\":4,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":7},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d1b3efe29ad0063250ac77932a2ceb421f131bdfa289c7edff9808c55f51ded3601062b465054b01808600deaf9888e9bfb37f23f7f929ddfd24a8de7b78180f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10572,14 +12005,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "f2e88382f0009f1c271d4c4cbc83300deae8becbb19fab3d0d60f656f8d1dd82" + "link_hash": "49a01e115fc6f548d01ba1fc1b671ba9d6376c334f2f2c82f4fd3ffa3ff4d5a3" } }, { "name": "session_tree_08", "about": "an output tree of 8 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":4,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":8,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"3dbe0bb16993427061d7a28dda6d96bacee45d5e0048d6667be35c14ec63b1cc\",\"primary_units\":4,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":8},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"35e3b25b4a212cd7fef1ce6205e1bdf7f8b64207ce497fe70cefcf2f51455c81d77549dd69294263485b58fffdf0667de92ac53c5b20e850fb11e07ade36060e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":4,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":8,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"3dbe0bb16993427061d7a28dda6d96bacee45d5e0048d6667be35c14ec63b1cc\",\"primary_units\":4,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":8},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cb7dd29f83dc00edbab2eeeccfba37b0920103f259d04f34cc5e9196d7a51cae85b96210ec4d02bfdb596d4dbc21fc1c998ada5d3172f928391c98c4e263d406\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10668,14 +12101,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "ff18461c001f51082d1a6f95523264b210c5bc02d6c8e109d782cb64345c464c" + "link_hash": "236c0b10cf0c2109d2a5f8f199b24e90c878b73f577ef57f1808aea80727cc61" } }, { "name": "session_tree_09", "about": "an output tree of 9 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":5,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":4,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":4,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":9,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c9e6f19c7b803c8b77c0d8399f25111bfa47bbe9a33946789f308309f52a520e\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":9},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f7a88dadf5de6c542b9d56c73e27277d2db2f25acfd8bcf62a72dc05d662346ba500439f93d0963fdc6a918ec08c7237b72a5fdcd35741ce82fa49d58682a90d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":4,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":9,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c9e6f19c7b803c8b77c0d8399f25111bfa47bbe9a33946789f308309f52a520e\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":9},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9a141c605b7f42bd56e3c366f02b6b98689bc85dea9c35b5db287def43f7b59c93c672cd4acae566150d2870ae1384002c1e71f26eebe36f60c3635caff74a0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10774,14 +12207,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "d824aff2e1086ba76021f9de7c89fee6799556e5f62840272ad56a1a18538641" + "link_hash": "d313cfbbdfdcc2f0a80c65d24eb21d15b1d471b766cc386d22a6f4c4670ec005" } }, { "name": "session_tree_10", "about": "an output tree of 10 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":5,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":5,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":5,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"5d273e52eccde53e9a7d287fcb05c66b71bf05b3b00209adb6096f511f5c13b5\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":10},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5082d866a57feb39ece06b362bb39847260786ecddc9f151f04ee92389537633fe7f7fabe823a48c5ae127ed3228ac4f33d076904b1cbd6325d57e2943b3da0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":5,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"5d273e52eccde53e9a7d287fcb05c66b71bf05b3b00209adb6096f511f5c13b5\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":10},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"96b765c1c304da39f9ef94287297e9013a8d5d4e7889e45ac2fa27ef3753bf317cf235844320f1828e8147eb877fff8725deae6a38ec64e13d493bad03ed6205\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10890,14 +12323,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "8b051a0d6b36c01471e72e620cb9ae141e19837c0eaafbb10cd8fbeea29f2ce6" + "link_hash": "2faf075e2c035349b72811c6adc8e1649ba90943b682e41102a03d490a097794" } }, { "name": "session_tree_11", "about": "an output tree of 11 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":6,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":5,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":5,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"95150e54cbea1f7024015ea20e2ed826b2abb942b98c6e7c98b768b2dcd2d138\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":11},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3a5e5070d99470f4d0745f1976a0a0f78ecfcdf2d86dda52248c58477ba72ad351b2cf80e4a0977df009bc709313321c529b69a3d6cd452c34ce148272d3ae0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":6,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":5,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":11,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"95150e54cbea1f7024015ea20e2ed826b2abb942b98c6e7c98b768b2dcd2d138\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":11},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dab80eed021ae41fdb143bbec53177053867bba61f59fd16a374cdd14dc124795e2472d3050dd21e39e9f99959c06e8a6173aaaa8fe50a919a8ea8230496208\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11016,14 +12449,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "21ef3d12795a21e69b8427b3334e57d5932ea9fd352ad601c8bbb1282e4c1b58" + "link_hash": "57de214a907907e0d5ef6546ff0987b0c3224b6938a86269b8810f5677d3bfe6" } }, { "name": "session_tree_12", "about": "an output tree of 12 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":6,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":6,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":6,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":12,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e7c5251b2715d0d250df47e8d335d9626b27492fa6d99023b7c733ce2f5e5baa\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":12},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2eaa93ee9887705a5c6eb91afb59d240bde3828788cf0316892a6c9bfbc6005745112d3dea6e99fd92b45de378ecea4bd9137bebe2835e6b3b666ac659ab8601\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":6,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":6,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":6,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":12,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e7c5251b2715d0d250df47e8d335d9626b27492fa6d99023b7c733ce2f5e5baa\",\"primary_units\":6,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":12},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"673b52793c268fbb206069e4e96f8e993feb04088643498122d2cdb577c4a2024ab2b36df41bdcdaa9df1e9eaec25ec3095f94ed171307a8ee29e1e3577b4b00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11152,14 +12585,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "6dc602511ed7a2bb6987d7caff5fda150cc468fd57ae03d59c3ccb1eb6baeb05" + "link_hash": "a19adc6fd4ae29b3f1e6a2e751db76a603e6e3a3a67a94dee206ddc04d9f1389" } }, { "name": "session_tree_13", "about": "an output tree of 13 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":7,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":6,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":6,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":13,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"db1298ad9fb8b1a2d6a411d52505d21c55bba463db8a48f72a6c87b2463daf54\",\"primary_units\":7,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":13},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"65ef920925236185773267e0b8e7d3fec0b3ddf8a634b6544f3f6b515f980356b3c80182b56b7e4207a7eca43507bf2a55cf84c45e47c154eab8ccabf4e65602\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":7,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":6,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":6,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":13,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"db1298ad9fb8b1a2d6a411d52505d21c55bba463db8a48f72a6c87b2463daf54\",\"primary_units\":7,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":13},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bce808e0b4e0f527e7a867bdb50366a8d3babc055eebef74df8839a771d5b0c0c0ef82f5e89c1891ee28919bd4d7e866c8d1cf1ecf316d25b94bf57224713603\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11298,14 +12731,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "83b88e673ec9d80804e632839ecd662787299a34a4e9b381c31425b5f6134679" + "link_hash": "b664c510ef489ca30da004d0b94450a86bda7c0cc01b1ffae8b019024a0edec2" } }, { "name": "session_tree_14", "about": "an output tree of 14 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":7,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":7,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":7,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":14,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"7c2a5e64a1682dc7f6ec092fa6cb459be15a16f6abbae9a455ed8590d3677b58\",\"primary_units\":7,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":14},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a26675508765ce3f101235f0044b4899c20122f9d9225f38b602032922896e4648ce02a7b3b85af17381508e702dba6ca14bc670feda5c03454ed43c394ce301\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":7,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":7,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":7,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":14,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"7c2a5e64a1682dc7f6ec092fa6cb459be15a16f6abbae9a455ed8590d3677b58\",\"primary_units\":7,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":14},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cca8d3d88604c51ec7a254337b232c75cfb3b1c1fd2e56e83ff480de56b0413b964ba98732a9fa23a578cd423b3743ae221da30c4ecb4b079e34c63b634e4d0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11454,14 +12887,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "8e2887eb6fc793369a16b1645a1642f891db8b353de674c068fb7494966a55e6" + "link_hash": "04ed7e099f7dc196db95a940be3e3ba437ce7e97f79abac5472a347d242bcda5" } }, { "name": "session_tree_15", "about": "an output tree of 15 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":8,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":7,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":7,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":15,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8a468c91a9c76ae0a3a19d27cb142af71b4017386ea4ca68c5154d6959ca2e76\",\"primary_units\":8,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":15},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"400527ead2522e32d129ecefa4be038542d924ab7fd4145afd26fe9807b7e720a10c411d6d8e956d2c487952c61faf25fe8a8a9bf398854418a753d078ad0904\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":8,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":7,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":7,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":15,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8a468c91a9c76ae0a3a19d27cb142af71b4017386ea4ca68c5154d6959ca2e76\",\"primary_units\":8,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":15},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c2aab494c618faa4ab49735f0f8849292664f17d79c9443c3e4e9bcf59c1d5ad87d409e1a753b17cca39509902c8036630151d1520a3daec847c9182abd88b0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11620,14 +13053,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "49925b6c81b2ae7e415b4e6915ecab89023603ce6f1134a6e53b84d0ff0bad84" + "link_hash": "f29538c63eb581773ec6bf18ac9d255c75b4e3fadf2c121d07647fcabc4e354c" } }, { "name": "session_tree_16", "about": "an output tree of 16 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":8,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":8,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":8,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":16,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52350be50c241f090a8f21ff34d785997262a2f5929229fe09c9d67eb544cb31\",\"primary_units\":8,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":16},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fb035d6f01d96fa8103e205d2d39d123ae35b1c987eb7429a740cd77a7fe3d8f92060af2593ed5ff2e662a7f63a7f64c581067647e7da14a9314f5cbe2b82a0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":8,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":8,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":8,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":16,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52350be50c241f090a8f21ff34d785997262a2f5929229fe09c9d67eb544cb31\",\"primary_units\":8,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":16},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"13592b410d262b0a8fea8aeb2b694c401ee5b29e7f8d732ca59ab05edf5793665cf8653ee7ad2d7abae4a48ee92c2e28dc1572131de62aa21f93ca186218b302\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11796,14 +13229,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "ed2321db1beed323c7bfa77eb93f904093545a3bf76b7fd0695ac7b2d69b9690" + "link_hash": "aeea35ef7a3694b3df752a2ef270a321403da1f892a3e1ebfe7d4b4ce1c8fdc7" } }, { "name": "session_tree_17", "about": "an output tree of 17 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":9,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":8,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":8,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":17,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9213172e08365dda05da08832c707b5e91945fb31e4897d224c92c4f0cf0df48\",\"primary_units\":9,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":17},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"89036c76d798249172a3259ba775e5f03f666631709af727d1ef926811ff5a4cf4cf15a53f552345905e9f1a96620cdd2af74db5eeff574810e3647073c8d00f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":9,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":8,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":8,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":17,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9213172e08365dda05da08832c707b5e91945fb31e4897d224c92c4f0cf0df48\",\"primary_units\":9,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":17},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ea91a038e30fd110562f2665fa071fc584f608e7bbb1777b0c717e3864a6ac4be5b72e1555c50d95706c95765d3f05a65560ec8220aa0d26c266b5a9ed091d0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -11982,14 +13415,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "c1f5ab55eeef0af489bff3e3169fc3b3b4b4cd6dad1db3b9dbfac6fb0f9d2805" + "link_hash": "38b32cdcd19c467b20fafefede928d1e9db5e105924c7a1e98475a970b701caf" } }, { "name": "session_tree_18", "about": "an output tree of 18 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":9,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":9,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":9,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":18,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"6d2512f3fd0a2858a8bcd10eee659d4203ec9ba40354664f27a1d53f78436937\",\"primary_units\":9,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":18},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"21e12cd02726c653a11a000f6597f514e33897038510a910f5e2a8ef1dbaadd062250cc527eed9239413a7b4b9797da84650471c09891e996ca3664822e2ff0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":9,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":9,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":9,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":18,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"6d2512f3fd0a2858a8bcd10eee659d4203ec9ba40354664f27a1d53f78436937\",\"primary_units\":9,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":18},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1046bda1731de1614710a9c64f7178a61acaa027a14c99a0c398bb2eaae13f3b3c3078567e7104eacf2ca3ef170a83b59edc35f31c2e120d7d01dd914c206e0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -12178,14 +13611,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "25136b9c89707fd00a68db4d78dab698365a778684bf4f34928f1f70106cf2a3" + "link_hash": "1a9f93f9aeab4e9f3e3eb5809cc57b24c362e9020764063f271b4854fe4e27b4" } }, { "name": "session_tree_19", "about": "an output tree of 19 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":10,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":9,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":9,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":19,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e2e4a4d505c8728811bb94c9120e92e0f71c60e8c9e37d923a3d8ea47acdbc6f\",\"primary_units\":10,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":19},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6539b7848988a3e8936dce18c7f727a7d43726ea008abce94d5510282365f6da8e7079d7abfe15538dc5346b96b2cfbedccbebce45921f368902552c1caae10a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":10,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":9,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":9,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":19,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e2e4a4d505c8728811bb94c9120e92e0f71c60e8c9e37d923a3d8ea47acdbc6f\",\"primary_units\":10,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":19},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cea61eb4c1440543e0b5c8c843e532347cd7c3ef101cc06282eebc6098d9d0e3954bad6e085926c5485ba564898b1cb12282ca772181e031c37192a7a7e4ad0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -12384,14 +13817,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "8b69de35641ac2276cbc27340eaec7788288b3bbca4d2a8cd8b079becc295393" + "link_hash": "8eb7a96e5041d141fe6f03a588cc9321a4a53a1abc6e69742790794bd81af7fd" } }, { "name": "session_tree_20", "about": "an output tree of 20 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":10,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":10,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":10,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":20,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8e92fb6453752cb53e20b99a81d7b314f0e54b9f9fc5dae9903a8186f68f28ca\",\"primary_units\":10,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":20},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0a745fca5d7e269b43df823c46b3e43912dc547160f52b7f744ab896f294ebb079c0e4ec54285cfb0e3be1a3e7658ed88a01db44ae59435c495406dc47a24502\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":10,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":10,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":10,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":20,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8e92fb6453752cb53e20b99a81d7b314f0e54b9f9fc5dae9903a8186f68f28ca\",\"primary_units\":10,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":20},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"aa914672411288a55a76067c6bcd2d86140a58173cb3a593f89caa4f11034be499bb0ce08de30b3e36a074cc4bc45c38c65de39b0ff2e4a17b3e335443fd2306\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -12600,14 +14033,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "b62ab116c99373cfe5e349e6e1a38b3e1be56b15ed1314698f72092add85733a" + "link_hash": "efc370c52b8fc67768676f790a24e223b895b783c56345b6686bc50842ac37f7" } }, { "name": "session_tree_21", "about": "an output tree of 21 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":11,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":10,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":10,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":21,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"0c6c96faed98dfe4ba1cae73ef330d2a757c6f4cb6e6db5cf57acaf3f6556a22\",\"primary_units\":11,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":21},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"213ccfc426da0579b8f579ae6fcb475770880f350519b780052995c0f5b3246c817812028eeb594a9f0c45eb071365dd24505eb9352837346406c396f53f7208\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":11,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":10,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":10,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":21,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"0c6c96faed98dfe4ba1cae73ef330d2a757c6f4cb6e6db5cf57acaf3f6556a22\",\"primary_units\":11,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":21},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9488cded6d6cd83718b724d5a1f298713d1e1b946333bf5c38e611ad7a8e1290ca4e3aa86385cbafd71fa939f3ceb4a165c84da8a97bdf5076c1b09f937a9e03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -12826,14 +14259,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "28368a8b63ac2e94bbdc0211da50e8b90fb8aae206cbf81001324480ca47c9b2" + "link_hash": "7d64742be0f211d03ee5eeb30400a69f77d275ea1c56f9c21e1e0325ebe956e2" } }, { "name": "session_tree_22", "about": "an output tree of 22 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":11,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":11,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":11,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":22,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e2c1d24acc4802ad8f7ed12795c6ff83981ab85bf35a35cc95fce22d6483e3ed\",\"primary_units\":11,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":22},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"54ef3a67c82a1233abe7a83d9f7de2b7bdb8badfadf72435f982b8e9f9675dc7ca000cf67a61b1b9c4a781a4153de97af9c32c2f917558908868c229b7e6a30d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":11,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":11,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":11,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":22,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e2c1d24acc4802ad8f7ed12795c6ff83981ab85bf35a35cc95fce22d6483e3ed\",\"primary_units\":11,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":22},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4602b274d9f1577f16e077733ba4ff2f870e9c039d72772863cd381489da39e9ed19ad3508e89c5d70f87a743c390666d9ffe90432d4b66e089775ffbb911d01\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -13062,14 +14495,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "9e45dfe5435f188086d3232e66f25a769a927ffac3194d341e886966bb5ee2ba" + "link_hash": "9266f2d6a782682a4022213b62cbe0daffbf415103519ac1608f36f1d44bcddd" } }, { "name": "session_tree_23", "about": "an output tree of 23 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":12,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":11,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":11,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":23,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c1706ad43988ea927531a1945fc0eceba01aa1f951a42c25322f751680c970c3\",\"primary_units\":12,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":23},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c071cc52b3c29a638d9b207b5fa7d0b38a0f1180a0d65d65601179a1f0cebc027f4beef495f910a597b07fc06717ceb083b69dc5ac10d5a2c92089cc1afacd0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":12,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":11,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":11,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":23,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c1706ad43988ea927531a1945fc0eceba01aa1f951a42c25322f751680c970c3\",\"primary_units\":12,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":23},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6aac53f99decc9b27621656bea2cc2f462a515158c8e741e919892a11fd56fe4483fe160df293f2b38fbf1e2f6112e1c6df8b14d6a0cf131b47b71f16b82ca06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -13308,14 +14741,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "bdb535a4aed21101d486db88056ff45b83e88746856b9e91adb69a50bdde56d9" + "link_hash": "d846736faf20133c1c9b9a5581b96e8d95b717f870c853442068715f3c7750c2" } }, { "name": "session_tree_24", "about": "an output tree of 24 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":12,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":12,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":12,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":24,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"df43658f2f1e835d5edef15ec526c37f356fbc8b042ea53d3d67b1d5f872ac21\",\"primary_units\":12,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":24},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b31b8a737f4c1fdf153ec2bd088778682163a9a8cd31090a483a6200e9ea9b18a6a8907c7f838999485c4d07ba326874618485249e5b13927c41169ccd86530f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":12,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":12,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":12,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":24,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"df43658f2f1e835d5edef15ec526c37f356fbc8b042ea53d3d67b1d5f872ac21\",\"primary_units\":12,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":24},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"49295fec1953a60d07887f63a89324c25f5e80321205adcb44d536f7bdffa2c9a037a4b14514f612929d3677e5e116eb284611ac32a943fcb58c041bd2429508\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -13564,14 +14997,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "ca97d46c5c919f7fec636022a32acb1d38408863ea7beabd67d3683aa5d20b2b" + "link_hash": "495b0cee70d6956b81e6248f4abe57d241b81ac14ddce750fd67d660b693616f" } }, { "name": "session_tree_25", "about": "an output tree of 25 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":13,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":12,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":12,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":25,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"6a319e4ce53ced0062c395e423842bc9af41bd7d68f95898b03e26a5e75f4255\",\"primary_units\":13,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":25},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"aebaca46893fee829dae1267509449dece16a16a2f079959428ed02fe6d9a86bfe3c533f7a5c1f3de5bafec1efc5ba48e1d7e5bdf7e893b67ce97dd45ec6c003\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":13,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":12,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":12,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":25,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"6a319e4ce53ced0062c395e423842bc9af41bd7d68f95898b03e26a5e75f4255\",\"primary_units\":13,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":25},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bdd27711989c632661fc6b16fb8de9de9d9ce8597e10d1d97ab7f0912aa69780324eadb9a6d95c478ba5408b1a27fe4230999e4178de72cc5ed61d087aaf9905\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -13830,14 +15263,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "7fe2a76a4dfe75777f119914f29708ca9a7cec1ad95b4b016d135b62a30994ea" + "link_hash": "d80d3d76c020740dd5e1a58d86e341c486cb866d84768cf02db17790618da3d4" } }, { "name": "session_tree_26", "about": "an output tree of 26 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":13,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":13,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":13,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":26,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"331b342dee8be26cbe3849aea25a508d9586027ca277621c82d5ee07556a0395\",\"primary_units\":13,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":26},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f5973b1f4379edf36580d169381792e8779d24b7b88e56baa40df17eac5690044cd190897fb1d77a10196232230af6935aef7ff930fb6277adadd786bcc9a60a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":13,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":13,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":13,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":26,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"331b342dee8be26cbe3849aea25a508d9586027ca277621c82d5ee07556a0395\",\"primary_units\":13,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":26},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a606c742c2522b17a81acd7828ada2ffdd7d047627b9729ee67ba4cc090831d0aa84a042be59f44543b14387e1431dc95766605d3aa3f2a6638f76b6508d050e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -14106,14 +15539,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "4fb43b8d8066300fbcedfde1e9a8bdb78040f211a55d65139a9ad7d781108bc3" + "link_hash": "35f2ef20ead02718a87765606b177ac8792ceb3456c31b254155176666e2b5f3" } }, { "name": "session_tree_27", "about": "an output tree of 27 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":14,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":13,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":13,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":27,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c1bf47037d75653268c19bbc5db2ecad9687ca692052410bc841d75a4df69ed8\",\"primary_units\":14,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":27},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"212fe69449cc78b81aabff8a05509642d8687ff5c8997d9742b65e5c261d63da650cffc91a321c7069341af448f2f7ffbcfc1f1a9cfb9994496a2f8695b92b00\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":14,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":13,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":13,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":27,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c1bf47037d75653268c19bbc5db2ecad9687ca692052410bc841d75a4df69ed8\",\"primary_units\":14,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":27},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"46d1b9d4163cdaf1a2b77d3d2de974b3b4f58da8de409cca5d7413e4f4138498bb89a72b134aa22ff2bd916e3d1f1dc1a53ba825761bbfc7ea1c41cb396c3405\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -14392,14 +15825,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "0b1dc4a31b621ff7d78d4d2aa0536234c0ef6fd54cfa94ebe5210916aa8387a1" + "link_hash": "466ccc799f4a64a835cf8dcf3da6c3f0e4a8330568f1635286c431200ada2031" } }, { "name": "session_tree_28", "about": "an output tree of 28 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":14,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":14,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":14,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":28,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e320934292bf4e59bce2231b174ef6f7c535e350808d70c0f26fa4bc095930cc\",\"primary_units\":14,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":28},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6d87e1d9a14e68755e39580f984d5ea0ed8100548be09e4a0b5d7cebfedebce330eac95d975b3f209210b7200a2fb137c1d9b4ff4838af397d4a52c3a5f80508\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":14,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":14,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":14,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":28,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"e320934292bf4e59bce2231b174ef6f7c535e350808d70c0f26fa4bc095930cc\",\"primary_units\":14,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":28},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4b2105482b3f887afe1b4aa240b595ce9ffe0d186690fb5ea5045ec78f1c57fd58853ac515dd4e40c3053c7a1b219e6fe33a98a085dc30f67e49688c76bdc209\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -14688,14 +16121,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "da69d75208050b2d5f0671dbd841835b177c5de4a688cd8b25322fb286194698" + "link_hash": "ff6b28075f19f8d484a4f4bb03c7ae88e367e62ac16241dce58e1fb3faac1ff3" } }, { "name": "session_tree_29", "about": "an output tree of 29 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":15,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":14,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":14,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":29,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"0142316a46b8018f4cd2852a88b6b6cb3d4aa1e367e8cda03f2757b2c35fdcac\",\"primary_units\":15,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":29},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"86dc3a9e99f0efcfe083b18e0f02daaaf1fc6cb4ac10475a83e2fbc5292e44d32332aa6d26df727fe89da2c67a2d16d6f5786fc4f8c2daa7c43cd8383f68f303\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":15,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":14,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":14,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":29,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"0142316a46b8018f4cd2852a88b6b6cb3d4aa1e367e8cda03f2757b2c35fdcac\",\"primary_units\":15,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":29},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8a3f99fbbb04dee2e3c51adb1019131be71f3b9c14f71872eb9406edaf8758f42d15248b1f385963c85b801a483b6074a16bcf48c90153fbeda4f956b7069704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -14994,14 +16427,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "d7506adf5010df4db232ea22587f83c703ee381a4265ccb1d7c9b627327899c9" + "link_hash": "ee6936841d2daaeda1dafdd78f8733c684ed2949dce594b275634c81ab587152" } }, { "name": "session_tree_30", "about": "an output tree of 30 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":15,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":15,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":15,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":30,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8ff1929ac5ac4f41d42855c3ae620ff1d929e910e27df6bc290e874488df3f00\",\"primary_units\":15,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":30},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f64059d9dde64710148c9585aba58ff36509053a56dfb64be03d560bb3bafbe1ff8664e796f37e0571d361d2ff91e6f2fe1817b8286e3fe4ff2c8a86c84cbe03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":15,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":15,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":15,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":30,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8ff1929ac5ac4f41d42855c3ae620ff1d929e910e27df6bc290e874488df3f00\",\"primary_units\":15,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":30},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4c71a376550a8a140824203031fcf07041098adc89047bf481ef3d2e8bf14b616a6a8d1bea331c9599f489092559b8fab9ce184ee0a7e3fd726e7f117a05810d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -15310,14 +16743,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "3b66c31c21944ac975a96efa3faddbe43f4a96e8c11f201a211e1448c8678e45" + "link_hash": "f230ea49bca1744c91c01d6a2d5865c363d1b05e0d9ccbdbc77a4b3c06e24cb1" } }, { "name": "session_tree_31", "about": "an output tree of 31 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":16,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":15,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":15,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":31,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"7023712a5337d037350fb6033f0adb98a9cb0b87d53ba952a020bad604b123b7\",\"primary_units\":16,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":31},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a26258e7fa8ba8e7b004eba9e8866fa5c7e20673009744c49354f604355dac1be4c3efd52e2d285e8c924406f45e20aa991baec26fcd5bc74f6170626ee5d00f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":16,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":15,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":15,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":31,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"7023712a5337d037350fb6033f0adb98a9cb0b87d53ba952a020bad604b123b7\",\"primary_units\":16,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":31},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c65e043c0e04f46e3d7af9bea62922e20227f7712e43cacdbf11ea89512a92697cd68d525a1c292ada1df888899250248125f6f3f0b5c9af5e90575ce9c4880b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -15636,14 +17069,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "680f7e5a6f39567e81641fda5d8268637dd0be50fc51663744ee019dbff36efd" + "link_hash": "b7f18707dbccece028798058796b9a18f0df9009d7344c4bc72b4c8ffc8d2e17" } }, { "name": "session_tree_32", "about": "an output tree of 32 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":16,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":16,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":16,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":32,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"1b90590a181bc187058842cbd1a0bb40257d3ecd33847f6c51bb9fef678668e8\",\"primary_units\":16,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":32},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a6fd56efb3d2ede35faf070b6bccdf4417d29f2b61a6baa41aaa38326e46d7cec5c9b331629c799fcf39caef95251e993da5efa4576b3149c05f8644dafcb005\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":16,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":16,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":16,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":32,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"1b90590a181bc187058842cbd1a0bb40257d3ecd33847f6c51bb9fef678668e8\",\"primary_units\":16,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":32},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e5e60e1e4e46052e101b2f3f8dadb86308f84a6b58cdabbfb68b4dfed69a60d3015589be0a85152347089719b71af156792b89830100bfc051cdc7d5932ce608\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -15972,14 +17405,14 @@ }, "expected": { "outcome": "accept", - "link_hash": "2960c12ffcac759473eff7d97fb41dca468301438544d8e40686831eb2b76b8f" + "link_hash": "c4b438a5edaa8095215af984eebc984b71657e9aceaf0c0b47542d7d089e4d9c" } }, { "name": "session_tree_33", "about": "an output tree of 33 leaves, half on a byte-exact decoder whose re-decode matches and half checked for membership only, whose re-decode does not and is not checked", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":17,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":16,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":16,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":33,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"0135af1be9acfa21689c2af62f95b658fbd74467b5f154c75650477c21a02be5\",\"primary_units\":17,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":33},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ce81a1f29c97e46e7b53aee1ab990b1553df4a7f1c299fd4d3a5fe1f2dd332bbef89dbd9e907ae767b53281677cfa1ad7a1c0d8ecfce554f88f0ccca7ee84207\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":17,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":16,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":16,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":33,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"0135af1be9acfa21689c2af62f95b658fbd74467b5f154c75650477c21a02be5\",\"primary_units\":17,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":33},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"22bf184ed01663236d901bcb82db841b3b3fb901d8fe9a3486700b79cf313820b5a1d2f15082f5baf96efde1ff7f52a428d59a38db3fedd6f4fd472a2c663806\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -16318,34 +17751,34 @@ }, "expected": { "outcome": "accept", - "link_hash": "75d61f2c05c1e6272d1446943f9083eb9a4c6e9df89e2e30f88be2da140fd33c" + "link_hash": "0a8687aed66b0773436ceb579853df5f2af0269cdca5914e00dfe1e64a12055e" } }, { "name": "session_missed_at_cap_accept", "about": "300 presentations missed, 256 written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":300,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fa88aaf0e76f627b5fca6f10dc71c42ee95f759d97c01ecbadd4126cd413180202f14e8b3eb267cf142f585a43d9e0dd0ab681b722ad6e6e804e082d47062305\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":300,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cdb95428ca737850cd4e6467d73c07840f290210a364c61af87723f3b25d92b5c685d24201a6fb059c84dd7bae053cdebdf91bd055f642c07625b84dd4923f05\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "accept", - "link_hash": "8df21b75c20e54925881fb4000beeaf142905c24f64fbf2af4f7d708344a976d" + "link_hash": "c0cbae7085f5bc35455dc1138ef0eb440e4311f8b093ea56af871261ea64b1ec" } }, { "name": "session_missed_all_written_accept", "about": "256 presentations missed, all written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":256,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"be10339ed6a0d44335fe99e6c9fa75ed01626afc818af86f382ac52b12b25ffde93cff38bd7d1b2c9b8b4667bc49fe38992c3bca7bc9f4424065218618036b07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":256,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"01f360589eb275c18ec602aa0a9fe6442a17359a1ea4e83d71d677baf604be6d3785c3a1647d2ab52a1692b308536c3cda9c4f26d46112c419697f33f86bc80f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "accept", - "link_hash": "6cb3c84af95c000ada8f69011c66082c3aa543a9f37af30ffd7299fe6e729267" + "link_hash": "9e05b50ea2586d3785ba249afdccba9f725798534732a1e2c58f95cccfe0bda6" } }, { "name": "session_missed_units_past_cap", "about": "300 presentations missed, 257 written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":300,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255},{\"late_us\":257,\"layers\":1,\"unit\":256}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7956dc8bc11bed20d0c4676a1d2415115961ca720e10c958ae010f3d174b55a1e24f3446d144044ed308ade670c31f1ca7508a9ed55acca0c718e64e24987401\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":300,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255},{\"late_us\":257,\"layers\":1,\"unit\":256}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ee52e50f0de3eef635c1e5811c668352424961619b8f730b020e28b3aa18f5d1bfb2a3a6f6a1a0a91eccfe32f51ea1e9e7bfa435dbfa791e09e71decda98ea07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -16356,7 +17789,7 @@ "name": "session_missed_written_above_missed", "about": "255 presentations missed, 256 written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":255,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6071abde85e1f9b963a9fb01c6afb9ad967345445556d9035b3e67645b31b570ad73911bc866016ebb581904a06c8c805ee095191812379f7f03a8d7835e3205\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":255,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a8dcc89b3e1220e8588d3dcef442a24a92240df4938ca8795bf19a9231690d90be70dabdb0ca1e9e7d126019bc2af2a7fa6c5ff0ea7c1fc813624e8aba8e7709\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -16367,7 +17800,7 @@ "name": "session_missed_none_written", "about": "300 presentations missed, none written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":300,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"12cc21277c81d19e9f1676f07c5bace001ddae5a73ad1aa241e1db15e274a16ae2747bc9cc97720e9adc2e3010c79b986a10d1bedab458324c7ee0943a2e620b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":300,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7675d9ddf25c04077bee810608bffc3e7b4315cb63363c286a45d97b5608452b41affc2f7d8c6c92df04f8fb7b8d83ec182cf8291530d033d9d3c72f4d677c05\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -16378,7 +17811,7 @@ "name": "session_missed_above_its_leaves", "about": "301 presentations missed of 300", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":301,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bc92a4cc3b09834e463d921825ff6c4ef869f82e8378674f29291991de71bb0510f5c4ae691229651102743c2de7020343fae754d5feec56f217ee2ebf250604\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":301,\"missed_units\":[{\"late_us\":1,\"layers\":1,\"unit\":0},{\"late_us\":2,\"layers\":1,\"unit\":1},{\"late_us\":3,\"layers\":1,\"unit\":2},{\"late_us\":4,\"layers\":1,\"unit\":3},{\"late_us\":5,\"layers\":1,\"unit\":4},{\"late_us\":6,\"layers\":1,\"unit\":5},{\"late_us\":7,\"layers\":1,\"unit\":6},{\"late_us\":8,\"layers\":1,\"unit\":7},{\"late_us\":9,\"layers\":1,\"unit\":8},{\"late_us\":10,\"layers\":1,\"unit\":9},{\"late_us\":11,\"layers\":1,\"unit\":10},{\"late_us\":12,\"layers\":1,\"unit\":11},{\"late_us\":13,\"layers\":1,\"unit\":12},{\"late_us\":14,\"layers\":1,\"unit\":13},{\"late_us\":15,\"layers\":1,\"unit\":14},{\"late_us\":16,\"layers\":1,\"unit\":15},{\"late_us\":17,\"layers\":1,\"unit\":16},{\"late_us\":18,\"layers\":1,\"unit\":17},{\"late_us\":19,\"layers\":1,\"unit\":18},{\"late_us\":20,\"layers\":1,\"unit\":19},{\"late_us\":21,\"layers\":1,\"unit\":20},{\"late_us\":22,\"layers\":1,\"unit\":21},{\"late_us\":23,\"layers\":1,\"unit\":22},{\"late_us\":24,\"layers\":1,\"unit\":23},{\"late_us\":25,\"layers\":1,\"unit\":24},{\"late_us\":26,\"layers\":1,\"unit\":25},{\"late_us\":27,\"layers\":1,\"unit\":26},{\"late_us\":28,\"layers\":1,\"unit\":27},{\"late_us\":29,\"layers\":1,\"unit\":28},{\"late_us\":30,\"layers\":1,\"unit\":29},{\"late_us\":31,\"layers\":1,\"unit\":30},{\"late_us\":32,\"layers\":1,\"unit\":31},{\"late_us\":33,\"layers\":1,\"unit\":32},{\"late_us\":34,\"layers\":1,\"unit\":33},{\"late_us\":35,\"layers\":1,\"unit\":34},{\"late_us\":36,\"layers\":1,\"unit\":35},{\"late_us\":37,\"layers\":1,\"unit\":36},{\"late_us\":38,\"layers\":1,\"unit\":37},{\"late_us\":39,\"layers\":1,\"unit\":38},{\"late_us\":40,\"layers\":1,\"unit\":39},{\"late_us\":41,\"layers\":1,\"unit\":40},{\"late_us\":42,\"layers\":1,\"unit\":41},{\"late_us\":43,\"layers\":1,\"unit\":42},{\"late_us\":44,\"layers\":1,\"unit\":43},{\"late_us\":45,\"layers\":1,\"unit\":44},{\"late_us\":46,\"layers\":1,\"unit\":45},{\"late_us\":47,\"layers\":1,\"unit\":46},{\"late_us\":48,\"layers\":1,\"unit\":47},{\"late_us\":49,\"layers\":1,\"unit\":48},{\"late_us\":50,\"layers\":1,\"unit\":49},{\"late_us\":51,\"layers\":1,\"unit\":50},{\"late_us\":52,\"layers\":1,\"unit\":51},{\"late_us\":53,\"layers\":1,\"unit\":52},{\"late_us\":54,\"layers\":1,\"unit\":53},{\"late_us\":55,\"layers\":1,\"unit\":54},{\"late_us\":56,\"layers\":1,\"unit\":55},{\"late_us\":57,\"layers\":1,\"unit\":56},{\"late_us\":58,\"layers\":1,\"unit\":57},{\"late_us\":59,\"layers\":1,\"unit\":58},{\"late_us\":60,\"layers\":1,\"unit\":59},{\"late_us\":61,\"layers\":1,\"unit\":60},{\"late_us\":62,\"layers\":1,\"unit\":61},{\"late_us\":63,\"layers\":1,\"unit\":62},{\"late_us\":64,\"layers\":1,\"unit\":63},{\"late_us\":65,\"layers\":1,\"unit\":64},{\"late_us\":66,\"layers\":1,\"unit\":65},{\"late_us\":67,\"layers\":1,\"unit\":66},{\"late_us\":68,\"layers\":1,\"unit\":67},{\"late_us\":69,\"layers\":1,\"unit\":68},{\"late_us\":70,\"layers\":1,\"unit\":69},{\"late_us\":71,\"layers\":1,\"unit\":70},{\"late_us\":72,\"layers\":1,\"unit\":71},{\"late_us\":73,\"layers\":1,\"unit\":72},{\"late_us\":74,\"layers\":1,\"unit\":73},{\"late_us\":75,\"layers\":1,\"unit\":74},{\"late_us\":76,\"layers\":1,\"unit\":75},{\"late_us\":77,\"layers\":1,\"unit\":76},{\"late_us\":78,\"layers\":1,\"unit\":77},{\"late_us\":79,\"layers\":1,\"unit\":78},{\"late_us\":80,\"layers\":1,\"unit\":79},{\"late_us\":81,\"layers\":1,\"unit\":80},{\"late_us\":82,\"layers\":1,\"unit\":81},{\"late_us\":83,\"layers\":1,\"unit\":82},{\"late_us\":84,\"layers\":1,\"unit\":83},{\"late_us\":85,\"layers\":1,\"unit\":84},{\"late_us\":86,\"layers\":1,\"unit\":85},{\"late_us\":87,\"layers\":1,\"unit\":86},{\"late_us\":88,\"layers\":1,\"unit\":87},{\"late_us\":89,\"layers\":1,\"unit\":88},{\"late_us\":90,\"layers\":1,\"unit\":89},{\"late_us\":91,\"layers\":1,\"unit\":90},{\"late_us\":92,\"layers\":1,\"unit\":91},{\"late_us\":93,\"layers\":1,\"unit\":92},{\"late_us\":94,\"layers\":1,\"unit\":93},{\"late_us\":95,\"layers\":1,\"unit\":94},{\"late_us\":96,\"layers\":1,\"unit\":95},{\"late_us\":97,\"layers\":1,\"unit\":96},{\"late_us\":98,\"layers\":1,\"unit\":97},{\"late_us\":99,\"layers\":1,\"unit\":98},{\"late_us\":100,\"layers\":1,\"unit\":99},{\"late_us\":101,\"layers\":1,\"unit\":100},{\"late_us\":102,\"layers\":1,\"unit\":101},{\"late_us\":103,\"layers\":1,\"unit\":102},{\"late_us\":104,\"layers\":1,\"unit\":103},{\"late_us\":105,\"layers\":1,\"unit\":104},{\"late_us\":106,\"layers\":1,\"unit\":105},{\"late_us\":107,\"layers\":1,\"unit\":106},{\"late_us\":108,\"layers\":1,\"unit\":107},{\"late_us\":109,\"layers\":1,\"unit\":108},{\"late_us\":110,\"layers\":1,\"unit\":109},{\"late_us\":111,\"layers\":1,\"unit\":110},{\"late_us\":112,\"layers\":1,\"unit\":111},{\"late_us\":113,\"layers\":1,\"unit\":112},{\"late_us\":114,\"layers\":1,\"unit\":113},{\"late_us\":115,\"layers\":1,\"unit\":114},{\"late_us\":116,\"layers\":1,\"unit\":115},{\"late_us\":117,\"layers\":1,\"unit\":116},{\"late_us\":118,\"layers\":1,\"unit\":117},{\"late_us\":119,\"layers\":1,\"unit\":118},{\"late_us\":120,\"layers\":1,\"unit\":119},{\"late_us\":121,\"layers\":1,\"unit\":120},{\"late_us\":122,\"layers\":1,\"unit\":121},{\"late_us\":123,\"layers\":1,\"unit\":122},{\"late_us\":124,\"layers\":1,\"unit\":123},{\"late_us\":125,\"layers\":1,\"unit\":124},{\"late_us\":126,\"layers\":1,\"unit\":125},{\"late_us\":127,\"layers\":1,\"unit\":126},{\"late_us\":128,\"layers\":1,\"unit\":127},{\"late_us\":129,\"layers\":1,\"unit\":128},{\"late_us\":130,\"layers\":1,\"unit\":129},{\"late_us\":131,\"layers\":1,\"unit\":130},{\"late_us\":132,\"layers\":1,\"unit\":131},{\"late_us\":133,\"layers\":1,\"unit\":132},{\"late_us\":134,\"layers\":1,\"unit\":133},{\"late_us\":135,\"layers\":1,\"unit\":134},{\"late_us\":136,\"layers\":1,\"unit\":135},{\"late_us\":137,\"layers\":1,\"unit\":136},{\"late_us\":138,\"layers\":1,\"unit\":137},{\"late_us\":139,\"layers\":1,\"unit\":138},{\"late_us\":140,\"layers\":1,\"unit\":139},{\"late_us\":141,\"layers\":1,\"unit\":140},{\"late_us\":142,\"layers\":1,\"unit\":141},{\"late_us\":143,\"layers\":1,\"unit\":142},{\"late_us\":144,\"layers\":1,\"unit\":143},{\"late_us\":145,\"layers\":1,\"unit\":144},{\"late_us\":146,\"layers\":1,\"unit\":145},{\"late_us\":147,\"layers\":1,\"unit\":146},{\"late_us\":148,\"layers\":1,\"unit\":147},{\"late_us\":149,\"layers\":1,\"unit\":148},{\"late_us\":150,\"layers\":1,\"unit\":149},{\"late_us\":151,\"layers\":1,\"unit\":150},{\"late_us\":152,\"layers\":1,\"unit\":151},{\"late_us\":153,\"layers\":1,\"unit\":152},{\"late_us\":154,\"layers\":1,\"unit\":153},{\"late_us\":155,\"layers\":1,\"unit\":154},{\"late_us\":156,\"layers\":1,\"unit\":155},{\"late_us\":157,\"layers\":1,\"unit\":156},{\"late_us\":158,\"layers\":1,\"unit\":157},{\"late_us\":159,\"layers\":1,\"unit\":158},{\"late_us\":160,\"layers\":1,\"unit\":159},{\"late_us\":161,\"layers\":1,\"unit\":160},{\"late_us\":162,\"layers\":1,\"unit\":161},{\"late_us\":163,\"layers\":1,\"unit\":162},{\"late_us\":164,\"layers\":1,\"unit\":163},{\"late_us\":165,\"layers\":1,\"unit\":164},{\"late_us\":166,\"layers\":1,\"unit\":165},{\"late_us\":167,\"layers\":1,\"unit\":166},{\"late_us\":168,\"layers\":1,\"unit\":167},{\"late_us\":169,\"layers\":1,\"unit\":168},{\"late_us\":170,\"layers\":1,\"unit\":169},{\"late_us\":171,\"layers\":1,\"unit\":170},{\"late_us\":172,\"layers\":1,\"unit\":171},{\"late_us\":173,\"layers\":1,\"unit\":172},{\"late_us\":174,\"layers\":1,\"unit\":173},{\"late_us\":175,\"layers\":1,\"unit\":174},{\"late_us\":176,\"layers\":1,\"unit\":175},{\"late_us\":177,\"layers\":1,\"unit\":176},{\"late_us\":178,\"layers\":1,\"unit\":177},{\"late_us\":179,\"layers\":1,\"unit\":178},{\"late_us\":180,\"layers\":1,\"unit\":179},{\"late_us\":181,\"layers\":1,\"unit\":180},{\"late_us\":182,\"layers\":1,\"unit\":181},{\"late_us\":183,\"layers\":1,\"unit\":182},{\"late_us\":184,\"layers\":1,\"unit\":183},{\"late_us\":185,\"layers\":1,\"unit\":184},{\"late_us\":186,\"layers\":1,\"unit\":185},{\"late_us\":187,\"layers\":1,\"unit\":186},{\"late_us\":188,\"layers\":1,\"unit\":187},{\"late_us\":189,\"layers\":1,\"unit\":188},{\"late_us\":190,\"layers\":1,\"unit\":189},{\"late_us\":191,\"layers\":1,\"unit\":190},{\"late_us\":192,\"layers\":1,\"unit\":191},{\"late_us\":193,\"layers\":1,\"unit\":192},{\"late_us\":194,\"layers\":1,\"unit\":193},{\"late_us\":195,\"layers\":1,\"unit\":194},{\"late_us\":196,\"layers\":1,\"unit\":195},{\"late_us\":197,\"layers\":1,\"unit\":196},{\"late_us\":198,\"layers\":1,\"unit\":197},{\"late_us\":199,\"layers\":1,\"unit\":198},{\"late_us\":200,\"layers\":1,\"unit\":199},{\"late_us\":201,\"layers\":1,\"unit\":200},{\"late_us\":202,\"layers\":1,\"unit\":201},{\"late_us\":203,\"layers\":1,\"unit\":202},{\"late_us\":204,\"layers\":1,\"unit\":203},{\"late_us\":205,\"layers\":1,\"unit\":204},{\"late_us\":206,\"layers\":1,\"unit\":205},{\"late_us\":207,\"layers\":1,\"unit\":206},{\"late_us\":208,\"layers\":1,\"unit\":207},{\"late_us\":209,\"layers\":1,\"unit\":208},{\"late_us\":210,\"layers\":1,\"unit\":209},{\"late_us\":211,\"layers\":1,\"unit\":210},{\"late_us\":212,\"layers\":1,\"unit\":211},{\"late_us\":213,\"layers\":1,\"unit\":212},{\"late_us\":214,\"layers\":1,\"unit\":213},{\"late_us\":215,\"layers\":1,\"unit\":214},{\"late_us\":216,\"layers\":1,\"unit\":215},{\"late_us\":217,\"layers\":1,\"unit\":216},{\"late_us\":218,\"layers\":1,\"unit\":217},{\"late_us\":219,\"layers\":1,\"unit\":218},{\"late_us\":220,\"layers\":1,\"unit\":219},{\"late_us\":221,\"layers\":1,\"unit\":220},{\"late_us\":222,\"layers\":1,\"unit\":221},{\"late_us\":223,\"layers\":1,\"unit\":222},{\"late_us\":224,\"layers\":1,\"unit\":223},{\"late_us\":225,\"layers\":1,\"unit\":224},{\"late_us\":226,\"layers\":1,\"unit\":225},{\"late_us\":227,\"layers\":1,\"unit\":226},{\"late_us\":228,\"layers\":1,\"unit\":227},{\"late_us\":229,\"layers\":1,\"unit\":228},{\"late_us\":230,\"layers\":1,\"unit\":229},{\"late_us\":231,\"layers\":1,\"unit\":230},{\"late_us\":232,\"layers\":1,\"unit\":231},{\"late_us\":233,\"layers\":1,\"unit\":232},{\"late_us\":234,\"layers\":1,\"unit\":233},{\"late_us\":235,\"layers\":1,\"unit\":234},{\"late_us\":236,\"layers\":1,\"unit\":235},{\"late_us\":237,\"layers\":1,\"unit\":236},{\"late_us\":238,\"layers\":1,\"unit\":237},{\"late_us\":239,\"layers\":1,\"unit\":238},{\"late_us\":240,\"layers\":1,\"unit\":239},{\"late_us\":241,\"layers\":1,\"unit\":240},{\"late_us\":242,\"layers\":1,\"unit\":241},{\"late_us\":243,\"layers\":1,\"unit\":242},{\"late_us\":244,\"layers\":1,\"unit\":243},{\"late_us\":245,\"layers\":1,\"unit\":244},{\"late_us\":246,\"layers\":1,\"unit\":245},{\"late_us\":247,\"layers\":1,\"unit\":246},{\"late_us\":248,\"layers\":1,\"unit\":247},{\"late_us\":249,\"layers\":1,\"unit\":248},{\"late_us\":250,\"layers\":1,\"unit\":249},{\"late_us\":251,\"layers\":1,\"unit\":250},{\"late_us\":252,\"layers\":1,\"unit\":251},{\"late_us\":253,\"layers\":1,\"unit\":252},{\"late_us\":254,\"layers\":1,\"unit\":253},{\"late_us\":255,\"layers\":1,\"unit\":254},{\"late_us\":256,\"layers\":1,\"unit\":255}],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"398a5d6a061bf262a4626d63d8dc14547ec91d7adf5a406d54d2d3d39d33b44b6fc45a3a08063b6b37c200c7450997f8cea1cd2f08e1c0e2927eeffd5e6f0a08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -16389,37 +17822,37 @@ "name": "session_deadline_zero_accept", "about": "a deadline of 0 and nothing missed", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":0,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9d6d286cce85081a0f510b38227d66933de9dd0a41a5d7ad34266172f1947f50d219ff718470f2eadddb92e8ad892cc78b40d00808d84e5ce03262de0504b00a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":0,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"41b54c7bb5d1ad6e3f06e838b084491ccada4ec00a4a1d90a6bc3005d53d4054054606c6946a3fbfa3111c9dbc1684c52ed2175d64240a7222c41bb308269d08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "accept", - "link_hash": "53f60d02c95bbeab93b73ef75ddc8c353e1ea1334eed77d1133c3a95697d68bb" + "link_hash": "cd81b5ea887f582445c51c31670be4910e69804e4695b30a0d23f4819bc6d030" } }, { "name": "session_switches_at_cap_accept", "about": "1100 switches, 1024 written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255}],\"switches_total\":1100,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5b7fd07eae373e3e3979d6df24b24c93016113124112cd6d1f36b850a29987cab58388a18e682925c0a0be2a967f9ced163e5b533370ae4b4e9e50b28c4a2104\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255}],\"switches_total\":1100,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"54babd19814b845735d0e0827dae1562f22d5371efd87c0989fa01c7a9d57029fb490ecd9d1e9b671ca5dd63c4e021b13c72df0bf717553ebcf092380c195202\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "accept", - "link_hash": "c845f28301caa1757aa8f1a5f1fdf48a4ed3417bd0f5b3d01a626f3062fc46a8" + "link_hash": "e8eb0244d08713e4b800124879cedadd0cfa7b80a0953c24c2e655cd007bab86" } }, { "name": "session_switches_all_written_accept", "about": "1024 switches, all written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255}],\"switches_total\":1024,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"78e0cdff3f3f0dd25ae4cd721441895a3f4d8b377f5229c5d039239142aab557e0488898addaf92eb9878084bf5aa8a160440119ceff685d11af609a85b8540b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255}],\"switches_total\":1024,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"a818752c62adb1fe986b2514500950aa30785493654dba54aacdbe679865c59d921030a7276a08263372b84c8f9a9e73f9a5976bd011094d45db3a7f0fa1bf0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "accept", - "link_hash": "2d879a01bbee499fb446b2088a8ca463a99829d5febf574f3a7c28c8e6eef4ef" + "link_hash": "4c02d3e64df3ef4cb42f5d1388975023aac8de39ad2cf461f058627f39ee542a" } }, { "name": "session_switches_past_cap", "about": "1100 switches, 1025 written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":256}],\"switches_total\":1100,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"2b0bf2abb3eb1b5cc8cb82f377efb841caa0f95ddd67df26c76afef3a300aca3da96ec2197d73c636946108e3970bcd85b571c421c64a1c309319743a7137808\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":256}],\"switches_total\":1100,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d32cf434971f3021492f0cd523925ebdaa1ca29eae746d97dbc65d3e9858d8f701b10f6990be98c1724495abbbc696b8f2d412f7bc024e30d2666669379f8508\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -16430,7 +17863,7 @@ "name": "session_switches_written_above_total", "about": "1023 switches, 1024 written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255}],\"switches_total\":1023,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1d736d34da02564b5a735e6c0580e5684d5ac8fffa6f2f60577ff9341c518f1aaeb4129945652852cb87f74101c74b57a703713953a29b701c463e7d9c632901\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":0},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":0},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":1},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":1},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":2},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":2},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":3},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":3},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":4},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":4},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":5},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":5},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":6},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":6},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":7},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":7},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":8},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":8},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":9},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":9},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":10},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":10},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":11},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":11},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":12},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":12},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":13},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":13},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":14},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":14},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":15},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":15},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":16},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":16},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":17},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":17},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":18},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":18},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":19},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":19},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":20},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":20},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":21},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":21},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":22},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":22},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":23},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":23},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":24},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":24},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":25},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":25},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":26},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":26},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":27},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":27},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":28},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":28},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":29},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":29},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":30},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":30},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":31},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":31},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":32},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":32},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":33},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":33},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":34},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":34},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":35},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":35},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":36},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":36},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":37},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":37},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":38},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":38},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":39},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":39},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":40},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":40},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":41},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":41},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":42},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":42},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":43},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":43},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":44},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":44},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":45},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":45},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":46},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":46},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":47},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":47},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":48},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":48},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":49},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":49},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":50},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":50},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":51},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":51},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":52},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":52},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":53},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":53},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":54},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":54},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":55},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":55},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":56},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":56},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":57},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":57},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":58},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":58},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":59},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":59},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":60},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":60},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":61},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":61},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":62},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":62},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":63},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":63},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":64},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":64},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":65},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":65},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":66},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":66},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":67},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":67},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":68},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":68},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":69},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":69},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":70},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":70},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":71},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":71},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":72},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":72},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":73},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":73},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":74},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":74},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":75},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":75},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":76},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":76},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":77},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":77},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":78},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":78},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":79},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":79},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":80},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":80},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":81},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":81},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":82},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":82},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":83},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":83},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":84},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":84},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":85},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":85},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":86},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":86},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":87},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":87},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":88},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":88},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":89},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":89},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":90},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":90},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":91},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":91},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":92},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":92},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":93},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":93},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":94},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":94},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":95},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":95},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":96},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":96},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":97},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":97},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":98},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":98},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":99},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":99},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":100},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":100},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":101},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":101},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":102},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":102},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":103},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":103},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":104},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":104},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":105},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":105},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":106},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":106},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":107},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":107},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":108},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":108},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":109},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":109},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":110},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":110},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":111},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":111},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":112},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":112},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":113},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":113},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":114},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":114},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":115},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":115},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":116},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":116},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":117},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":117},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":118},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":118},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":119},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":119},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":120},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":120},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":121},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":121},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":122},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":122},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":123},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":123},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":124},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":124},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":125},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":125},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":126},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":126},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":127},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":127},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":128},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":128},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":129},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":129},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":130},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":130},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":131},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":131},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":132},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":132},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":133},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":133},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":134},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":134},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":135},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":135},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":136},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":136},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":137},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":137},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":138},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":138},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":139},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":139},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":140},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":140},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":141},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":141},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":142},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":142},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":143},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":143},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":144},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":144},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":145},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":145},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":146},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":146},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":147},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":147},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":148},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":148},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":149},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":149},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":150},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":150},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":151},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":151},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":152},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":152},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":153},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":153},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":154},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":154},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":155},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":155},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":156},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":156},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":157},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":157},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":158},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":158},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":159},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":159},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":160},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":160},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":161},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":161},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":162},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":162},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":163},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":163},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":164},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":164},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":165},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":165},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":166},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":166},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":167},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":167},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":168},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":168},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":169},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":169},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":170},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":170},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":171},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":171},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":172},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":172},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":173},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":173},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":174},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":174},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":175},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":175},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":176},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":176},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":177},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":177},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":178},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":178},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":179},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":179},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":180},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":180},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":181},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":181},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":182},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":182},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":183},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":183},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":184},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":184},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":185},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":185},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":186},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":186},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":187},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":187},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":188},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":188},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":189},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":189},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":190},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":190},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":191},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":191},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":192},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":192},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":193},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":193},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":194},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":194},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":195},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":195},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":196},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":196},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":197},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":197},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":198},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":198},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":199},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":199},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":200},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":200},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":201},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":201},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":202},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":202},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":203},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":203},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":204},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":204},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":205},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":205},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":206},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":206},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":207},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":207},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":208},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":208},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":209},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":209},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":210},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":210},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":211},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":211},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":212},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":212},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":213},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":213},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":214},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":214},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":215},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":215},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":216},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":216},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":217},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":217},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":218},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":218},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":219},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":219},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":220},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":220},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":221},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":221},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":222},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":222},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":223},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":223},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":224},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":224},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":225},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":225},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":226},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":226},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":227},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":227},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":228},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":228},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":229},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":229},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":230},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":230},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":231},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":231},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":232},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":232},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":233},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":233},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":234},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":234},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":235},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":235},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":236},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":236},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":237},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":237},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":238},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":238},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":239},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":239},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":240},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":240},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":241},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":241},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":242},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":242},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":243},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":243},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":244},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":244},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":245},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":245},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":246},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":246},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":247},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":247},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":248},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":248},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":249},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":249},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":250},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":250},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":251},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":251},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":252},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":252},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":253},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":253},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":254},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":254},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255},{\"from\":\"primary\",\"reason\":\"trap\",\"to\":\"fallback\",\"unit\":255},{\"from\":\"fallback\",\"reason\":\"trap\",\"to\":\"primary\",\"unit\":255}],\"switches_total\":1023,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8ea77636da6ebbf921cd62222017ab916803379b9c2f22c6956f1eb38a2e69903fbf501d4d79fdda9b1d50621c15f0a433926eda38ce243feff1c18d138d2704\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, @@ -16441,7 +17874,7 @@ "name": "session_switches_none_written", "about": "the largest switch total, none written", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":10607,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":300,\"module_status\":null,\"object\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":9007199254740991,\"transferred\":14715,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"28d78c7fc20d11b0cd60ff0341b0a79857f1f516330b37fde1e841aa0f37764e033c26363ae051fc412585d7b38b9a8943abe1899ae391e24feaaab253e4b203\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"be586ec3398df154e2927f3a690aa827c04e7aa261ccdb07dd76337c63bf72ec\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":300,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":300,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"9b448c3b3b7da68d69396ebfb42a25c4a18d18ab10473eba7ba7c0cd052e8737\",\"primary_units\":300,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[],\"switches\":[],\"switches_total\":9007199254740991,\"transferred\":9995,\"uncounted\":2,\"units\":300},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1edbb7b392b378df69c840f6e09f99df24d1a514551bc2be9da937fa4fa3f587ac8d09518079e131be9a4fee5b621995276ce28967de737a20dfe4cb5e77e404\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "expected": { "outcome": "reject", "step": 4, diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index 97e2a9937..c1e45374a 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -992,6 +992,7 @@ A **decoder entry**: | `capability` | term | The capability decoded. | | `rendition` | integer or `null` | Its `WAI2` rendition index (SPEC §7.1): `capability` is that rendition's capability. `null` for a `WAI1` envelope. | | `object` | 32 B hex | The content hash (§2.1) of the object it decoded from: the `WAI2` envelope whose rendition it is, or the `WAI1` envelope — a base, or a layer that refines one. An entry decodes one object, so a sink that decodes several through one decoder names an entry for each. | +| `first_unit` | integer | The title's unit that is unit 0 of the object's base: of the object itself for a base or a rendition with no `refines`, and of the base it refines for a layer. A presentation through the entry of the title's unit `u` is of the object's unit `u − first_unit`. | | `path` | string | `primary` or `fallback`. | | `decoder` | string | `builtin:@` — `` 1 to 64 of `a`–`z`, `0`–`9`, `_` and `-`, `` 1 to 64 of ASCII letters, digits, `.`, `+` and `-`, beginning with a digit — or `module:sha256:` followed by a module's digest (§7.9), 64 lowercase hexadecimal digits. | | `variant` | term or `null` | A decode path within the decoder, where it has more than one, such as an exact and a floating-point path. | @@ -1062,20 +1063,27 @@ at, the index of the decoder entry that produced it, and the SHA-256 of its outp `missed_units` entry names a presentation of the list. 3. A verifier that holds the objects **MAY** decode a presentation again where its entry's `capability` has the replicate class `neural-int-exact` or `standard-defined` - (SPEC §7), and then **MUST** find its `out_digest` - (`session_output_irreproducible`). Every other presentation is checked for - membership only. + (SPEC §7) — the entry's object's unit `unit − first_unit`, at `layers` — and then + **MUST** find its `out_digest` (`session_output_irreproducible`). Every other + presentation is checked for membership only. **Against the objects** (§3.1 step 6). The context lists each object received: `{ "content_hash", "path", "counted", "transferred", "presented" }`, with `counted` the -object's counted bytes, or `null` for one that is not countable. In order: -1. The session's `subject`, its entry object, is the content hash of an object received +object's counted bytes, or `null` for one that is not countable; `transferred` every byte +received for it; and `presented` whether a decoder entry names it. An object received more +than once on a path — fetched again, or in byte ranges — is listed once, its `transferred` +the bytes of every receipt. These rules need the objects and the claim alone. In order: +1. No `content_hash` is listed twice with one `path` (`session_object_duplicate`). +2. The session's `subject`, its entry object, is the content hash of an object received (`session_entry_not_received`). -2. So is each decoder entry's `object` (`session_source_not_received`). -3. `counted_primary` and `counted_fallback` are the sums of `counted` over the objects of +3. So is each decoder entry's `object` (`session_source_not_received`). +4. `counted_primary` and `counted_fallback` are the sums of `counted` over the objects of each path, `counted_discarded` its sum over the objects not presented, `uncounted` the number of objects whose `counted` is `null`, and `transferred` the sum of `transferred` (`session_counted_mismatch`). +5. An object is `presented` exactly when a decoder entry's `object` is its content hash + (`session_presented_mismatch`). The sums above can agree with figures a sink stated + falsely; this cannot. **The classical rendition** of a `WAI2` envelope is the first of its renditions, in manifest order, that is selectable — not a companion or a refinement, and a capability a @@ -1088,24 +1096,46 @@ the envelope; nothing names it. **Against the envelopes** (§3.1 step 6). The context is the bytes of envelopes the session received: every `WAI2` envelope among them, and any `WAI1` envelope — a base or -a layer — the verifier holds. In order: +a layer — the verifier holds. An envelope is **readable** when it reads as a `WAI1` or +`WAI2` envelope (SPEC §2, §7.1) whose payloads are plaintext; one that does not — an +encrypted one, inert at a sink that cannot open it (SPEC §6.4), one whose `security` +member is not a security object, or bytes that are not an envelope at all — is inert. An +inert envelope no decoder entry names is an object received, neither counted (its +`counted` is `null`, staged-measurement §3.2) nor presented. Rules 1 and 2 need the +objects as well, rules 5 and 6 the outputs; the others need the envelopes and the claim. +In order: 1. Where the verifier holds the objects as well, each envelope is among the objects received, by its content hash (`session_source_not_received`). -2. Each reads as a `WAI1` or `WAI2` envelope (SPEC §2, §7.1) whose payloads are - plaintext. An encrypted one is inert at a sink that cannot open it (SPEC §6.4), and a - `security` member that is not a security object leaves it inert too - (`session_envelope_unreadable`). -3. Each decoder entry whose `object` is one of the envelopes names what that envelope +2. Where it holds the objects as well, each object listed with an envelope's content hash + states as `counted` that envelope's counted bytes (staged-measurement §3), and `null` + exactly when it is not countable (`session_counted_mismatch`). +3. Each envelope a decoder entry names is readable (`session_envelope_unreadable`). +4. Each decoder entry whose `object` is a readable envelope names what that envelope gives: of a `WAI2` envelope, a `rendition` and the capability that rendition has; of a `WAI1` envelope, no `rendition` and the manifest's `capability` or its `fallback`. And each decoder entry whose `rendition` is not `null` has its `object` among the - envelopes, which hold every `WAI2` envelope the session received + readable envelopes, which hold every `WAI2` envelope the session received (`session_source_mismatch`). A signer cannot relabel a decoder entry whose envelope the verifier holds, and so cannot move a presentation through it out of the reach of the re-decode check above. -4. The lengths of the `WAI2` envelopes' classical renditions whose capability no decoder - entry decoded sum to `classical_declared`, which is `null` exactly when there is none - (`session_classical_mismatch`). +5. Where it holds the outputs as well, each presentation through a decoder entry whose + envelope is held is at the layer count that envelope gives: 1 for a base, or a + rendition with no `refines`, and `refines.layer + 1` for a layer + (`session_layers_mismatch`). A `refines` that is malformed (staged-delivery §3) gives + no count to check. +6. Where it holds the outputs as well, each presentation through a decoder entry whose + envelope is held is of a unit that envelope covers: its `unit` is at least + `first_unit + a` and below `first_unit + a + n`, where for a base, or a rendition with + no `refines`, `a` is 0 and `n` the units its payload holds — a `WIV1` clip's frames, and + one for a `WIH1` picture, a `WIA1` clip and a `WIS1` tensor; for a layer, `a` and `n` + are its `span`'s `from` and `count`, or, with no span, 0 and the units of its base, + read where the base's envelope is held (a `WAI1` base by its content hash, a `WAI2` + rendition by its component id) (`session_unit_outside_object`). Where WAI reads no + unit count — a payload in no format SPEC §5 pins, one that does not parse as its own, + or a base not held — the presentation is not checked. +7. The lengths of the readable `WAI2` envelopes' classical renditions whose capability no + decoder entry decoded sum to `classical_declared`, which is `null` exactly when there + is none (`session_classical_mismatch`). **Against the stage claims** (§3.1 step 6). The context is the wire form of each `stage` claim the verifier holds of those `stage_sets` names. A set has a claim for each of its @@ -1868,11 +1898,15 @@ and never folds it in: confirmation changes the outcome of no step here. | 6 | `session_output_mismatch` | a session's presentations are not `leaf_count`, repeat a (unit, layers), or give another `output_root` | | 6 | `session_output_inconsistent` | the presentations name an entry that does not exist or a `layers` of 0, or give another `units`, another entry's `leaves`, another first-use order, other `primary_units` or `fallback_units`, or no presentation for a `missed_units` entry | | 6 | `session_output_irreproducible` | a presentation decoded again, through a decoder its replicate class makes byte-exact, gives another `out_digest` | +| 6 | `session_object_duplicate` | an object received is listed twice with one path | | 6 | `session_entry_not_received` | a session's entry object is not among the objects it received | | 6 | `session_source_not_received` | a decoder entry's `object`, or an envelope held as the session's, is not among the objects it received | -| 6 | `session_counted_mismatch` | the objects received give other counted, uncounted or transferred bytes | -| 6 | `session_envelope_unreadable` | an envelope held as the session's is not a `WAI1` or `WAI2` envelope whose payloads are plaintext | +| 6 | `session_counted_mismatch` | the objects received give other counted, uncounted or transferred bytes, or an object whose envelope is held states other counted bytes than that envelope gives | +| 6 | `session_presented_mismatch` | an object is listed as presented and no decoder entry names it, or as not presented and one does | +| 6 | `session_envelope_unreadable` | an envelope a decoder entry names is not a `WAI1` or `WAI2` envelope whose payloads are plaintext | | 6 | `session_source_mismatch` | a decoder entry names other than its object's envelope gives — another rendition, a capability that rendition or that `WAI1` manifest does not have, or a rendition of a `WAI1` envelope — or names a rendition and its envelope is not held | +| 6 | `session_layers_mismatch` | a presentation through a decoder entry whose envelope is held is at another layer count than that envelope gives | +| 6 | `session_unit_outside_object` | a presentation through a decoder entry whose envelope is held is of a unit that envelope does not cover, from its `first_unit` | | 6 | `session_classical_mismatch` | the envelopes' classical renditions the session did not decode give another `classical_declared` | | 6 | `session_stage_disagrees` | a `stage` claim the session names is about a base, or lists an arrived layer object, the session did not receive; counts a unit the session never presented, or more units at a stage than the session presented at it or above; or no claim whose set holds a unit lists an applied layer that reaches a stage the session presented it at | @@ -2362,7 +2396,16 @@ capability another envelope has — refused against the envelope of the object i an entry's object it did not receive (`session_source_not_received`); the classical rendition read from envelopes whose second rendition is of each kind a rule excludes and of two it admits; an encrypted envelope, a `WAI1` envelope with no manifest members and -bytes of neither magic (`session_envelope_unreadable`); a `stage` claim that verifies, one that does not, one by another key, +bytes of neither magic, each named by an entry (`session_envelope_unreadable`), and +accepted where no entry names them; an object listed twice +(`session_object_duplicate`) and one fetched twice and listed once (accepted); figures a +sink stated rather than derived — counted bytes above what the held envelope gives +(`session_counted_mismatch`), and an object marked presented that no entry names, or +not presented that one does (`session_presented_mismatch`); a session holding its base's +and a layer's envelopes, accepted, and a presentation at more layers than its envelope +gives (`session_layers_mismatch`), of a unit past the base's frames, outside the layer's +span, or outside a `WAI2` rendition's frame, and through an entry whose `first_unit` is +moved (`session_unit_outside_object`); a `stage` claim that verifies, one that does not, one by another key, one the session does not name, one about a base the session never received, one whose arrived layers the session never received, and sessions presenting stages its applied layers cannot have given — through layers it lists as late or refused among them — and diff --git a/wai/signer-conformance/vectors.json b/wai/signer-conformance/vectors.json index 2a86f6814..0a6663298 100644 --- a/wai/signer-conformance/vectors.json +++ b/wai/signer-conformance/vectors.json @@ -4242,7 +4242,7 @@ "name": "session_needs_its_class", "about": "an unmetered session by a key holding delivery and receipt: delivering objects is not reconstructing them", "procedure": "confirm", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d0aaa0d6d1ea47fc4110718b999f18dc30b94de24f200a605dbd205cb79464bb1dd737d37b82007b34e85ac4294d6e39e147d9e4cada43f7eef77edc9e0efc0a\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3c551db8e32d45ad49aeb49a18598a5b2f70fdeaf2869cc9e76bdcfc7eafd0a597fe564b9742286ed56d2fd482fe07b73230f3c34cea4ffcc9e6566d15964a0c\",\"signer_id\":\"did:web:publisher.example#d1\",\"signer_pubkey\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", "context": { "revisions": [ "{\"grant_max_s\":43200,\"issued_at\":\"2026-09-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"may_sign\":[\"delivery\",\"receipt\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"m1\",\"key\":\"2bc2800b3316e009209ffd757dab19ccf0ae84bc7ae90654e1e81712d270f653\",\"may_sign\":[\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"op\",\"key\":\"d62f016a1efd1e4fdf793eb42cd84471e1ba9f0cf04d1287b5cc71f616287cb8\",\"may_sign\":[\"lawful-basis/declaration\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"modd\",\"key\":\"8320a51977d8c38ca8a4927c670df5821e449761945e15e9efb26a1509d230ea\",\"may_sign\":[\"module/decoder\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"37332d293232e6e91c92aaccdd9fe2295a77447c7f4cd9df7e306b602643f5ac\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"af06a3e3291714e4f356c19c9b15cd1951ec6e6662aa77be07547f289383341d\",\"seq\":0,\"sig\":\"44f48a651622c387576e25fd7f62e99a9409636794600f07a2635c2a3b09c8426d0bb87aa5716abb77274b46958e7a93722f3d8c5c15484f93522fb95bfe7205\",\"status_max_age_s\":3600}", @@ -4265,7 +4265,7 @@ "name": "session_confirmed", "about": "an unmetered session by a sink's key holding reconstruct-session, under a fetched anchor: not pinned-only, and no figure to confirm", "procedure": "confirm", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"97bbf4648716f5b483f60ae0e7125d2c9782b39a3c927606f9f392155a0c8ed88456bb13fabd3fb856e4f0a10bf3883b98b2a39c85d46fac0aa4032515b3980b\",\"signer_id\":\"did:web:publisher.example#ss\",\"signer_pubkey\":\"ee31f83c88a71219a6fcf9bee0da9bc22620588f5a15a6145553504df9649e5c\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"88b3e76214d4522aed4f0af165add4c9486d05fab0485f7eccff6fc02cd29d569d5bcdbaa29cb1ca5ad0cc579f962c5a68c31b0dd71fb2030425f484c591b301\",\"signer_id\":\"did:web:publisher.example#ss\",\"signer_pubkey\":\"ee31f83c88a71219a6fcf9bee0da9bc22620588f5a15a6145553504df9649e5c\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", "context": { "revisions": [ "{\"grant_max_s\":43200,\"issued_at\":\"2026-09-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"may_sign\":[\"delivery\",\"receipt\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"m1\",\"key\":\"2bc2800b3316e009209ffd757dab19ccf0ae84bc7ae90654e1e81712d270f653\",\"may_sign\":[\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"op\",\"key\":\"d62f016a1efd1e4fdf793eb42cd84471e1ba9f0cf04d1287b5cc71f616287cb8\",\"may_sign\":[\"lawful-basis/declaration\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"modd\",\"key\":\"8320a51977d8c38ca8a4927c670df5821e449761945e15e9efb26a1509d230ea\",\"may_sign\":[\"module/decoder\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"37332d293232e6e91c92aaccdd9fe2295a77447c7f4cd9df7e306b602643f5ac\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"af06a3e3291714e4f356c19c9b15cd1951ec6e6662aa77be07547f289383341d\",\"seq\":0,\"sig\":\"44f48a651622c387576e25fd7f62e99a9409636794600f07a2635c2a3b09c8426d0bb87aa5716abb77274b46958e7a93722f3d8c5c15484f93522fb95bfe7205\",\"status_max_age_s\":3600}", @@ -4288,7 +4288,7 @@ "name": "session_figure_not_granted", "about": "a metered session by a key holding reconstruct-session but not energy/OnChipCounter, under a pinned anchor: the session is confirmed and its figure refused", "procedure": "confirm", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6ee5fae8ea62fb0b8e6a8d38c79c114b803117362cb62c52866db79084cff90d29c98a8d2c614a99c1489e56b8661ab94dbdfe131512c2e2d64c8c7794d50a08\",\"signer_id\":\"did:web:publisher.example#ss\",\"signer_pubkey\":\"ee31f83c88a71219a6fcf9bee0da9bc22620588f5a15a6145553504df9649e5c\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"203dd7a51dc303e44737c322b507979096a0736caa227f67545df8fb919191e5c18c084afc33e9d3151864a3d678bead38f3e81f93eaf97d89d03a3ef259540c\",\"signer_id\":\"did:web:publisher.example#ss\",\"signer_pubkey\":\"ee31f83c88a71219a6fcf9bee0da9bc22620588f5a15a6145553504df9649e5c\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", "context": { "revisions": [ "{\"grant_max_s\":43200,\"issued_at\":\"2026-09-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"may_sign\":[\"delivery\",\"receipt\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"m1\",\"key\":\"2bc2800b3316e009209ffd757dab19ccf0ae84bc7ae90654e1e81712d270f653\",\"may_sign\":[\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"op\",\"key\":\"d62f016a1efd1e4fdf793eb42cd84471e1ba9f0cf04d1287b5cc71f616287cb8\",\"may_sign\":[\"lawful-basis/declaration\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"modd\",\"key\":\"8320a51977d8c38ca8a4927c670df5821e449761945e15e9efb26a1509d230ea\",\"may_sign\":[\"module/decoder\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"37332d293232e6e91c92aaccdd9fe2295a77447c7f4cd9df7e306b602643f5ac\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"af06a3e3291714e4f356c19c9b15cd1951ec6e6662aa77be07547f289383341d\",\"seq\":0,\"sig\":\"44f48a651622c387576e25fd7f62e99a9409636794600f07a2635c2a3b09c8426d0bb87aa5716abb77274b46958e7a93722f3d8c5c15484f93522fb95bfe7205\",\"status_max_age_s\":3600}", @@ -4311,7 +4311,7 @@ "name": "session_figure_unpinned", "about": "a metered session by a key holding both authorities, under a fetched anchor: the session is confirmed and its hardware-class figure unconfirmed", "procedure": "confirm", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"845a22b8d9750a2644760a4b51482a7a7f686a5f93488d946a6444d18aec2b61c1b43857930da7af5dbf5e8037b273b9efa5019f30bd2de870f1a75075ba630a\",\"signer_id\":\"did:web:publisher.example#se\",\"signer_pubkey\":\"4745d19c66ec9179fa25097056409ef16967b6a1a74bfd8f7afd528f59630615\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1e04120e4379d1483b6bc02ecdfae24c1667f1aab8927e4d57b68a04aaabffe80be8d73a3ad0a1a222af6a911c90fa2a7c3421e963e65806c50519bfe05dbf08\",\"signer_id\":\"did:web:publisher.example#se\",\"signer_pubkey\":\"4745d19c66ec9179fa25097056409ef16967b6a1a74bfd8f7afd528f59630615\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", "context": { "revisions": [ "{\"grant_max_s\":43200,\"issued_at\":\"2026-09-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"may_sign\":[\"delivery\",\"receipt\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"m1\",\"key\":\"2bc2800b3316e009209ffd757dab19ccf0ae84bc7ae90654e1e81712d270f653\",\"may_sign\":[\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"op\",\"key\":\"d62f016a1efd1e4fdf793eb42cd84471e1ba9f0cf04d1287b5cc71f616287cb8\",\"may_sign\":[\"lawful-basis/declaration\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"modd\",\"key\":\"8320a51977d8c38ca8a4927c670df5821e449761945e15e9efb26a1509d230ea\",\"may_sign\":[\"module/decoder\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"37332d293232e6e91c92aaccdd9fe2295a77447c7f4cd9df7e306b602643f5ac\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"af06a3e3291714e4f356c19c9b15cd1951ec6e6662aa77be07547f289383341d\",\"seq\":0,\"sig\":\"44f48a651622c387576e25fd7f62e99a9409636794600f07a2635c2a3b09c8426d0bb87aa5716abb77274b46958e7a93722f3d8c5c15484f93522fb95bfe7205\",\"status_max_age_s\":3600}", @@ -4334,7 +4334,7 @@ "name": "session_figure_confirmed", "about": "a metered session by a key holding both authorities, under a pinned anchor: both confirmed, and the figure's key does not deliver", "procedure": "confirm", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"845a22b8d9750a2644760a4b51482a7a7f686a5f93488d946a6444d18aec2b61c1b43857930da7af5dbf5e8037b273b9efa5019f30bd2de870f1a75075ba630a\",\"signer_id\":\"did:web:publisher.example#se\",\"signer_pubkey\":\"4745d19c66ec9179fa25097056409ef16967b6a1a74bfd8f7afd528f59630615\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1e04120e4379d1483b6bc02ecdfae24c1667f1aab8927e4d57b68a04aaabffe80be8d73a3ad0a1a222af6a911c90fa2a7c3421e963e65806c50519bfe05dbf08\",\"signer_id\":\"did:web:publisher.example#se\",\"signer_pubkey\":\"4745d19c66ec9179fa25097056409ef16967b6a1a74bfd8f7afd528f59630615\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", "context": { "revisions": [ "{\"grant_max_s\":43200,\"issued_at\":\"2026-09-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"may_sign\":[\"delivery\",\"receipt\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"m1\",\"key\":\"2bc2800b3316e009209ffd757dab19ccf0ae84bc7ae90654e1e81712d270f653\",\"may_sign\":[\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"op\",\"key\":\"d62f016a1efd1e4fdf793eb42cd84471e1ba9f0cf04d1287b5cc71f616287cb8\",\"may_sign\":[\"lawful-basis/declaration\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"modd\",\"key\":\"8320a51977d8c38ca8a4927c670df5821e449761945e15e9efb26a1509d230ea\",\"may_sign\":[\"module/decoder\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"37332d293232e6e91c92aaccdd9fe2295a77447c7f4cd9df7e306b602643f5ac\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"af06a3e3291714e4f356c19c9b15cd1951ec6e6662aa77be07547f289383341d\",\"seq\":0,\"sig\":\"44f48a651622c387576e25fd7f62e99a9409636794600f07a2635c2a3b09c8426d0bb87aa5716abb77274b46958e7a93722f3d8c5c15484f93522fb95bfe7205\",\"status_max_age_s\":3600}", @@ -4357,7 +4357,7 @@ "name": "session_under_did_key", "about": "a metered session signed under a did:key, the normal case for a sink's ephemeral key: unconfirmed, and so is its figure", "procedure": "confirm", - "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"41033086df07fbb39325d6163c1e43e64395c74323dbd1b074928baeddadacda3e55170595b20dbbda8f2859f66bafd26c162a4afe1d894fd3595fe80823ee06\",\"signer_id\":\"did:key:z6MkjFUjszw2hrv4RXs95YXbtwuiuAuHhsqxMzPCcY9pXT3S\",\"signer_pubkey\":\"4745d19c66ec9179fa25097056409ef16967b6a1a74bfd8f7afd528f59630615\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":4000,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.neural.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"path\":\"primary\",\"pin\":\"1d279149536528e910f4da130bb6473bbcc76df60a933030e9750aabee9d4ae7\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null}],\"energy\":{\"energy_calibration_ref\":null,\"energy_counter_filtering\":\"Unknown\",\"energy_provenance\":\"OnChipCounter\",\"energy_uncertainty\":{\"relative_ppm\":20000,\"window_us\":1000000},\"joules_micro\":90000},\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":null,\"toolchain\":null},\"profile\":\"native-ffi\",\"target\":null,\"threads\":1},\"leaf_count\":1,\"media\":\"image\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f422613aae3364b94e36f4d9df35224db0b02f0c16259b364b4e357d306b3c7c\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"b2b2ef087cf5a13c070b6da6801b114b1f8af06e94b9d264e2398db989125d35\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":4000,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-18T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3a77dd4376dd32d34c744c0ffbc57aa7f8e088c2387bd51175ce9691c2061662e501baf0e0ee2ea44a6cf62bffbeaa0ec182a8abefe36b746bb58fd1590b6d09\",\"signer_id\":\"did:key:z6MkjFUjszw2hrv4RXs95YXbtwuiuAuHhsqxMzPCcY9pXT3S\",\"signer_pubkey\":\"4745d19c66ec9179fa25097056409ef16967b6a1a74bfd8f7afd528f59630615\",\"subject\":\"ca24d5e6429bfd54aaac853e291d82491fb5304ae050120c8f797ee4f27f7a82\",\"subject_type\":\"object\"}", "context": { "revisions": [ "{\"grant_max_s\":43200,\"issued_at\":\"2026-09-01T00:00:00Z\",\"keys\":[{\"compromised_since\":null,\"id\":\"d1\",\"key\":\"a7f6dfaf8f38b89ba8ce649b594f91e4d01fdc57f9c9493df43b5e50a9987367\",\"may_sign\":[\"delivery\",\"receipt\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"m1\",\"key\":\"2bc2800b3316e009209ffd757dab19ccf0ae84bc7ae90654e1e81712d270f653\",\"may_sign\":[\"energy/OnChipCounter\",\"energy/ModelBased\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"op\",\"key\":\"d62f016a1efd1e4fdf793eb42cd84471e1ba9f0cf04d1287b5cc71f616287cb8\",\"may_sign\":[\"lawful-basis/declaration\"],\"status\":\"active\",\"until\":null},{\"compromised_since\":null,\"id\":\"modd\",\"key\":\"8320a51977d8c38ca8a4927c670df5821e449761945e15e9efb26a1509d230ea\",\"may_sign\":[\"module/decoder\"],\"status\":\"active\",\"until\":null}],\"kind\":\"wai-key-set\",\"next_root\":\"37332d293232e6e91c92aaccdd9fe2295a77447c7f4cd9df7e306b602643f5ac\",\"origin\":\"https://publisher.example\",\"prev\":null,\"revoked_modules\":[],\"root\":\"af06a3e3291714e4f356c19c9b15cd1951ec6e6662aa77be07547f289383341d\",\"seq\":0,\"sig\":\"44f48a651622c387576e25fd7f62e99a9409636794600f07a2635c2a3b09c8426d0bb87aa5716abb77274b46958e7a93722f3d8c5c15484f93522fb95bfe7205\",\"status_max_age_s\":3600}", diff --git a/wai/wai-rs/Cargo.toml b/wai/wai-rs/Cargo.toml index 1ed8a29ce..20c644101 100644 --- a/wai/wai-rs/Cargo.toml +++ b/wai/wai-rs/Cargo.toml @@ -203,9 +203,11 @@ telemetry = [] # §2.6, §3.1–§3.2): `claim` receipts of class energy / lawful-basis / log-inclusion, # the soft-binding class, and recovery under the ancestor rule. Needs `provenance` # for the coverage vocabulary and `oer` for the evidential grades and the OER receipt -# an energy claim may name, which it reads and verifies through `crate::oer`. Its one -# direct dependency, curve25519-dalek, is already in the graph under ed25519-dalek. -receipt_claims = ["provenance", "oer", "jwp_hash", "dep:curve25519-dalek"] +# an energy claim may name, which it reads and verifies through `crate::oer`; and +# `staged`, so a session verifier holding envelopes counts a refinement layer's `WIR1` +# payload (staged-measurement §3) and reads its `refines`. Its one direct dependency, +# curve25519-dalek, is already in the graph under ed25519-dalek. +receipt_claims = ["provenance", "oer", "jwp_hash", "staged", "dep:curve25519-dalek"] # Key discovery and signing authority (extensions/jwp-receipts.md §7): the origin key # log a `did:web` signer_id names, anchoring, the confirmation reported beside a receipt's # or claim's verdict, and the authorisation and revocation of decoder and reconstruct diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index 911b6fe38..7cb38e75f 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -343,19 +343,31 @@ pub enum Reason { SessionOutputInconsistent, /// A byte-exact presentation decoded again gives another digest. SessionOutputIrreproducible, + /// An object received is listed twice, on one path. + SessionObjectDuplicate, /// The session's entry object is not among the objects it received. SessionEntryNotReceived, /// A decoder entry's object, or an envelope held as the session's, is not among the /// objects it received. SessionSourceNotReceived, - /// The objects received give other counted, uncounted or transferred bytes. + /// The objects received give other counted, uncounted or transferred bytes, or an + /// object whose envelope is held states other counted bytes than the envelope's. SessionCountedMismatch, - /// An envelope held as the session's is not a `WAI1` or `WAI2` envelope whose + /// An object is listed as presented and no decoder entry names it, or as not + /// presented and one does. + SessionPresentedMismatch, + /// An envelope a decoder entry names is not a `WAI1` or `WAI2` envelope whose /// payloads are plaintext. SessionEnvelopeUnreadable, /// A decoder entry's capability or rendition is not what its object's envelope /// gives, or it names a rendition of an envelope not held. SessionSourceMismatch, + /// A presentation through an entry whose envelope is held is at another layer count + /// than that envelope gives. + SessionLayersMismatch, + /// A presentation through an entry whose envelope is held is of a unit that envelope + /// does not cover. + SessionUnitOutsideObject, /// The envelopes do not give the session's classical length. SessionClassicalMismatch, /// A `stage` claim the session names counts units the session's outputs do not hold @@ -452,11 +464,15 @@ impl Reason { Reason::SessionOutputMismatch => "session_output_mismatch", Reason::SessionOutputInconsistent => "session_output_inconsistent", Reason::SessionOutputIrreproducible => "session_output_irreproducible", + Reason::SessionObjectDuplicate => "session_object_duplicate", Reason::SessionEntryNotReceived => "session_entry_not_received", Reason::SessionSourceNotReceived => "session_source_not_received", Reason::SessionCountedMismatch => "session_counted_mismatch", + Reason::SessionPresentedMismatch => "session_presented_mismatch", Reason::SessionEnvelopeUnreadable => "session_envelope_unreadable", Reason::SessionSourceMismatch => "session_source_mismatch", + Reason::SessionLayersMismatch => "session_layers_mismatch", + Reason::SessionUnitOutsideObject => "session_unit_outside_object", Reason::SessionClassicalMismatch => "session_classical_mismatch", Reason::SessionStageDisagrees => "session_stage_disagrees", } @@ -3472,7 +3488,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 459 + 475 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 @@ -5578,7 +5594,7 @@ mod corpus { if let Some(e) = c.get("envelopes") { let envs = envelopes_of(e)?; let refs: Vec<&[u8]> = envs.iter().map(Vec::as_slice).collect(); - if let Err(e) = r.check_session_envelopes(&refs, objects.as_deref()) { + if let Err(e) = r.check_session_envelopes(&refs, objects.as_deref(), outputs.as_deref()) { return Ok(Err(e)); } } diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index e5d8082a6..7f3c87a52 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -6,7 +6,10 @@ //! envelope whose classical rendition the sink did not need. Unit 5 is decoded on the //! fallback path after a switch, and presented late. Every context a verifier can hold is //! given beside it: the presentations, the objects received, the `WAI2` envelope and the -//! `stage` claim the session names. +//! `stage` claim the session names. The envelopes a verifier holds are real ones: the base +//! a four-frame `WIV1` clip and the `WAI2` envelope's first rendition a one-frame clip, in +//! the format `wai.video.int_hyper` pins, so a verifier counts them (staged-measurement §3) +//! and reads their units, and every object's figures are what its envelope gives. use super::*; use crate::container::{Rendition, WaiMulti}; @@ -32,14 +35,46 @@ fn pin() -> [u8; 32] { crate::pin::sha256(b"claim-conformance: a parameter set") } -/// A `WAI2` envelope of `media` whose first rendition is the pinned base the session -/// decodes for unit 4, and whose second is of `second`, 700 bytes. +/// The committed tiny `WIH1` payload: the keyframe of every clip below. +const TINY_WIH1: &[u8] = include_bytes!("../../../tests/vectors/int_hyper/tiny_bitstream.wih1"); + +/// A `WIV1` clip of `frames` frames whose keyframe is [`TINY_WIH1`]: a payload in the format +/// `wai.video.int_hyper` pins (integer-payloads §3), so a verifier counts it and reads its +/// units. Its residual stream is filler: no vector decodes it. +fn wiv1(frames: u32) -> Vec { + use crate::int_wire as w; + let block = if frames == 1 { 1 } else { 16 }; + let out = w::write_wiv1(&w::Wiv1 { + mv_precision: 1, + keyframe: 1, + n_frames: frames, + h: 16, + w: 16, + block, + q: 1, + offset: 0, + cdf: vec![0, 32_768, 65_536], + mvs: vec![(0, 0); (frames as usize - 1) * (16 / block as usize).pow(2)], + rans: &[0x33; 8], + wih1: Some(TINY_WIH1), + }); + w::parse_wiv1(&out, Some(1)).expect("a WIV1 clip"); + out +} + +/// What a verifier holding `e` reads as its counted bytes (staged-measurement §3). +fn counted_of(e: &[u8]) -> Option { + crate::measure_framing::count_object(e).ok().map(|c| c.total) +} + +/// A `WAI2` envelope of `media` whose first rendition is the pinned one-frame clip the +/// session decodes for unit 4, and whose second is of `second`, 700 bytes. fn wai2(media: &str, second: &str) -> Vec { WaiMulti::new( media, "replicate", Value::Null, - vec![Rendition::media("wai.video.int_hyper", "int_hyper", vec![0x11; 200]), Rendition::media(second, "second", vec![0x22; 700])], + vec![Rendition::media("wai.video.int_hyper", "int_hyper", wiv1(1)), Rendition::media(second, "second", vec![0x22; 700])], ) .to_bytes() .expect("a WAI2 envelope") @@ -58,12 +93,12 @@ fn encrypted_envelope() -> Vec { w.to_bytes().expect("a WAI2 envelope") } -/// The session's entry object: a `WAI1` envelope of `wai.video.int_hyper`, the stage set's -/// base and the first envelope the sink dispatched. +/// The session's entry object: a `WAI1` envelope of `wai.video.int_hyper`, a four-frame +/// clip, the stage set's base and the first envelope the sink dispatched. fn base_envelope() -> Vec { use crate::container::{Conditioning, Manifest, ModelRequirement, Wai}; let m = Manifest::new("video", "replicate", ModelRequirement::new("wai.video.int_hyper"), Conditioning::new("none")); - Wai::new(m, vec![0x33; 64]).to_bytes().expect("a WAI1 envelope") + Wai::new(m, wiv1(4)).to_bytes().expect("a WAI1 envelope") } fn entry() -> [u8; 32] { @@ -75,11 +110,12 @@ fn fallback_object() -> [u8; 32] { object_content_hash(b"WAI1 claim-conformance: the fallback rendition") } -fn entry_decoder(capability: &str, path: SessionPath, pinned: bool, rendition: Option, object: [u8; 32], leaves: u64) -> DecoderEntry { +fn entry_decoder(capability: &str, path: SessionPath, pinned: bool, rendition: Option, object: [u8; 32], first_unit: u64, leaves: u64) -> DecoderEntry { DecoderEntry { capability: capability.into(), rendition, object, + first_unit, path, decoder: "builtin:wai@0.4.0".into(), variant: None, @@ -124,13 +160,12 @@ fn model_stage_ok() -> ClaimReceipt { model_stage(&[1, 2, 1], false) } -const BASE_COUNTED: u64 = 5_000; const FALLBACK_BYTES: u64 = 3_000; -/// The objects the model session received: the stage set's base, the six layer objects -/// of its stage set (two arrived late and were never presented), the `WAI2` envelope (not -/// countable: its classical rendition's format is not checked) and the fallback envelope -/// (not countable). +/// The objects the model session received: the stage set's base (counted, as its envelope +/// gives), the six layer objects of its stage set (two arrived late and were never +/// presented), the `WAI2` envelope (not countable: its classical rendition's format is not +/// checked) and the fallback envelope (not held whole, so not countable). fn model_objects() -> Vec { let layer = |name: &str, bytes: u64, presented: bool| ObjectSeen { content_hash: layer_hash(name), @@ -140,15 +175,16 @@ fn model_objects() -> Vec { presented, }; let envelope = classical_envelope(); + let base = base_envelope(); vec![ - ObjectSeen { content_hash: entry(), path: SessionPath::Primary, counted: Some(BASE_COUNTED), transferred: BASE_COUNTED, presented: true }, + ObjectSeen { content_hash: entry(), path: SessionPath::Primary, counted: counted_of(&base), transferred: base.len() as u64, presented: true }, layer("s1.0", 900, true), layer("s1.1", 901, true), layer("s1.2", 902, true), layer("s1.3", 903, false), layer("s2.0", 1000, true), layer("s2.1", 1001, false), - ObjectSeen { content_hash: object_content_hash(&envelope), path: SessionPath::Primary, counted: None, transferred: envelope.len() as u64, presented: true }, + ObjectSeen { content_hash: object_content_hash(&envelope), path: SessionPath::Primary, counted: counted_of(&envelope), transferred: envelope.len() as u64, presented: true }, ObjectSeen { content_hash: fallback_object(), path: SessionPath::Fallback, @@ -184,13 +220,13 @@ fn model() -> SessionClaim { threads: 4, }, decoders: vec![ - entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), 4), - entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, Some(0), object_content_hash(&classical_envelope()), 1), - entry_decoder("wai.video.av1", SessionPath::Fallback, false, None, fallback_object(), 1), - entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s1.0"), 1), - entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s1.1"), 1), - entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s1.2"), 1), - entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s2.0"), 1), + entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), 0, 4), + entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, Some(0), object_content_hash(&classical_envelope()), 4, 1), + entry_decoder("wai.video.av1", SessionPath::Fallback, false, None, fallback_object(), 5, 1), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s1.0"), 0, 1), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s1.1"), 0, 1), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s1.2"), 0, 1), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, layer_hash("s2.0"), 0, 1), ], units: 6, leaf_count: 10, @@ -294,6 +330,15 @@ fn with_model_contexts(v: V) -> V { all(v, &model_presentations(), &model_objects(), &[&model_stage_ok()]) } +/// Every context of a model session as [`all`] gives them, with the envelopes `es` held. +fn all_held(v: V, ps: &[Presentation], objects: &[ObjectSeen], es: &[Vec], stage: &[&ClaimReceipt]) -> V { + let v = with(v, "outputs", outputs_value(ps)); + let v = with(v, "redecoded", redecoded_value(&[(0, ps[0].out_digest), (4, ps[4].out_digest)])); + let v = with(v, "objects", objects_value(objects)); + let v = with(v, "envelopes", envelopes_value(es)); + with(v, "stage_claims", stage_value(stage)) +} + /// A session of `n` units, each presented once: the even ones on the primary path /// through a decoder whose replicate class makes it byte-exact, the odd ones on the /// fallback path through one checked for membership only. The re-decodes a verifier made @@ -302,9 +347,9 @@ fn with_model_contexts(v: V) -> V { fn tree_vector(n: u64) -> V { let ps: Vec = (0..n).map(|u| pres(u, 1, (u % 2) as u16)).collect(); let fallback = n / 2; - let mut decoders = vec![entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), n - fallback)]; + let mut decoders = vec![entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), 0, n - fallback)]; if fallback > 0 { - decoders.push(entry_decoder("wai.video.av1", SessionPath::Fallback, false, None, fallback_object(), fallback)); + decoders.push(entry_decoder("wai.video.av1", SessionPath::Fallback, false, None, fallback_object(), 0, fallback)); } let s = SessionClaim { decoders, @@ -837,6 +882,73 @@ pub(super) fn vectors() -> Vec { "objects", objects_value(&presented), )); + // Each (content hash, path) once; a re-fetch is one object with every byte received. + let mut twice = objects.clone(); + twice.push(objects[1].clone()); + v.push(with( + r6( + "session_object_listed_twice", + "a layer object listed twice on one path, the counted members restated to match", + counted_from(m(), &twice), + Reason::SessionObjectDuplicate, + ), + "objects", + objects_value(&twice), + )); + let mut refetched = objects.clone(); + refetched[0].transferred *= 2; + v.push(all_held( + claim( + "session_object_refetch_accept", + "the base fetched twice and listed once, its transferred bytes twice its length; every context held", + sealed(counted_from(m(), &refetched)).to_json(), + Ok(()), + ), + &ps, + &refetched, + &[base_envelope(), classical_envelope()], + &[&stage], + )); + // Figures told, not derived: each passes the sums, and contradicts what the claim or the + // envelopes give. + let mut inflated = objects.clone(); + inflated[0].counted = inflated[0].counted.map(|c| c + 1_000); + v.push(all_held( + r6( + "session_counted_not_the_envelopes", + "the base's counted bytes stated 1000 above what its envelope gives, the counted members restated to match; the envelope held", + counted_from(m(), &inflated), + Reason::SessionCountedMismatch, + ), + &ps, + &inflated, + &[base_envelope(), classical_envelope()], + &[&stage], + )); + let mut unpresented = objects.clone(); + unpresented[1].presented = false; + v.push(with( + r6( + "session_presented_not_named", + "a layer object a decoder entry names given as not presented, the discarded bytes restated to match", + counted_from(m(), &unpresented), + Reason::SessionPresentedMismatch, + ), + "objects", + objects_value(&unpresented), + )); + let mut named = objects.clone(); + named[4].presented = true; + v.push(with( + r6( + "session_presented_unnamed", + "a late layer object no decoder entry names given as presented, the discarded bytes restated to match", + counted_from(m(), &named), + Reason::SessionPresentedMismatch, + ), + "objects", + objects_value(&named), + )); // ── step 6: the envelopes ── // A `WAI2` envelope given in the model's place is the source of the entry decoded from @@ -894,20 +1006,61 @@ pub(super) fn vectors() -> Vec { vec![encrypted_envelope()], Err(Reason::SessionEnvelopeUnreadable), )); + let unreadable_wai1 = b"WAI1\x02\x00\x00\x00{}\x00\x00\x00\x00".to_vec(); + let neither = b"WAI3\x00\x00\x00\x00".to_vec(); v.push(env( "session_envelope_unreadable_wai1", - "a WAI1 envelope whose manifest has none of its members", - m(), - vec![b"WAI1\x02\x00\x00\x00{}\x00\x00\x00\x00".to_vec(), classical_envelope()], + "the base's entry names a WAI1 envelope whose manifest has none of its members", + { let mut s = m(); s.decoders[0].object = object_content_hash(&unreadable_wai1); s }, + vec![unreadable_wai1.clone(), classical_envelope()], Err(Reason::SessionEnvelopeUnreadable), )); v.push(env( "session_envelope_neither", - "bytes that are neither a WAI1 nor a WAI2 envelope", - m(), - vec![b"WAI3\x00\x00\x00\x00".to_vec(), classical_envelope()], + "the base's entry names bytes that are neither a WAI1 nor a WAI2 envelope", + { let mut s = m(); s.decoders[0].object = object_content_hash(&neither); s }, + vec![neither.clone(), classical_envelope()], Err(Reason::SessionEnvelopeUnreadable), )); + v.push(env( + "session_envelope_unnamed_unreadable_accept", + "bytes that are not an envelope, held and named by no entry: an inert object, nothing to read", + m(), + vec![neither, unreadable_wai1, classical_envelope()], + Ok(()), + )); + // An encrypted envelope received and named by no entry: inert, listed uncounted and not + // presented, and held. + let encrypted = encrypted_envelope(); + let mut with_encrypted = objects.clone(); + with_encrypted.push(ObjectSeen { content_hash: object_content_hash(&encrypted), path: SessionPath::Primary, counted: None, transferred: encrypted.len() as u64, presented: false }); + v.push(all_held( + claim( + "session_envelope_inert_unnamed_accept", + "an encrypted WAI2 envelope the session received and could not open, named by no entry: listed uncounted and not presented, and held; every context held", + sealed(counted_from(m(), &with_encrypted)).to_json(), + Ok(()), + ), + &ps, + &with_encrypted, + &[base_envelope(), classical_envelope(), encrypted], + &[&stage], + )); + // The units an envelope covers: the WAI2 envelope's first rendition is one frame, the + // unit its entry's first_unit names. + v.push(all_held( + r6( + "session_unit_outside_rendition", + "the WAI2 rendition's entry states first_unit 3, so its one frame is unit 3, and unit 4 is presented through it", + { let mut s = m(); s.decoders[1].first_unit = 3; s }, + Reason::SessionUnitOutsideObject, + ), + &ps, + &objects, + &[base_envelope(), classical_envelope()], + &[&stage], + )); + v.extend(held_vectors()); v.push(env( "session_no_classical_accept", "a session with no classical length, beside an envelope whose second rendition is WAI's own", @@ -1242,21 +1395,31 @@ fn forget_presentations() -> Vec { } fn forget_objects() -> Vec { - let seen = |e: &[u8]| ObjectSeen { content_hash: object_content_hash(e), path: SessionPath::Primary, counted: None, transferred: e.len() as u64, presented: true }; + let seen = |e: &[u8]| ObjectSeen { content_hash: object_content_hash(e), path: SessionPath::Primary, counted: counted_of(e), transferred: e.len() as u64, presented: true }; vec![seen(FORGET_BASE), seen(FORGET_LAYER)] } +/// A second layer object the forgotten base's session received and did not hold whole. +fn forget_second_layer() -> [u8; 32] { + layer_hash("a second layer over the forgotten base, not held") +} + /// The session over the forgotten base's units: each presented at one layer through the -/// base and at two through the layer applied in epoch 0, naming the `stage` claims `sets`. -fn forget_session(ps: &[Presentation], os: &[ObjectSeen], sets: &[(u64, &ClaimReceipt)]) -> SessionClaim { +/// base and at two through the layer applied in epoch 0, naming the `stage` claims `sets`; +/// with `second`, a third entry for [`forget_second_layer`]. +fn forget_session(ps: &[Presentation], os: &[ObjectSeen], sets: &[(u64, &ClaimReceipt)], second: bool) -> SessionClaim { let mut stage_sets: Vec = sets.iter().map(|(f, c)| StageSetRef { first_unit: *f, claim: c.link_hash() }).collect(); stage_sets.sort(); + let mut decoders = vec![ + entry_decoder("wai.video.int_motion", SessionPath::Primary, false, None, object_content_hash(FORGET_BASE), 0, 0), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, object_content_hash(FORGET_LAYER), 0, 0), + ]; + if second { + decoders.push(entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, forget_second_layer(), 0, 0)); + } let s = SessionClaim { session_nonce: crate::pin::sha256(b"claim-conformance: a session whose base was forgotten"), - decoders: vec![ - entry_decoder("wai.video.int_motion", SessionPath::Primary, false, None, object_content_hash(FORGET_BASE), 0), - entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, object_content_hash(FORGET_LAYER), 0), - ], + decoders, switches: vec![], switches_total: 0, deadline_us: None, @@ -1278,7 +1441,7 @@ fn forget_vectors() -> Vec { let ps = forget_presentations(); let entry = object_content_hash(FORGET_BASE); let vector = |name: &'static str, about: &'static str, ps: &[Presentation], os: &[ObjectSeen], sets: &[(u64, &ClaimReceipt)], claims: &[&ClaimReceipt], reason: Option| { - let s = forget_session(ps, os, sets); + let s = forget_session(ps, os, sets, ps.iter().any(|p| p.decoder == 2)); let v = match reason { None => claim(name, about, sealed_about(entry, s).to_json(), Ok(())), Some(r) => reject(name, about, sealed_about(entry, s).to_json(), 6, r), @@ -1288,8 +1451,12 @@ fn forget_vectors() -> Vec { with(v, "stage_claims", stage_value(claims)) }; let os = forget_objects(); + // Unit 0 at three layers through a second layer the session received and did not hold + // whole: the envelopes held give it nothing to check, and the stage claims bound it. let mut beyond = ps.clone(); - beyond.push(pres(0, 3, 1)); + beyond.push(pres(0, 3, 2)); + let mut beyond_os = os.clone(); + beyond_os.push(ObjectSeen { content_hash: forget_second_layer(), path: SessionPath::Primary, counted: None, transferred: 700, presented: true }); vec![ vector( "session_forget_accept", @@ -1320,9 +1487,9 @@ fn forget_vectors() -> Vec { ), vector( "session_forget_beyond_both_epochs", - "the session naming both epochs' stage claims, a unit also presented at three layers, which no layer of either reaches", + "the session naming both epochs' stage claims, a unit also presented at three layers through a second layer not held whole, which no layer of either claim reaches", &beyond, - &os, + &beyond_os, &[(0, &e0), (0, &e1)], &[&e0, &e1], Some(Reason::SessionStageDisagrees), @@ -1330,12 +1497,168 @@ fn forget_vectors() -> Vec { ] } +/// A layer object refining the model's base ([`base_envelope`]) at layer 1 over `span` (all +/// of its units where `None`): a `WAI1` envelope of `wai.video.int_refine` whose payload is +/// a `WIR1` residual coded by the reference encoder (`staged::wir1::encode`), so a verifier +/// counts it and reads its `refines`. +fn layer_envelope(span: Option<(u32, u32)>) -> Vec { + use crate::container::{Conditioning, Manifest, ModelRequirement, Prev, Refines, Span, Wai}; + use crate::staged::wir1::{self, Below, Predictor, RefineParams, UnitKind}; + let units = span.map_or(4, |(_, c)| c) as usize; + let below = vec![0u8; 16 * 16 * 3]; + let target: Vec = (0..16 * 16 * 3).map(|i| (i % 7) as u8).collect(); + let belows: Vec> = (0..units).map(|_| Below::U8(&below)).collect(); + let targets: Vec> = (0..units).map(|_| Below::U8(&target)).collect(); + let params = RefineParams { q: 2, predictor: Predictor::Identity, rate: (1, 1), table_per_unit: false, max_symbols: 64 }; + let (payload, _) = wir1::encode(UnitKind::Rgb8, &belows, (16, 16, 3), &targets, (16, 16, 3), ¶ms).expect("a WIR1 payload"); + let base = hex(&entry()); + let refines = Refines { base: base.clone(), prev: Prev::One(base), layer: 1, span: span.map(|(from, count)| Span { from, count }) }; + let m = Manifest::new("video", "replicate", ModelRequirement::new("wai.video.int_refine"), Conditioning::new("none")).with_refines(&refines); + Wai::new(m, payload).to_bytes().expect("a WAI1 envelope") +} + +/// A session over the model's base and the layer objects `layers`, each envelope held: +/// `ps` its presentations, entry 0 the base and entry `1 + i` the `i`-th layer, every entry's +/// `first_unit` the base's unit 0, `base_first` for the base's; the objects are the +/// envelopes, their figures what each gives. +fn held_session(ps: &[Presentation], layers: &[Vec], base_first: u64) -> (SessionClaim, Vec, Vec>) { + let base = base_envelope(); + let mut envelopes = vec![base.clone()]; + envelopes.extend(layers.iter().cloned()); + let named: Vec = ps.iter().map(|p| p.decoder).collect(); + let objects: Vec = envelopes + .iter() + .enumerate() + .map(|(i, e)| ObjectSeen { + content_hash: object_content_hash(e), + path: SessionPath::Primary, + counted: counted_of(e), + transferred: e.len() as u64, + presented: named.contains(&(i as u16)), + }) + .collect(); + let mut decoders = vec![entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), base_first, 0)]; + decoders.extend(layers.iter().map(|l| entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, object_content_hash(l), 0, 0))); + let s = SessionClaim { + session_nonce: crate::pin::sha256(b"claim-conformance: a session holding its layer envelopes"), + decoders, + switches: vec![], + switches_total: 0, + deadline_us: None, + missed: 0, + missed_units: vec![], + stage_sets: vec![], + receipt_bytes: 0, + classical_declared: None, + classical_source: None, + ..model() + }; + (counted_from(restated(s, ps), &objects), objects, envelopes) +} + +/// §2.4.12 step 6 against the envelopes, with the outputs: a presentation through an entry +/// whose envelope is held is at the layer count that envelope gives, and of a unit it covers. +fn held_vectors() -> Vec { + let span_layer = layer_envelope(Some((1, 1))); + let whole_layer = layer_envelope(None); + let base_ps = || -> Vec { (0..4).map(|u| pres(u, 1, 0)).collect() }; + let vector = |name: &'static str, about: &'static str, ps: Vec, layers: Vec>, base_first: u64, held: bool, reason: Option| { + let (s, os, es) = held_session(&ps, &layers, base_first); + let v = match reason { + None => claim(name, about, sealed(s).to_json(), Ok(())), + Some(r) => reject(name, about, sealed(s).to_json(), 6, r), + }; + let v = with(with(v, "outputs", outputs_value(&ps)), "objects", objects_value(&os)); + let es: Vec> = if held { es } else { es.into_iter().skip(1).collect() }; + with(v, "envelopes", envelopes_value(&es)) + }; + let with_layer = |extra: Presentation| { + let mut ps = base_ps(); + ps.push(extra); + ps + }; + vec![ + vector( + "session_held_layer_accept", + "a four-frame base and a layer over unit 1, both envelopes held: unit 1 at two layers through the layer, each unit at one through the base", + with_layer(pres(1, 2, 1)), + vec![span_layer.clone()], + 0, + true, + None, + ), + vector( + "session_layers_past_the_object", + "unit 1 at three layers through a layer object whose refines gives layer 1, so two layers", + with_layer(pres(1, 3, 1)), + vec![span_layer.clone()], + 0, + true, + Some(Reason::SessionLayersMismatch), + ), + vector( + "session_layers_base_past_one", + "unit 0 at two layers through the base, which gives one", + { let mut ps = base_ps(); ps.push(pres(0, 2, 0)); ps }, + vec![], + 0, + true, + Some(Reason::SessionLayersMismatch), + ), + vector( + "session_unit_past_the_title", + "unit 4 at one layer through a base of four frames, units 0 to 3", + { let mut ps = base_ps(); ps.push(pres(4, 1, 0)); ps }, + vec![], + 0, + true, + Some(Reason::SessionUnitOutsideObject), + ), + vector( + "session_unit_outside_span", + "unit 2 at two layers through a layer whose span is unit 1 alone", + with_layer(pres(2, 2, 1)), + vec![span_layer.clone()], + 0, + true, + Some(Reason::SessionUnitOutsideObject), + ), + vector( + "session_unit_first_unit_shifted", + "the base's entry states first_unit 1, so its four frames are units 1 to 4, and unit 0 is presented through it", + base_ps(), + vec![], + 1, + true, + Some(Reason::SessionUnitOutsideObject), + ), + vector( + "session_unit_whole_layer_accept", + "a layer with no span covers its base's four units: unit 3 at two layers through it", + with_layer(pres(3, 2, 1)), + vec![whole_layer.clone()], + 0, + true, + None, + ), + vector( + "session_unit_whole_layer_base_not_held_accept", + "unit 3 at two layers through a layer with no span whose base is not held: the units it covers are not read, so the unit is not checked", + with_layer(pres(3, 2, 1)), + vec![whole_layer], + 0, + false, + None, + ), + ] +} + /// A session of `units` units, each presented once, with `missed` presentations missed /// and `written` of them written, and `switches` switches with `switched` written. fn capped(missed: u64, written: u64, switches: u64, switched: u64, units: u64) -> SessionClaim { let ps: Vec = (0..units).map(|u| pres(u, 1, 0)).collect(); SessionClaim { - decoders: vec![entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), units)], + decoders: vec![entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), 0, units)], units, primary_units: units, fallback_units: 0, diff --git a/wai/wai-rs/src/claim_receipt/session.rs b/wai/wai-rs/src/claim_receipt/session.rs index 406db997b..b6c57cbac 100644 --- a/wai/wai-rs/src/claim_receipt/session.rs +++ b/wai/wai-rs/src/claim_receipt/session.rs @@ -72,7 +72,7 @@ const SESSION_MEMBERS: &[&str] = &[ ]; const HOST_MEMBERS: &[&str] = &["profile", "target", "build", "threads"]; const DECODER_MEMBERS: &[&str] = - &["capability", "rendition", "object", "path", "decoder", "variant", "pin", "tier", "module_status", "leaves"]; + &["capability", "rendition", "object", "first_unit", "path", "decoder", "variant", "pin", "tier", "module_status", "leaves"]; const SWITCH_MEMBERS: &[&str] = &["unit", "from", "to", "reason"]; const MISSED_MEMBERS: &[&str] = &["unit", "layers", "late_us"]; const STAGE_SET_MEMBERS: &[&str] = &["first_unit", "claim"]; @@ -128,6 +128,9 @@ pub struct DecoderEntry { /// The content hash (§2.1) of the object it decoded from: the `WAI2` envelope whose /// rendition it is, or the `WAI1` envelope, a base or a layer. pub object: [u8; 32], + /// The title's unit that is unit 0 of the object's base: of the object itself for a + /// base or a rendition, of the base it refines for a layer. + pub first_unit: u64, pub path: SessionPath, /// `builtin:@` or `module:sha256:`. pub decoder: String, @@ -142,7 +145,7 @@ pub struct DecoderEntry { } /// A decoder entry's members but `leaves`, borrowed. -type EntryKey<'a> = (&'a str, Option, [u8; 32], SessionPath, &'a str, Option<&'a str>, Option<[u8; 32]>, Option<&'a str>, Option<&'a str>); +type EntryKey<'a> = (&'a str, Option, [u8; 32], u64, SessionPath, &'a str, Option<&'a str>, Option<[u8; 32]>, Option<&'a str>, Option<&'a str>); impl DecoderEntry { /// Everything but `leaves`: two entries with one key are one entry. @@ -151,6 +154,7 @@ impl DecoderEntry { &self.capability, self.rendition, self.object, + self.first_unit, self.path, &self.decoder, self.variant.as_deref(), @@ -358,6 +362,7 @@ impl SessionClaim { o.insert("capability".into(), d.capability.clone().into()); o.insert("rendition".into(), d.rendition.map_or(Value::Null, Value::from)); o.insert("object".into(), hex(&d.object).into()); + o.insert("first_unit".into(), d.first_unit.into()); o.insert("path".into(), d.path.label().into()); o.insert("decoder".into(), d.decoder.clone().into()); o.insert("variant".into(), opt_str_value(&d.variant)); @@ -466,6 +471,7 @@ impl SessionClaim { capability, rendition: get_opt_int(o, "rendition")?, object: get_hash(o, "object")?, + first_unit: get_int(o, "first_unit")?, path: get_path(o, "path")?, decoder: get_str(o, "decoder")?, variant: get_opt_term(o, "variant")?, @@ -577,6 +583,7 @@ impl SessionClaim { if let Some(r) = d.rendition { int_ok(r)?; } + int_ok(d.first_unit)?; int_ok(d.leaves)?; } for n in [self.units, self.leaf_count, self.primary_units, self.fallback_units, self.switches_total, self.missed] { @@ -753,6 +760,26 @@ pub fn redecode_checked(capability: &str) -> bool { ) } +/// The units a base payload holds (§2.4.12, step 6 against the envelopes), where WAI reads +/// them from its format: a `WIV1` clip's frames, and one for a `WIH1` picture, a `WIA1` +/// clip and a `WIS1` attribute tensor (integer-payloads, staged-delivery §2). `None` for a +/// capability with no pinned integer format, or a payload that does not parse as its own. +pub fn payload_units(capability: &str, payload: &[u8]) -> Option { + use crate::int_wire as w; + let magic = crate::codecs::pinned_int_payload(capability)?; + if magic == w::MAGIC_WIV1 { + return w::parse_wiv1(payload, None).ok().map(|v| u64::from(v.n_frames)); + } + let one = if magic == w::MAGIC_WIH1 { + w::parse_wih1(payload).is_ok() + } else if magic == w::MAGIC_WIA1 { + w::parse_wia1(payload).is_ok() + } else { + w::parse_wis1(payload).is_ok() + }; + one.then_some(1) +} + impl ClaimReceipt { fn session(&self) -> Result<&SessionClaim, Rejection> { match &self.body { @@ -832,13 +859,20 @@ impl ClaimReceipt { Ok(()) } - /// Step 6 (§2.4.12), against the objects received: the entry object is among them - /// (`session_entry_not_received`); so is each decoder entry's object - /// (`session_source_not_received`); then the counted sums per path and over the objects - /// not presented, the count of objects not countable, and the transferred bytes - /// (`session_counted_mismatch`). + /// Step 6 (§2.4.12), against the objects received, in order: each (content hash, + /// path) is listed once (`session_object_duplicate`) — an object received more than + /// once on a path is listed once, its `transferred` every byte received for it; the + /// entry object is among them (`session_entry_not_received`); so is each decoder + /// entry's object (`session_source_not_received`); the counted sums per path and over + /// the objects not presented, the count of objects not countable, and the transferred + /// bytes (`session_counted_mismatch`); and an object is `presented` exactly when a + /// decoder entry names it (`session_presented_mismatch`). pub fn check_session_objects(&self, objects: &[ObjectSeen]) -> Result<(), Rejection> { let s = self.session()?; + let mut listed = std::collections::BTreeSet::new(); + if objects.iter().any(|o| !listed.insert((o.content_hash, o.path))) { + return Err(Rejection::at(6, Reason::SessionObjectDuplicate)); + } if !objects.iter().any(|o| o.content_hash == self.subject) { return Err(Rejection::at(6, Reason::SessionEntryNotReceived)); } @@ -871,58 +905,89 @@ impl ClaimReceipt { if (primary, fallback, discarded, uncounted, transferred) != want { return Err(Rejection::at(6, Reason::SessionCountedMismatch)); } + let named: std::collections::BTreeSet<[u8; 32]> = s.decoders.iter().map(|d| d.object).collect(); + if objects.iter().any(|o| o.presented != named.contains(&o.content_hash)) { + return Err(Rejection::at(6, Reason::SessionPresentedMismatch)); + } Ok(()) } /// Step 6 (§2.4.12), against the envelopes the session received, as their bytes: every /// `WAI2` envelope among them, and any `WAI1` envelope the verifier holds — a base or a - /// layer — with the objects received where it holds them too. In order: with the - /// objects, each envelope is among them by its content hash - /// (`session_source_not_received`); each reads as a `WAI1` or `WAI2` envelope (SPEC §2, - /// §7.1) whose payloads are plaintext — an encrypted one is inert (SPEC §6.4) - /// (`session_envelope_unreadable`); each decoder entry whose object is one of them names - /// what it gives — a rendition of a `WAI2` envelope and that rendition's capability, - /// or no rendition and a `WAI1` envelope's capability or fallback — and each entry - /// naming a rendition has its object among them (`session_source_mismatch`); and the - /// lengths of the `WAI2` envelopes' classical renditions ([`classical_rendition`]) - /// whose capability no decoder entry decoded sum to `classical_declared`, which is - /// `null` exactly when there is none (`session_classical_mismatch`). - pub fn check_session_envelopes(&self, envelopes: &[&[u8]], objects: Option<&[ObjectSeen]>) -> Result<(), Rejection> { - use crate::container::{manifest_v2_plaintext, Wai, WaiMulti}; + /// layer — with the objects received and the presentations where it holds them too. + /// In order: + /// 1. with the objects, each envelope is among them by its content hash + /// (`session_source_not_received`); + /// 2. with the objects, every object listed with an envelope's content hash states that + /// envelope's counted bytes (staged-measurement §3), and `null` exactly when it is not + /// countable (`session_counted_mismatch`); + /// 3. each envelope a decoder entry names reads as a `WAI1` or `WAI2` envelope (SPEC §2, + /// §7.1) whose payloads are plaintext (`session_envelope_unreadable`); one no entry + /// names may be inert — encrypted (SPEC §6.4), or not an envelope at all — and is then + /// a received object that is neither counted nor presented; + /// 4. each decoder entry whose object is one of them names what it gives — a rendition of + /// a `WAI2` envelope and that rendition's capability, or no rendition and a `WAI1` + /// envelope's capability or fallback — and each entry naming a rendition has its object + /// among the readable envelopes (`session_source_mismatch`); + /// 5. with the presentations, each one through an entry whose envelope is held is at the + /// layer count that envelope gives: 1 for a base, or a rendition with no `refines`, and + /// `refines.layer + 1` for a layer (`session_layers_mismatch`); + /// 6. with the presentations, each one through an entry whose envelope is held is of a + /// unit that envelope covers: from the entry's `first_unit` plus `a`, `n` units, where + /// for a base or a rendition `a` is 0 and `n` the units its payload holds, and for a + /// layer `a` and `n` are its `span`, or 0 and its base's units with no span; a payload + /// whose units WAI does not read, or a base not held, leaves the presentation unchecked + /// (`session_unit_outside_object`); + /// 7. the lengths of the readable `WAI2` envelopes' classical renditions + /// ([`classical_rendition`]) whose capability no decoder entry decoded sum to + /// `classical_declared`, which is `null` exactly when there is none + /// (`session_classical_mismatch`). + pub fn check_session_envelopes(&self, envelopes: &[&[u8]], objects: Option<&[ObjectSeen]>, outputs: Option<&[Presentation]>) -> Result<(), Rejection> { + use crate::container::{manifest_v2_plaintext, RefForm, Refines, Wai, WaiMulti}; let s = self.session()?; + let hash = crate::jwp_hash::content_hash; + // 1. Each envelope was received. if let Some(objects) = objects - && envelopes.iter().any(|e| !objects.iter().any(|o| o.content_hash == crate::jwp_hash::content_hash(e))) + && envelopes.iter().any(|e| !objects.iter().any(|o| o.content_hash == hash(e))) { return Err(Rejection::at(6, Reason::SessionSourceNotReceived)); } + // 2. An object's counted bytes are its envelope's. + if let Some(objects) = objects { + for e in envelopes { + let (h, counted) = (hash(e), crate::measure_framing::count_object(e).ok().map(|c| c.total)); + if objects.iter().any(|o| o.content_hash == h && o.counted != counted) { + return Err(Rejection::at(6, Reason::SessionCountedMismatch)); + } + } + } enum Read { One(Wai), Multi(WaiMulti), } - let unreadable = Rejection::at(6, Reason::SessionEnvelopeUnreadable); + let read_one = |bytes: &[u8]| -> Option { + match bytes.get(..4) { + Some(b"WAI2") => WaiMulti::from_bytes(bytes).ok().filter(|w| manifest_v2_plaintext(&w.manifest)).map(Read::Multi), + Some(b"WAI1") => Wai::from_bytes(bytes).ok().filter(|w| w.manifest.security.as_ref().is_none_or(|x| x.is_plaintext())).map(Read::One), + _ => None, + } + }; let mut read: Vec<([u8; 32], Read)> = Vec::new(); + let mut inert: Vec<[u8; 32]> = Vec::new(); for bytes in envelopes { - let r = match bytes.get(..4) { - Some(b"WAI2") => { - let w = WaiMulti::from_bytes(bytes).map_err(|_| unreadable)?; - if !manifest_v2_plaintext(&w.manifest) { - return Err(unreadable); - } - Read::Multi(w) - } - Some(b"WAI1") => { - let w = Wai::from_bytes(bytes).map_err(|_| unreadable)?; - if w.manifest.security.as_ref().is_some_and(|x| !x.is_plaintext()) { - return Err(unreadable); - } - Read::One(w) - } - _ => return Err(unreadable), - }; - read.push((crate::jwp_hash::content_hash(bytes), r)); + match read_one(bytes) { + Some(r) => read.push((hash(bytes), r)), + None => inert.push(hash(bytes)), + } } + // 3. An envelope a decoder entry names is readable. + if s.decoders.iter().any(|d| inert.contains(&d.object) && !read.iter().any(|(h, _)| *h == d.object)) { + return Err(Rejection::at(6, Reason::SessionEnvelopeUnreadable)); + } + let held = |object: &[u8; 32]| read.iter().find(|(h, _)| h == object).map(|(_, r)| r); + // 4. Each entry names what its envelope gives. for d in &s.decoders { - let gives = match read.iter().find(|(h, _)| *h == d.object).map(|(_, r)| r) { + let gives = match held(&d.object) { Some(Read::Multi(w)) => usize::try_from(d.rendition.unwrap_or(u64::MAX)) .ok() .and_then(|r| w.manifest.renditions.get(r)) @@ -934,6 +999,72 @@ impl ClaimReceipt { return Err(Rejection::at(6, Reason::SessionSourceMismatch)); } } + // What an entry's envelope gives a presentation through it: its layer count, and + // the units it covers relative to the entry's `first_unit` — `None` where WAI does + // not read them. + let units_of = |capability: &str, payload: &[u8]| -> Option { payload_units(capability, payload) }; + let gives = |d: &DecoderEntry| -> Option<(Option, Option<(u64, u64)>)> { + match held(&d.object)? { + Read::One(w) => match w.refines() { + None => Some((Some(1), units_of(&d.capability, &w.payload).map(|n| (0, n)))), + Some(Ok(r)) => { + let span = match r.span { + Some(sp) => Some((u64::from(sp.from), u64::from(sp.count))), + None => unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok()).and_then(|b| match held(&b) { + Some(Read::One(base)) if base.refines().is_none() => units_of(base.capability(), &base.payload).map(|n| (0, n)), + _ => None, + }), + }; + Some((Some(u64::from(r.layer) + 1), span)) + } + Some(Err(_)) => Some((None, None)), + }, + Read::Multi(w) => { + let i = usize::try_from(d.rendition?).ok()?; + let m = w.manifest.renditions.get(i)?; + match m.refines.as_ref().map(|v| Refines::from_value(v, RefForm::ComponentId)) { + None => Some((Some(1), units_of(&m.capability, &w.renditions[i]).map(|n| (0, n)))), + Some(Ok(r)) => { + let span = match r.span { + Some(sp) => Some((u64::from(sp.from), u64::from(sp.count))), + None => w + .manifest + .renditions + .iter() + .position(|e| e.id.as_deref() == Some(r.base.as_str())) + .and_then(|b| units_of(&w.manifest.renditions[b].capability, &w.renditions[b])) + .map(|n| (0, n)), + }; + Some((Some(u64::from(r.layer) + 1), span)) + } + Some(Err(_)) => Some((None, None)), + } + } + } + }; + if let Some(ps) = outputs { + // 5. Each presentation through a held entry is at the layers its envelope gives. + for p in ps { + let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; + if let Some((Some(layers), _)) = gives(d) + && u64::from(p.layers) != layers + { + return Err(Rejection::at(6, Reason::SessionLayersMismatch)); + } + } + // 6. ... and of a unit it covers. + for p in ps { + let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; + if let Some((_, Some((a, n)))) = gives(d) { + let from = u128::from(d.first_unit) + u128::from(a); + let unit = u128::from(p.unit); + if unit < from || unit >= from + u128::from(n) { + return Err(Rejection::at(6, Reason::SessionUnitOutsideObject)); + } + } + } + } + // 7. The classical length, over the readable WAI2 envelopes. let mut sum: Option = None; for (_, r) in &read { let Read::Multi(w) = r else { continue }; diff --git a/wai/wai-rs/src/key_log/corpus.rs b/wai/wai-rs/src/key_log/corpus.rs index ca44e4138..0c7e0c69a 100644 --- a/wai/wai-rs/src/key_log/corpus.rs +++ b/wai/wai-rs/src/key_log/corpus.rs @@ -319,6 +319,7 @@ fn session_body(metered: bool) -> ClaimBody { capability: "wai.neural.int_hyper".into(), rendition: None, object: subject(), + first_unit: 0, path: SessionPath::Primary, decoder: "builtin:wai@0.4.0".into(), variant: None, diff --git a/wai/wai-rs/src/lib.rs b/wai/wai-rs/src/lib.rs index 1eb2b013e..3530f3ff2 100644 --- a/wai/wai-rs/src/lib.rs +++ b/wai/wai-rs/src/lib.rs @@ -345,10 +345,11 @@ pub mod http_binding; // Staged-delivery measurement (extensions/staged-measurement.md): the output tree // (Appendix C), the counted bytes of an envelope (§3), and the evaluation of a staged // title (§3–§6, §9) through the staged sink. The output tree is also what a session -// claim commits to (jwp-receipts §2.4.12), so `receipt_claims` builds it too. +// claim commits to (jwp-receipts §2.4.12), and a session verifier holding envelopes +// counts them, so `receipt_claims` builds both. #[cfg(any(feature = "stage_measure", feature = "receipt_claims"))] pub mod output_tree; -#[cfg(feature = "stage_measure")] +#[cfg(any(feature = "stage_measure", feature = "receipt_claims"))] pub mod measure_framing; #[cfg(feature = "stage_measure")] pub mod stage_measure; diff --git a/wai/wai-rs/src/session_recorder.rs b/wai/wai-rs/src/session_recorder.rs index 11db4ad0c..8d26292c2 100644 --- a/wai/wai-rs/src/session_recorder.rs +++ b/wai/wai-rs/src/session_recorder.rs @@ -12,11 +12,15 @@ //! names (§3.1 step 6) before it returns it. A recorder never emits a claim a verifier //! holding what it recorded refuses. //! -//! A sink that hands the recorder an object's bytes ([`SessionRecorder::received_envelope`]) -//! rather than its figures has the recorder derive them — the content hash, the counted and -//! transferred bytes, and whether any of its outputs was presented — and the recorder holds -//! the envelope, so `finish` checks the claim against it too, as a verifier holding the -//! envelopes does (§2.4.12 step 6, the `envelopes` context). +//! A sink tells the recorder what it received, and never an object's figures: the bytes +//! of an object it received whole ([`SessionRecorder::received_envelope`]), from which the +//! recorder derives its content hash and counted and transferred bytes, and holds it, so +//! `finish` checks the claim against it as a verifier holding the envelopes does (§2.4.12 +//! step 6, the `envelopes` context); or the content hash and the bytes of an object it did +//! not hold whole ([`SessionRecorder::received_unheld`]), which is not countable. Whether +//! any of an object's outputs was presented is derived from the presentations, and an +//! object received more than once on a path is one object, its `transferred` every byte +//! received for it. use crate::claim_receipt::{ session::SESSION_CLASSICAL_SOURCES, ClaimBody, ClaimClass, ClaimReceipt, DecoderEntry, Missed, ObjectSeen, @@ -39,6 +43,9 @@ pub struct DecoderKey { /// The content hash of the object decoded from: the `WAI2` envelope whose rendition it /// is, or the `WAI1` envelope. pub object: [u8; 32], + /// The title's unit that is unit 0 of the object's base (§2.4.12): of the object for + /// a base or a rendition, of the base it refines for a layer. + pub first_unit: u64, pub path: SessionPath, pub decoder: String, pub variant: Option, @@ -64,6 +71,8 @@ pub enum RecorderError { /// A claim named as a stage set's that is not a `stage` claim, does not verify (§3.1 /// steps 1–4), or is another key's than the stage claims named before it. NotAStageClaim, + /// Bytes received as an object that are not a `WAI1` or `WAI2` envelope. + NotAnEnvelope, } impl std::fmt::Display for RecorderError { @@ -75,6 +84,7 @@ impl std::fmt::Display for RecorderError { Self::NotLate => f.write_str("a presentation late with no deadline, or late by nothing"), Self::Switch => f.write_str("a switch to the same path, or for an unlisted reason"), Self::NotAStageClaim => f.write_str("not a verified stage claim of this key"), + Self::NotAnEnvelope => f.write_str("the bytes received are not a WAI1 or WAI2 envelope"), } } } @@ -115,9 +125,8 @@ pub struct SessionRecorder { /// The wire forms of the `stage` claims named, each once. stage_claims: Vec, energy: Option, - /// The envelopes received as bytes, each with its index in `objects`, whose - /// `presented` the tally derives. - held: Vec<(usize, Vec)>, + /// The envelopes received whole, each once. + held: Vec>, } impl SessionRecorder { @@ -157,27 +166,49 @@ impl SessionRecorder { } } - /// An object received, whole or as byte ranges. - pub fn received(&mut self, seen: ObjectSeen) { - self.objects.push(seen); + /// An object received whole on `path`, as its bytes: a `WAI1` or `WAI2` envelope, an + /// encrypted one included (inert at a sink that cannot open it, SPEC §6.4); any other + /// bytes are refused ([`RecorderError::NotAnEnvelope`]) and nothing is recorded. The + /// recorder derives its content hash, its counted bytes (staged-measurement §3; none + /// where it is not countable) and its length, and at the tally whether any of its + /// outputs was presented. It holds the envelope, and [`SessionRecorder::finish`] checks + /// the claim against every envelope it holds. Received again on the same path, it is the + /// same object, its `transferred` the bytes of both receipts. + pub fn received_envelope(&mut self, envelope: &[u8], path: SessionPath) -> Result<(), RecorderError> { + let readable = match envelope.get(..4) { + Some(b"WAI1") => crate::container::Wai::from_bytes(envelope).is_ok(), + Some(b"WAI2") => crate::container::WaiMulti::from_bytes(envelope).is_ok(), + _ => false, + }; + if !readable { + return Err(RecorderError::NotAnEnvelope); + } + let content_hash = crate::jwp_hash::content_hash(envelope); + if !self.held.iter().any(|h| crate::jwp_hash::content_hash(h) == content_hash) { + self.held.push(envelope.to_vec()); + } + let counted = crate::measure_framing::count_object(envelope).ok().map(|c| c.total); + self.add_object(content_hash, path, counted, envelope.len() as u64); + Ok(()) } - /// An object received whole on the primary path, as its bytes. The recorder derives - /// its content hash, its counted bytes (staged-measurement §3; none where it is not - /// countable) and its transferred length from them, and at the tally whether any of its - /// outputs was presented: whether a presentation's decoder entry names it. It holds the - /// envelope, and [`SessionRecorder::finish`] checks the claim against every envelope it - /// holds. - #[cfg(feature = "stage_measure")] - pub fn received_envelope(&mut self, envelope: &[u8]) { - self.objects.push(ObjectSeen { - content_hash: crate::jwp_hash::content_hash(envelope), - path: SessionPath::Primary, - counted: crate::measure_framing::count_object(envelope).ok().map(|c| c.total), - transferred: envelope.len() as u64, - presented: false, - }); - self.held.push((self.objects.len() - 1, envelope.to_vec())); + /// An object received on `path` that the sink did not hold whole — as byte ranges, or + /// bytes it did not keep — of `transferred` bytes: its content hash only, so it is not + /// countable. Received again on the same path, it is the same object. + pub fn received_unheld(&mut self, content_hash: [u8; 32], path: SessionPath, transferred: u64) { + self.add_object(content_hash, path, None, transferred); + } + + fn add_object(&mut self, content_hash: [u8; 32], path: SessionPath, counted: Option, transferred: u64) { + match self.objects.iter_mut().find(|o| o.content_hash == content_hash && o.path == path) { + Some(o) => { + o.transferred = o.transferred.saturating_add(transferred); + if o.counted.is_none() { + o.counted = counted; + } + } + None => self.objects.push(ObjectSeen { content_hash, path, counted, transferred, presented: false }), + } } /// Bytes of receipts and claims received. @@ -289,6 +320,7 @@ impl SessionRecorder { capability: k.capability.clone(), rendition: k.rendition, object: k.object, + first_unit: k.first_unit, path: k.path, decoder: k.decoder.clone(), variant: k.variant.clone(), @@ -349,11 +381,11 @@ impl SessionRecorder { (body, ps, objects) } - /// The objects received, an envelope's `presented` derived from the presentations. + /// The objects received, each one's `presented` derived from the presentations: + /// whether a presentation's decoder names it. fn objects_seen(&self) -> Vec { let mut objects = self.objects.clone(); - for (i, _) in &self.held { - let o = &mut objects[*i]; + for o in &mut objects { o.presented = self.presentations.iter().any(|p| self.keys[p.2].object == o.content_hash); } objects @@ -373,7 +405,7 @@ impl SessionRecorder { issued_at: &str, ) -> Result { let (body, ps, objects) = self.tally(); - let envelopes: Vec> = self.held.into_iter().map(|(_, b)| b).collect(); + let envelopes = self.held; seal_checked(body, ps, objects, self.stage_claims, envelopes, subject, key, signer_id, seq, parent, issued_at) } } @@ -404,7 +436,7 @@ pub fn seal_checked( claim.check_session_objects(&objects)?; if !envelopes.is_empty() { let refs: Vec<&[u8]> = envelopes.iter().map(Vec::as_slice).collect(); - claim.check_session_envelopes(&refs, Some(&objects))?; + claim.check_session_envelopes(&refs, Some(&objects), Some(&presentations))?; } let wires: Vec<&str> = stage_claims.iter().map(String::as_str).collect(); claim.check_session_stage_claims(&wires, Some(&presentations), Some(&objects))?; @@ -426,6 +458,7 @@ mod tests { capability: capability.into(), rendition: None, object, + first_unit: 0, path, decoder: "builtin:wai@0.4.0".into(), variant: None, @@ -461,10 +494,13 @@ mod tests { r.presented(1, 2, refine, d(1, 2), Some(900)).unwrap(); r.presented(3, 1, fallback, d(3, 1), Some(1_200)).unwrap(); r.switched(3, SessionPath::Primary, SessionPath::Fallback, "set-incomplete").unwrap(); - r.received(ObjectSeen { content_hash: [1; 32], path: SessionPath::Primary, counted: Some(5_000), transferred: 5_000, presented: true }); - r.received(ObjectSeen { content_hash: [2; 32], path: SessionPath::Primary, counted: Some(700), transferred: 700, presented: true }); - r.received(ObjectSeen { content_hash: [6; 32], path: SessionPath::Primary, counted: Some(300), transferred: 300, presented: false }); - r.received(ObjectSeen { content_hash: [3; 32], path: SessionPath::Fallback, counted: None, transferred: 3_000, presented: true }); + // Objects it did not hold whole: neither countable, `presented` derived; [6] was + // received twice and never presented. + r.received_unheld([1; 32], SessionPath::Primary, 5_000); + r.received_unheld([2; 32], SessionPath::Primary, 700); + r.received_unheld([6; 32], SessionPath::Primary, 300); + r.received_unheld([6; 32], SessionPath::Primary, 300); + r.received_unheld([3; 32], SessionPath::Fallback, 3_000); r.classical(700); let s = r.finish([1; 32], &k, "did:example:sink", 0, None, T).unwrap(); let ClaimBody::ReconstructSession(b) = &s.claim.body else { panic!("a session") }; @@ -473,7 +509,9 @@ mod tests { assert_eq!(b.decoders.iter().map(|d| d.leaves).collect::>(), [3, 1, 2]); assert_eq!((b.units, b.leaf_count, b.primary_units, b.fallback_units), (4, 6, 3, 1)); assert_eq!((b.missed, b.missed_units.len()), (2, 2)); - assert_eq!((b.counted_primary, b.counted_fallback, b.counted_discarded, b.uncounted, b.transferred), (6_000, 0, 300, 1, 9_000)); + assert_eq!((b.counted_primary, b.counted_fallback, b.counted_discarded, b.uncounted, b.transferred), (0, 0, 0, 4, 9_300)); + assert_eq!(s.objects.iter().map(|o| (o.content_hash[0], o.presented, o.transferred)).collect::>(), + [(1, true, 5_000), (2, true, 700), (6, false, 600), (3, true, 3_000)], "a repeat is one object; presented derived"); assert_eq!((b.classical_declared, b.classical_source.as_deref()), (Some(700), Some("wai2-table"))); assert_eq!(b.output_root, output_tree::root(&s.presentations).unwrap()); s.claim.verify().unwrap(); @@ -493,7 +531,8 @@ mod tests { /// A body that was mis-tallied is refused at step 6 before it leaves the sink: a leaf /// moved between entries, the units counted on the other path, an object's counted - /// bytes changed. Each passes steps 1–4. + /// bytes changed, an object listed twice, an object marked not presented that an entry + /// names. Each passes steps 1–4. #[test] fn cannot_emit_inconsistent() { let k = SigningKey::from_bytes(&[0x44; 32]); @@ -504,8 +543,8 @@ mod tests { r.presented(u, 1, base, d(u, 1), None).unwrap(); r.presented(u, 2, refine, d(u, 2), None).unwrap(); } - r.received(ObjectSeen { content_hash: [1; 32], path: SessionPath::Primary, counted: Some(5_000), transferred: 5_000, presented: true }); - r.received(ObjectSeen { content_hash: [2; 32], path: SessionPath::Primary, counted: Some(700), transferred: 700, presented: true }); + r.received_unheld([1; 32], SessionPath::Primary, 5_000); + r.received_unheld([2; 32], SessionPath::Primary, 700); let (body, ps, objects) = r.tally(); let seal = |b: SessionClaim, o: Vec| seal_checked(b, ps.clone(), o, vec![], vec![], [1; 32], &k, "did:example:sink", 0, None, T).map(|_| ()).map_err(|e| (e.step, e.reason)); assert_eq!(seal(body.clone(), objects.clone()), Ok(())); @@ -518,6 +557,12 @@ mod tests { let mut fewer = objects.clone(); fewer[0].counted = Some(4_999); assert_eq!(seal(body.clone(), fewer), Err((6, Reason::SessionCountedMismatch))); + let mut twice = objects.clone(); + twice.push(objects[1].clone()); + assert_eq!(seal(body.clone(), twice), Err((6, Reason::SessionObjectDuplicate))); + let mut unpresented = objects.clone(); + unpresented[1].presented = false; + assert_eq!(seal(body.clone(), unpresented), Err((6, Reason::SessionPresentedMismatch))); // An entry naming an object the sink did not receive. let mut elsewhere = body.clone(); elsewhere.decoders[1].object = [8; 32]; @@ -530,11 +575,13 @@ mod tests { /// A recorder handed the envelopes themselves derives each object's figures — counted /// and transferred bytes from the bytes, `presented` from the presentations, so an - /// envelope received and never presented counts as discarded — and checks the claim - /// against the envelopes before it leaves the sink: a decoder entry naming a capability - /// its envelope does not give is refused there (`session_source_mismatch`), as a - /// verifier holding the envelopes refuses it. - #[cfg(feature = "stage_measure")] + /// envelope received and never presented counts as discarded, and a repeat is one + /// object with the bytes of both — and checks the claim against the envelopes before it + /// leaves the sink, as a verifier holding them does: a decoder entry naming a capability + /// its envelope does not give (`session_source_mismatch`), a presentation at a layer + /// count its envelope does not give (`session_layers_mismatch`) or of a unit it does not + /// cover (`session_unit_outside_object`) is refused there. Bytes that are not an envelope + /// are refused when received; an encrypted envelope no entry names is held, uncounted. #[test] fn a_recorder_holding_its_envelopes_checks_them() { let wai = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join(".."); @@ -542,29 +589,45 @@ mod tests { let base = read("staged-conformance/cases/image_int_hyper_2l/base.wai"); let l1 = read("staged-measure-conformance/fixtures/still/L01.wai"); let l2 = read("staged-measure-conformance/fixtures/still/L02.wai"); + let encrypted = read("staged-measure-conformance/counting/encrypted.wai"); let hash = crate::jwp_hash::content_hash; let k = SigningKey::from_bytes(&[0x44; 32]); - let record = |base_capability: &str| { + // `base_capability` for the base's entry; `extra` a presentation (unit, layers, entry) + // added to the honest ones. + let record = |base_capability: &str, extra: Option<(u64, u16, usize)>| { let mut r = SessionRecorder::new([7; 32], "image", host(), None); let b = r.decoder(key(base_capability, SessionPath::Primary, hash(&base))); let l = r.decoder(key("wai.image.int_refine", SessionPath::Primary, hash(&l1))); r.presented(0, 1, b, d(0, 1), None).unwrap(); r.presented(0, 2, l, d(0, 2), None).unwrap(); - r.received_envelope(&base); - r.received_envelope(&l1); - r.received_envelope(&l2); + if let Some((u, layers, entry)) = extra { + r.presented(u, layers, [b, l][entry], d(u, layers), None).unwrap(); + } + for e in [&base, &l1, &l2, &l2, &encrypted] { + r.received_envelope(e, SessionPath::Primary).unwrap(); + } + assert_eq!(r.received_envelope(&base[..7], SessionPath::Primary), Err(RecorderError::NotAnEnvelope)); + assert_eq!(r.received_envelope(b"not an envelope at all", SessionPath::Primary), Err(RecorderError::NotAnEnvelope)); r }; - let s = record("wai.neural.int_hyper").finish(hash(&base), &k, "did:example:sink", 0, None, T).unwrap(); - assert_eq!(s.objects.iter().map(|o| o.presented).collect::>(), [true, true, false], "presented derived from the outputs"); - assert_eq!(s.objects.iter().map(|o| (o.counted, o.transferred)).collect::>(), - [&base, &l1, &l2].iter().map(|b| (Some(b.len() as u64), b.len() as u64)).collect::>()); + let s = record("wai.neural.int_hyper", None).finish(hash(&base), &k, "did:example:sink", 0, None, T).unwrap(); + assert_eq!(s.objects.iter().map(|o| o.presented).collect::>(), [true, true, false, false], "presented derived from the outputs"); + let want: Vec<(Option, u64)> = vec![ + (Some(base.len() as u64), base.len() as u64), + (Some(l1.len() as u64), l1.len() as u64), + (Some(l2.len() as u64), 2 * l2.len() as u64), + (None, encrypted.len() as u64), + ]; + assert_eq!(s.objects.iter().map(|o| (o.counted, o.transferred)).collect::>(), want, "received twice: one object; encrypted: uncounted"); let ClaimBody::ReconstructSession(body) = &s.claim.body else { panic!("a session") }; - assert_eq!(body.counted_discarded, l2.len() as u64, "received and never presented"); + assert_eq!((body.counted_discarded, body.uncounted), (l2.len() as u64, 1), "received and never presented"); let refs: Vec<&[u8]> = s.envelopes.iter().map(Vec::as_slice).collect(); - s.claim.check_session_envelopes(&refs, Some(&s.objects)).unwrap(); - let wrong = record("wai.audio.int_codec").finish(hash(&base), &k, "did:example:sink", 0, None, T); - assert_eq!(wrong.map(|_| ()).map_err(|e| (e.step, e.reason)), Err((6, Reason::SessionSourceMismatch))); + assert_eq!(refs.len(), 4, "each envelope held once"); + s.claim.check_session_envelopes(&refs, Some(&s.objects), Some(&s.presentations)).unwrap(); + let refused = |r: SessionRecorder| r.finish(hash(&base), &k, "did:example:sink", 0, None, T).map(|_| ()).map_err(|e| (e.step, e.reason)); + assert_eq!(refused(record("wai.audio.int_codec", None)), Err((6, Reason::SessionSourceMismatch))); + assert_eq!(refused(record("wai.neural.int_hyper", Some((0, 3, 1)))), Err((6, Reason::SessionLayersMismatch)), "the layer gives two layers"); + assert_eq!(refused(record("wai.neural.int_hyper", Some((1, 1, 0)))), Err((6, Reason::SessionUnitOutsideObject)), "the base holds one unit"); } /// A `stage` claim about the set of `n` units over `base`, every unit at stage 0, signed @@ -595,7 +658,7 @@ mod tests { for u in 0..units { r.presented(u, 1, h, d(u, 1), None).unwrap(); } - r.received(ObjectSeen { content_hash: stage.subject, path: SessionPath::Primary, counted: Some(4_000), transferred: 4_000, presented: true }); + r.received_unheld(stage.subject, SessionPath::Primary, 4_000); r.stage_set(0, stage).unwrap(); r } diff --git a/wai/wai-rs/src/stage_measure/session.rs b/wai/wai-rs/src/stage_measure/session.rs index 2b9f5b97b..32c513b06 100644 --- a/wai/wai-rs/src/stage_measure/session.rs +++ b/wai/wai-rs/src/stage_measure/session.rs @@ -60,10 +60,20 @@ pub fn recorder_of(t: &Title, e: &Evaluation, host: SessionHost, session_nonce: .token() .to_owned() }); + // The title's unit that is unit 0 of the object's base: the base's own, for a layer + // too. + let first_unit = e + .objects + .iter() + .find(|o| o.content_hash == *object) + .and_then(|o| e.bases.get(o.base)) + .map(|(d, _, _)| d.info.first_unit) + .ok_or_else(|| invalid(format!("{}: a decoder names an object the title does not hold", t.dir)))?; handles.push(r.decoder(DecoderKey { capability: capability.clone(), rendition: None, object: *object, + first_unit, path: SessionPath::Primary, decoder: builtin_decoder(), variant: None, @@ -79,7 +89,7 @@ pub fn recorder_of(t: &Title, e: &Evaluation, host: SessionHost, session_nonce: for o in &e.objects { let held = t.bases.iter().map(|b| &b.obj).chain(&t.layers).find(|x| x.path == o.path); let bytes = held.ok_or_else(|| invalid(format!("{}: {} is not one of the title's objects", t.dir, o.path)))?; - r.received_envelope(&bytes.bytes); + r.received_envelope(&bytes.bytes, SessionPath::Primary).map_err(|x| invalid(format!("{}: {x}", o.path)))?; } Ok((r, first.0.info.content_hash)) } @@ -232,7 +242,7 @@ mod tests { s.claim.check_session_objects(&s.objects).unwrap(); assert_eq!(s.envelopes.len(), e.objects.len(), "{name}: the recorder holds every object it received"); let held: Vec<&[u8]> = s.envelopes.iter().map(Vec::as_slice).collect(); - s.claim.check_session_envelopes(&held, Some(&s.objects)).unwrap(); + s.claim.check_session_envelopes(&held, Some(&s.objects), Some(&s.presentations)).unwrap(); assert!(s.objects.iter().all(|o| o.presented), "{name}: every object of a completion is presented"); assert_eq!(super::super::run::completion(&t).unwrap(), c.leaf_count, "{name}: one completion is every stage"); } diff --git a/wai/wai-rs/src/staged/claim_tests.rs b/wai/wai-rs/src/staged/claim_tests.rs index c381b481f..ca19acd52 100644 --- a/wai/wai-rs/src/staged/claim_tests.rs +++ b/wai/wai-rs/src/staged/claim_tests.rs @@ -487,7 +487,7 @@ struct Replayed { /// received; and the `stage` claim of every epoch of every base it decoded — signed as /// the epoch ended, before the sink forgot the base, over the chain it held then. fn replay_session(dir: &std::path::Path) -> Option { - use crate::claim_receipt::{ObjectSeen, SessionHost, SessionPath}; + use crate::claim_receipt::{SessionHost, SessionPath}; use crate::energy_report::{BuildProfile, BuildRecord}; use crate::session_recorder::{DecoderKey, SessionRecorder}; let key = ed25519_dalek::SigningKey::from_bytes(&[0x44; 32]); @@ -619,15 +619,22 @@ fn replay_session(dir: &std::path::Path) -> Option { let mut rec = SessionRecorder::new([7; 32], "video", host, None); let mut handles = BTreeMap::new(); for (&(unit, layers), source) in &presented { - let capability = match bases.iter().find(|(info, _, _)| info.content_hash == *source) { - Some((info, _, _)) => info.capability.clone(), - None => files.values().find(|f| chash(f) == *source).and_then(|f| Wai::from_bytes(f).ok()).expect("a layer").capability().to_owned(), + // The capability, and the title's unit that is unit 0 of the object's base. + let (capability, first_unit) = match bases.iter().find(|(info, _, _)| info.content_hash == *source) { + Some((info, _, _)) => (info.capability.clone(), info.first_unit), + None => { + let w = files.values().find(|f| chash(f) == *source).and_then(|f| Wai::from_bytes(f).ok()).expect("a layer"); + let base = w.refines().and_then(Result::ok).map(|r| r.base).expect("a layer refines a base"); + let first = bases.iter().find(|(info, _, _)| hex(&info.content_hash) == base).map_or(0, |(info, _, _)| info.first_unit); + (w.capability().to_owned(), first) + } }; let h = *handles.entry((capability.clone(), *source)).or_insert_with(|| { rec.decoder(DecoderKey { capability, rendition: None, object: *source, + first_unit, path: SessionPath::Primary, decoder: "builtin:wai@0.4.0".into(), variant: None, @@ -638,12 +645,13 @@ fn replay_session(dir: &std::path::Path) -> Option { }); rec.presented(unit, layers, h, crate::pin::sha256(format!("{unit}/{layers}").as_bytes()), None).expect("one presentation each"); } + // Objects the recorder is not handed whole: uncounted, `presented` derived. for &i in &added { let env = &bases[i].2; - rec.received(ObjectSeen { content_hash: chash(env), path: SessionPath::Primary, counted: None, transferred: env.len() as u64, presented: true }); + rec.received_unheld(chash(env), SessionPath::Primary, env.len() as u64); } - for (h, (bytes, applied)) in &arrived { - rec.received(ObjectSeen { content_hash: *h, path: SessionPath::Primary, counted: None, transferred: *bytes, presented: *applied }); + for (h, (bytes, _applied)) in &arrived { + rec.received_unheld(*h, SessionPath::Primary, *bytes); } let mut claims = 0; for (n, (i, epoch, chain, upto, delivered)) in ended.iter().enumerate() { @@ -706,7 +714,7 @@ fn every_corpus_case_seals_an_honest_session() { /// being bounded by nothing else. #[test] fn the_forget_vectors_are_what_the_sink_states() { - use crate::claim_receipt::{ObjectSeen, SessionHost, SessionPath}; + use crate::claim_receipt::{SessionHost, SessionPath}; use crate::energy_report::{BuildProfile, BuildRecord}; use crate::session_recorder::{DecoderKey, SessionRecorder}; let key = ed25519_dalek::SigningKey::from_bytes(&[0x44; 32]); @@ -758,6 +766,7 @@ fn the_forget_vectors_are_what_the_sink_states() { capability: capability.into(), rendition: None, object, + first_unit: 0, path: SessionPath::Primary, decoder: "builtin:wai@0.4.0".into(), variant: None, @@ -773,7 +782,7 @@ fn the_forget_vectors_are_what_the_sink_states() { rec.presented(u64::from(u), 2, ld, [2; 32], None).unwrap(); } for e in [&e0, &l0] { - rec.received(ObjectSeen { content_hash: chash(e), path: SessionPath::Primary, counted: None, transferred: e.len() as u64, presented: true }); + rec.received_envelope(e, SessionPath::Primary).unwrap(); } for c in named { rec.stage_set(0, c).unwrap(); diff --git a/wai/wai-web/demo/verify_measure_wasm.mjs b/wai/wai-web/demo/verify_measure_wasm.mjs index 3b290f9f1..e06647df4 100644 --- a/wai/wai-web/demo/verify_measure_wasm.mjs +++ b/wai/wai-web/demo/verify_measure_wasm.mjs @@ -210,6 +210,8 @@ const T = '2026-10-06T12:00:00Z'; const vectors = []; const expected = []; const flip = (h) => (h[0] === '0' ? '1' : '0') + h.slice(1); +// The title's unit that is unit 0 of an object's base: the base's own, for a layer too. +const firstUnitOf = (golden, object) => golden.bases[golden.objects.find((o) => o.object === object).base].first_unit; for (const [name, { files, t, golden }] of titles) { const native = t.session(HOST, NONCE).finish(SEED, undefined, T); // The page's recording. @@ -218,7 +220,7 @@ for (const [name, { files, t, golden }] of titles) { const h = wai.sessionBegin(entry, HOST, NONCE, undefined); for (const p of golden.presentations) { const d = golden.decoders[p.decoder]; - const handle = h.decoderFor(envelopeOf.get(d.object), d.capability, d.pin !== null); + const handle = h.decoderFor(envelopeOf.get(d.object), d.capability, d.pin !== null, firstUnitOf(golden, d.object)); h.presented(p.unit, p.layers, handle, p.out_sha256, undefined); } for (const o of golden.objects) h.received(files.get(o.file)); @@ -229,6 +231,7 @@ for (const [name, { files, t, golden }] of titles) { check(page.claim === native.claim && page.link_hash === native.link_hash, `${name}: the page's recording seals the native tool's claim byte for byte`); const body = JSON.parse(page.claim).body; check(body.output_root === golden.output_root && body.leaf_count === golden.leaf_count, `${name}: the session commits to the golden output tree`); + check(body.host.build.profile === 'release' && body.host.build.target === 'wasm32-unknown-unknown', `${name}: the browser claim states a release build for wasm32 (${body.host.build.profile})`); check(body.counted_primary === golden.objects.reduce((a, o) => a + o.counted.total, 0) && body.energy === null, `${name}: counted bytes summed, no energy figure`); const o = JSON.stringify(page.outputs), j = JSON.stringify(page.objects); check(wai.outputRoot(o) === golden.output_root, `${name}: outputRoot over the session's outputs`); @@ -260,14 +263,14 @@ for (const [name, { files, t, golden }] of titles) { const base = golden.objects[0]; const h = wai.sessionBegin(env(base), HOST, NONCE, undefined); // A decoder through a capability the envelope neither carries nor falls back to. - check(/neither the envelope's capability/.test(refusedBy(() => h.decoderFor(env(base), 'wai.audio.int_codec', true)) ?? ''), + check(/neither the envelope's capability/.test(refusedBy(() => h.decoderFor(env(base), 'wai.audio.int_codec', true, 0)) ?? ''), 'decoderFor refuses a capability its envelope neither carries nor falls back to'); const p0 = golden.presentations.find((x) => x.layers === 1); // Integers from JS: whole numbers in range, never truncated or wrapped. Each case on a // fresh handle, refused for its own field and not for anything an earlier case left. const fresh = () => { const x = wai.sessionBegin(env(base), HOST, NONCE, undefined); - return [x, x.decoderFor(env(base), golden.decoders[0].capability, golden.decoders[0].pin !== null)]; + return [x, x.decoderFor(env(base), golden.decoders[0].capability, golden.decoders[0].pin !== null, 0)]; }; for (const [what, field, f] of [ ['unit 0.5', 'unit', (x, dd) => x.presented(0.5, 1, dd, p0.out_sha256, undefined)], @@ -298,15 +301,29 @@ for (const [name, { files, t, golden }] of titles) { const dd = golden.decoders[p.decoder]; if (dd.object === last.object) continue; const key = `${dd.object}`; - if (!handles.has(key)) handles.set(key, h.decoderFor(env(golden.objects.find((o) => o.object === dd.object)), dd.capability, dd.pin !== null)); + if (!handles.has(key)) handles.set(key, h.decoderFor(env(golden.objects.find((o) => o.object === dd.object)), dd.capability, dd.pin !== null, firstUnitOf(golden, dd.object))); h.presented(p.unit, p.layers, handles.get(key), p.out_sha256, undefined); } for (const o of golden.objects) h.received(env(o)); + // A repeat is one object with the bytes of both; bytes that are not an envelope are + // refused at once; an encrypted envelope no entry names is held, uncounted. + h.received(env(golden.objects[0])); + for (const [what, bytes] of [['seven bytes of the base', env(base).subarray(0, 7)], ['a broken magic', Uint8Array.from([0x57, 0x41, 0x49, 0x33, 0, 0, 0, 0])]]) { + check(/not a WAI1 or WAI2 envelope/.test(refusedBy(() => h.received(bytes)) ?? ''), `received refuses ${what} at once`); + } + const encrypted = new Uint8Array(readFileSync(join(corpus, 'counting/encrypted.wai'))); + h.received(encrypted); const r = h.finish(SEED, undefined, T); + const seenEnc = r.objects.find((o) => o.content_hash === wai.stageContentHash(encrypted)); + check(seenEnc && seenEnc.counted === null && seenEnc.presented === false, 'an encrypted envelope received is listed uncounted and not presented'); + check(r.objects.find((o) => o.content_hash === base.object)?.transferred === 2 * env(base).length, 'the base received twice: one object, transferred twice its length'); + vectors.push({ name: 'recorder/inert-and-repeat', procedure: 'claim', receipt: r.claim, + context: { outputs: r.outputs, objects: r.objects, envelopes: [...golden.objects.map(env), encrypted].map((e) => ({ envelope: Buffer.from(e).toString('hex') })) } }); + expected.push(`recorder/inert-and-repeat\taccept link_hash=${r.link_hash}`); const seen = r.objects.find((o) => o.content_hash === last.object); check(seen && seen.presented === false && JSON.parse(r.claim).body.counted_discarded === last.counted.total, 'an object received and never presented is recorded as not presented, and counted as discarded'); - check(wai.verifyClaim(r.claim, JSON.stringify(r.outputs), JSON.stringify(r.objects), golden.objects.map(env)) === '', + check(wai.verifyClaim(r.claim, JSON.stringify(r.outputs), JSON.stringify(r.objects), [...golden.objects.map(env), encrypted]) === '', 'that session verifies against the envelopes received'); } diff --git a/wai/wai-web/src/measure.rs b/wai/wai-web/src/measure.rs index 8afe83f30..cae1146ba 100644 --- a/wai/wai-web/src/measure.rs +++ b/wai/wai-web/src/measure.rs @@ -207,8 +207,9 @@ pub(crate) fn host_of(host_json: &str) -> Result { /// nothing else, SPEC §4), on the primary path, with this build's decoders; `pinned` /// when its decode verified the parameter set its manifest pins, whose SHA-256 is then /// the entry's `pin` and whose declared tier (SPEC §3.1: an unregistered token, or none, -/// reads as `none`) its `tier`. -pub(crate) fn decoder_key(envelope: &[u8], via: Option<&str>, pinned: bool) -> Result { +/// reads as `none`) its `tier`; `first_unit` the title's unit that is unit 0 of the +/// object's base (of the object itself for a base, of the base it refines for a layer). +pub(crate) fn decoder_key(envelope: &[u8], via: Option<&str>, pinned: bool, first_unit: u64) -> Result { let w = Wai::from_bytes(envelope).map_err(|e| e.to_string())?; if let Some(v) = via { if v != w.capability() && w.fallback() != Some(v) { @@ -226,6 +227,7 @@ pub(crate) fn decoder_key(envelope: &[u8], via: Option<&str>, pinned: bool) -> R capability: via.unwrap_or(w.capability()).to_owned(), rendition: None, object: wai::jwp_hash::content_hash(envelope), + first_unit, path: SessionPath::Primary, decoder: wai::stage_measure::session::builtin_decoder(), variant: None, @@ -464,20 +466,26 @@ impl SessionHandle { /// The handle of the decoder that decoded `envelope` here, through `via` (its /// manifest's capability where absent; otherwise that capability or its fallback, and /// any other is refused); `pinned` when the decode verified the parameter set the - /// manifest pins. The same decoder on the same object gives the same handle. + /// manifest pins; `first_unit` the title's unit that is unit 0 of the object's base (of + /// the object for a base, of the base it refines for a layer), 0 where absent. The + /// recorder holds the envelopes, so a `first_unit` that puts a presentation outside the + /// units its envelope covers is refused when the session is sealed. The same decoder on + /// the same object gives the same handle. #[wasm_bindgen(js_name = decoderFor)] - pub fn decoder_for(&mut self, envelope: &[u8], via: Option, pinned: bool) -> Result { - let k = decoder_key(envelope, via.as_deref(), pinned).map_err(js_err)?; + pub fn decoder_for(&mut self, envelope: &[u8], via: Option, pinned: bool, first_unit: Option) -> Result { + let first_unit = first_unit.map(|f| int(f, "first_unit")).transpose()?.unwrap_or(0); + let k = decoder_key(envelope, via.as_deref(), pinned, first_unit).map_err(js_err)?; Ok(self.rec()?.decoder(k) as u32) } /// An object received whole on the primary path, as its bytes — every object the page - /// received, presented or not, and one it refused too. The recorder derives its - /// figures, and whether any of its outputs was presented from the presentations it is - /// told, and holds it, so `finish` checks the claim against it. + /// received, presented or not, and one it refused too, an encrypted envelope it cannot + /// open included. Bytes that are not a `WAI1` or `WAI2` envelope are refused at once and + /// nothing is recorded. The recorder derives its figures, and whether any of its outputs + /// was presented from the presentations it is told, and holds it, so `finish` checks the + /// claim against it. Received again, it is one object with the bytes of both. pub fn received(&mut self, envelope: &[u8]) -> Result<(), JsError> { - self.rec()?.received_envelope(envelope); - Ok(()) + self.rec()?.received_envelope(envelope, SessionPath::Primary).map_err(js_err) } /// A presentation: `unit` at `layers` (1 for the base alone), through the decoder @@ -695,11 +703,12 @@ mod tests { }; for p in &m.e.presentations { let (cap, pin, object) = &m.e.decoders[usize::from(p.p.decoder)]; - let h = r.decoder(decoder_key(envelope_of(object), Some(cap), pin.is_some()).unwrap()); + let first = m.e.objects.iter().find(|o| o.content_hash == *object).map(|o| m.e.bases[o.base].0.info.first_unit).unwrap(); + let h = r.decoder(decoder_key(envelope_of(object), Some(cap), pin.is_some(), first).unwrap()); r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); } for o in &m.e.objects { - r.received_envelope(envelope_of(&o.content_hash)); + r.received_envelope(envelope_of(&o.content_hash), SessionPath::Primary).unwrap(); } let got = finish(r, subject, &seed, None, T).unwrap(); assert_eq!(got["claim"], want["claim"], "{name}: the page's session is the native tool's"); @@ -727,10 +736,11 @@ mod tests { } /// A decoder is named only through the envelope's own capability or its fallback - /// (SPEC §4); any other `via` is refused before anything is recorded. A recorder that - /// does not hold the envelopes (told the objects' figures instead) can seal an entry - /// naming a capability its envelope does not give; `verifyClaim` with the envelopes - /// refuses that claim (`session_source_mismatch`), and without them cannot. + /// (SPEC §4); any other `via` is refused before anything is recorded. An entry naming a + /// capability its envelope does not give, recorded past that check, is refused when the + /// session is sealed, against the envelope the recorder holds (`session_source_mismatch`). + /// Bytes that are not an envelope are refused when received, and an encrypted envelope no + /// entry names is held, uncounted, and the session seals. #[test] fn a_decoder_is_named_through_its_envelopes_capability() { let dir = "staged-measure-conformance/fixtures/still"; @@ -738,28 +748,31 @@ mod tests { let m = measured(dir, &files).unwrap(); let base = &m.t.bases[0].obj.bytes; let cap = Wai::from_bytes(base).unwrap().capability().to_owned(); - assert_eq!(decoder_key(base, Some(&cap), true).unwrap().capability, cap); - assert_eq!(decoder_key(base, None, true).unwrap().capability, cap); - let why = decoder_key(base, Some("wai.audio.int_codec"), true).unwrap_err(); + assert_eq!(decoder_key(base, Some(&cap), true, 0).unwrap().capability, cap); + assert_eq!(decoder_key(base, None, true, 0).unwrap().capability, cap); + let why = decoder_key(base, Some("wai.audio.int_codec"), true, 0).unwrap_err(); assert!(why.contains("neither the envelope's capability"), "{why}"); - // Sealed without the envelopes, as a recorder told figures may seal it. - let (mut r, subject) = begin(base, host_of(HOST).unwrap(), [7; 32], None).unwrap(); - let mut k = decoder_key(base, None, true).unwrap(); - k.capability = "wai.audio.int_codec".into(); - let h = r.decoder(k); + let encrypted = std::fs::read(wai_dir().join("staged-measure-conformance/counting/encrypted.wai")).unwrap(); let p = &m.e.presentations[0]; - r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); - r.received(wai::claim_receipt::ObjectSeen { - content_hash: subject, - path: SessionPath::Primary, - counted: Some(base.len() as u64), - transferred: base.len() as u64, - presented: true, - }); - let s = finish(r, subject, &"44".repeat(32), None, T).unwrap(); + let session = |capability: Option<&str>| { + let (mut r, subject) = begin(base, host_of(HOST).unwrap(), [7; 32], None).unwrap(); + let mut k = decoder_key(base, None, true, 0).unwrap(); + if let Some(c) = capability { + k.capability = c.into(); + } + let h = r.decoder(k); + r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); + r.received_envelope(base, SessionPath::Primary).unwrap(); + r.received_envelope(&encrypted, SessionPath::Primary).unwrap(); + assert!(r.received_envelope(&base[..7], SessionPath::Primary).is_err(), "not an envelope"); + finish(r, subject, &"44".repeat(32), None, T) + }; + let s = session(None).unwrap(); let (claim, o, j) = (s["claim"].as_str().unwrap(), s["outputs"].to_string(), s["objects"].to_string()); - assert_eq!(verify_session(claim, &o, &j, None).unwrap(), "", "without the envelopes, nothing to check it against"); - assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone()])).unwrap(), "session_source_mismatch"); + assert_eq!(s["objects"][1]["counted"], Value::Null, "the encrypted envelope: uncounted"); + assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone(), encrypted.clone()])).unwrap(), "", "an inert envelope no entry names"); + let why = session(Some("wai.audio.int_codec")).unwrap_err(); + assert!(why.contains("session_source_mismatch"), "{why}"); } /// Integers from JS are whole numbers in range, read as given: never truncated (0.5, -- 2.54.0 (Apple Git-157) From f15a726b576dd767acd350f7677a96ea25929504 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 22:34:55 -0400 Subject: [PATCH 04/21] wai: a held layer is one a sink can apply, at its base's first unit; units in the payload's own format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §2.4.12, against the envelopes, three holes closed and the rules renumbered: - A held layer an entry names must be one a sink can apply as its refines states (staged-delivery §3, §4.1 steps 1-2): refines that reads as §3 defines it, present on a refinement-only capability; a WAI2 base that is a rendition of the same envelope; a base, where held, that is a base; and, where the base's units are read, a span within them and runs that sum to them (session_refines_malformed). A malformed refines no longer leaves its presentations unchecked. - A held layer's entry states the first_unit of an entry naming its base, a WAI1 base by content hash, a WAI2 one by envelope and rendition; and, against the stage claims, an entry naming a claim's base or a layer it lists states a unit stage_sets names that claim at (session_first_unit_mismatch). - A WAI1 base's units are read in its payload's own format: its capability's pinned format, or its fallback's where the capability pins none, whichever capability the entry names. Naming the fallback no longer skips the check. Vectors from the review's probes: layer and WAI2 refinement-component first_unit mismatches, a base and its layer shifted together (accepted), the fallback base in range and past it, refines at layer 0, a span past or empty over a held base, refines absent, a base that is a layer, WAI2 components through the layers and units rules, a WAI2 base that is no rendition or no component id, a held inert envelope listed with counted 0, and a stage set's base and layer entries off its unit. session_stage_unit_not_presented moves its entries with the set, so it still rejects with session_stage_disagrees. The pinned prefix is unchanged; 496 vectors. claim_verify.py implements every rule as wai-rs does; differential.py extends session_held to WAI2 refinement components, fallback bases and layers a sink cannot apply, and perturbs first_unit across base, layer and stage set. Co-Authored-By: Claude Opus 5.5 --- wai/claim-conformance/README.md | 45 +- wai/claim-conformance/claim_verify.py | 107 +- wai/claim-conformance/differential.py | 153 +- wai/claim-conformance/vectors.json | 1465 ++++++++++++++++- wai/extensions/jwp-receipts.md | 70 +- wai/wai-rs/src/claim_receipt.rs | 13 +- .../src/claim_receipt/corpus/session.rs | 304 +++- wai/wai-rs/src/claim_receipt/session.rs | 203 ++- 8 files changed, 2186 insertions(+), 174 deletions(-) diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index cf6afc0f8..2e2f592f9 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -39,10 +39,11 @@ out_digest}`), `redecoded` (what a verifier that decoded presentations again fou `{content_hash, path, counted, transferred, presented}`, `counted` `null` for an object not countable, each (content hash, path) once), `envelopes` (each `WAI2` envelope the session received and any `WAI1` envelope the verifier holds, `{envelope}`, its bytes in -hex; an object's `counted` is checked against its envelope's counted bytes, a decoder -entry naming one as its `object` is checked against it, a presentation through such an -entry against the layer count and the units it gives, and the classical rendition is read -from each readable `WAI2` envelope by §2.4.12's rule) and +hex, inert bytes included; an object's `counted` is checked against its envelope's +counted bytes, a decoder entry naming one as its `object` is checked against it, a held +layer's against what a sink can apply and its `first_unit` against its base's entry's, a +presentation through such an entry against the layer count and the units it gives, and +the classical rendition is read from each readable `WAI2` envelope by §2.4.12's rule) and `stage_claims` (the wire forms of the `stage` claims it names). An `object` context may also carry the class its leaf is labelled with (jwp-receipts §2.2), in energy-measurement §2.7's JSON @@ -247,9 +248,19 @@ The vectors cover: one no entry names marked presented, the sums restated to agree (`session_presented_mismatch`); an encrypted envelope, a `WAI1` envelope with no manifest members and bytes of neither magic, each named by an entry - (`session_envelope_unreadable`); a unit presented at more layers than its layer - envelope or its base gives (`session_layers_mismatch`); a unit past the base's frames, - outside a layer's span or a `WAI2` rendition's frame, and through an entry whose + (`session_envelope_unreadable`); a held inert envelope listed with counted bytes 0 + (`session_counted_mismatch`); held layers a sink cannot apply — at layer 0, with a span + past or empty over a held base, with no `refines` on a refinement-only capability, with + a base that is itself a layer, and, as `WAI2` refinement components, with a base that + is no rendition of the envelope, named by no component id, or a span past it + (`session_refines_malformed`); a layer's entry at another `first_unit` than its base's + entry's, as a `WAI1` layer and as a `WAI2` refinement component, and the entries of a + `stage` claim's base and of a layer it lists at another than the unit `stage_sets` + names the claim at (`session_first_unit_mismatch`); a unit presented at more layers + than its layer envelope, its refinement component or its base gives + (`session_layers_mismatch`); a unit past the base's frames, the same past the frames + of a base decoded through its manifest's `fallback`, outside a layer's span, a `WAI2` + rendition's frame or a refinement component's base, and through an entry whose `first_unit` is moved (`session_unit_outside_object`); a second rendition of a capability the session decoded, of another media, WAI's own, a companion, a record, a parameter set, a neural codec, an unregistered string, or a text capability in a text envelope — none a classical @@ -386,17 +397,23 @@ and that do not, objects counted otherwise, listed twice or marked presented oth counted bytes that are not a held envelope's, a `first_unit` moved, inert bytes received and named by an entry or not, every acquisition class), checked against its presentations, objects, WAI2 envelopes and a `stage` claim; and sessions holding their envelopes — a base -of one to six frames and layers refining it at layer 1 or 2 over a span or all of its -units, or naming another base — with presentations through each at one to three layers, -within what each envelope covers and past it, entries whose `first_unit` is the base's or -one off, and objects whose figures are each envelope's or one told otherwise, listed -twice, fetched again, or beside inert bytes, the base held or not. Further session families: +of one to six frames, a `WAI1` envelope whose manifest may name a fallback its entry +decodes through or the base component of a `WAI2` envelope, and layers refining it at +layer 1 or 2 over a span or all of its units, as `WAI1` envelopes or refinement +components, now and then naming another base or a layer as their base, at layer 0, with +an empty span or one past the base, or with no `refines` — with presentations through +each at one to three layers, within what each envelope covers and past it, entries whose +`first_unit` is the base's or one off, the base's and the layers' each, and objects whose +figures are each envelope's or one told otherwise, listed twice, fetched again, or beside +inert bytes, the base held or not. Further session families: sessions that pass steps 1–5 against a `stage` claim whose first layer applied to some units and arrived late for others, presented at one to three layers, with objects that -hold or lack the set's base and layers (both bounds of §2.4.12's check); sessions naming +hold or lack the set's base and layers (both bounds of §2.4.12's check), the base's or +the layer's entry now and then at another first unit than the set's; sessions naming one to three `stage` claims of one set, as a sink that forgot its base names one per epoch, each listing first and second layers of every status, sometimes one named a unit -further on, presented within and past what the claims holding each unit applied; the missed +further on, presented within and past what the claims holding each unit applied, and an +entry now and then at another first unit than the claims'; the missed presentations and switches written at, around and past their caps; WAI2 envelopes whose manifests readers may read otherwise (members of the wrong type, pins that are not pins, `security` members, duplicate members, numbers and nesting past every range, byte-order diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 68debe5c2..69b4779a7 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -932,14 +932,37 @@ def read_envelope(data): return None +def base_units(cap, fallback, p): + """§2.4.12: the units a WAI1 base's payload holds, read in the payload's own format: the + format pinned for the manifest's capability, or, where it pins none, for its fallback, + which decodes the same payload (SPEC §4 step 5).""" + if cap in IPV.CAP_MAGIC: + return payload_units(cap, p) + return payload_units(fallback, p) if isinstance(fallback, str) else None + + +def layer_of(ref, n, base): + """A well-formed refines and its base's units where read: ("layer", layers, span, + base), or ("malformed",) where its span lies outside those units or its runs do not + sum to the units it covers (staged-delivery §3, §4.1 step 2).""" + if n is not None: + try: + SV.check_units(ref, n) + except SV.Malformed: + return ("malformed",) + span = ref["span"] if ref["span"] is not None else (None if n is None else (0, n)) + return ("layer", ref["layer"] + 1, span, base) + + def check_session_envelopes(c, envs, objs, ps): """§2.4.12 against the envelopes the session received: every WAI2 one, and any WAI1 one the verifier holds, with the objects and the presentations where those are held. In order: each among the objects received; each object listed with an envelope's content hash states its counted bytes; each envelope a decoder entry names readable; - each entry naming what its envelope gives; each presentation through a held entry at - the layer count its envelope gives, and of a unit it covers; then the classical - length over the readable WAI2 envelopes.""" + each entry naming what its envelope gives; each held layer an entry names one a sink + can apply; each held layer's entry at the first unit of an entry naming its base; each + presentation through a held entry at the layer count its envelope gives, and of a unit + it covers; then the classical length over the readable WAI2 envelopes.""" b = c["body"] need(c["class"] == "reconstruct-session", 6, "context_mismatch") if objs is not None: @@ -970,28 +993,33 @@ def check_session_envelopes(c, envs, objs, ps): need(gives, 6, "session_source_mismatch") def given(d): - """What d's held envelope gives a presentation: (layers, (a, n)), either None where - WAI does not read it; None where the envelope is not held.""" + """What d's held envelope is: ("base", units or None), ("layer", layers, span or + None, (base hash, base rendition or None)), or ("malformed",); None where the + envelope is not held.""" r = by_hash.get(d["object"]) if r is None: return None + refinement_only = lambda cap: cap in SV.UNIT_KIND # noqa: E731 if r[0] == "one": m, payload = r[1], r[2] + mr = m["model_requirement"] ref = m.get("refines") if ref is None: - n = payload_units(d["capability"], payload) - return 1, (None if n is None else (0, n)) + if refinement_only(mr["capability"]): + return ("malformed",) + return ("base", base_units(mr["capability"], mr.get("fallback"), payload)) try: ref = SV.parse_refines(ref) except SV.Malformed: - return None, None - span = ref["span"] - if span is None: - base = by_hash.get(ref["base"]) - if base is not None and base[0] == "one" and base[1].get("refines") is None: - n = payload_units(base[1]["model_requirement"]["capability"], base[2]) - span = None if n is None else (0, n) - return ref["layer"] + 1, span + return ("malformed",) + n = None + base = by_hash.get(ref["base"]) + if base is not None and base[0] == "one": + bmr = base[1]["model_requirement"] + if base[1].get("refines") is not None or refinement_only(bmr["capability"]): + return ("malformed",) + n = base_units(bmr["capability"], bmr.get("fallback"), base[2]) + return layer_of(ref, n, (ref["base"], None)) if d["rendition"] is None: return None m, payloads = r[1], r[2] @@ -1001,31 +1029,41 @@ def check_session_envelopes(c, envs, objs, ps): e = rs[d["rendition"]] ref = e.get("refines") if ref is None: - n = payload_units(e["capability"], payloads[d["rendition"]]) - return 1, (None if n is None else (0, n)) + if refinement_only(e["capability"]): + return ("malformed",) + return ("base", payload_units(e["capability"], payloads[d["rendition"]])) try: ref = SV.parse_refines_ids(ref) except SV.Malformed: - return None, None - span = ref["span"] - if span is None: - j = next((j for j, x in enumerate(rs) if x.get("id") == ref["base"]), None) - if j is not None: - n = payload_units(rs[j]["capability"], payloads[j]) - span = None if n is None else (0, n) - return ref["layer"] + 1, span + return ("malformed",) + j = next((j for j, x in enumerate(rs) if x.get("id") == ref["base"]), None) + if j is None or rs[j].get("refines") is not None or refinement_only(rs[j]["capability"]): + return ("malformed",) + return layer_of(ref, payload_units(rs[j]["capability"], payloads[j]), (d["object"], j)) + ds = b["decoders"] + need(not any((given(d) or ("",))[0] == "malformed" for d in ds), 6, "session_refines_malformed") + for d in ds: + g = given(d) + if g is not None and g[0] == "layer": + h, j = g[3] + bases = [e["first_unit"] for e in ds if e["object"] == h and (j is None or e["rendition"] == j)] + need(not bases or d["first_unit"] in bases, 6, "session_first_unit_mismatch") if ps is not None: - ds = b["decoders"] for p in ps: g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None - need(g is None or g[0] is None or p["layers"] == g[0], 6, "session_layers_mismatch") + if g is not None and g[0] in ("base", "layer"): + need(p["layers"] == (1 if g[0] == "base" else g[1]), 6, "session_layers_mismatch") for p in ps: g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None - if g is not None and g[1] is not None: - a, n = g[1] - f = ds[p["decoder"]]["first_unit"] + a - need(f <= p["unit"] < f + n, 6, "session_unit_outside_object") + covers = None + if g is not None and g[0] == "base" and g[1] is not None: + covers = (0, g[1]) + elif g is not None and g[0] == "layer" and g[2] is not None: + covers = g[2] + if covers is not None: + f = ds[p["decoder"]]["first_unit"] + covers[0] + need(f <= p["unit"] < f + covers[1], 6, "session_unit_outside_object") decoded = {d["capability"] for d in b["decoders"]} total = None for r in readable: @@ -1062,6 +1100,13 @@ def check_session_stage_claims(c, wires, ps, objs): if received is not None: need(s["subject"] in received and all(o["object"] in received for o in arrived), 6, "session_stage_disagrees") claims.append((s, named)) + # Each entry naming a claim's base, or a layer object it lists, has a first unit at + # which stage_sets names a claim listing that object. + at = {} + for s, named in claims: + for h in [s["subject"]] + [o["object"] for o in s["body"]["objects"]]: + at.setdefault(h, set()).update(named) + need(all(d["first_unit"] in at[d["object"]] for d in b["decoders"] if d["object"] in at), 6, "session_first_unit_mismatch") if ps is None: return fin = finals(ps) diff --git a/wai/claim-conformance/differential.py b/wai/claim-conformance/differential.py index 7aaa2f09a..d3b004bed 100644 --- a/wai/claim-conformance/differential.py +++ b/wai/claim-conformance/differential.py @@ -25,9 +25,11 @@ reconstruct-session claims built from random presentation lists, around every ru their caps, a null deadline with misses, presences that disagree, decoder indices out of range, leaves moved between entries, entries out of first-use order, every acquisition class — with their outputs, re-decodes, objects, entry envelopes and stage claims that -reach their stages or miss them, and sessions holding a base's and its layers' envelopes, -presented within and past the layers and units each envelope gives, with objects whose -figures are each envelope's or told otherwise — +reach their stages or miss them, and sessions holding a base's and its layers' envelopes +— WAI1 envelopes or a WAI2 envelope's components, some layers a sink cannot apply — +presented within and past the layers and units each envelope gives, through entries at +their base's first unit or another, with objects whose figures are each envelope's or +told otherwise — writes them in the corpus's format with no declared outcome, runs both verifiers' `verdicts` mode, and reports every input on which they differ. @@ -50,7 +52,7 @@ there is still a difference in the claim verdict, and is reported like any other listing marks it, since its cause is in the two OER verifiers rather than the claim rules. Those two are compared on their own by `../oer-conformance/fuzz_differential.py`. """ -import argparse, base64, copy, io, json, os, random, subprocess, sys, tempfile +import argparse, base64, copy, hashlib, io, json, os, random, subprocess, sys, tempfile from decimal import Decimal, localcontext HERE = os.path.dirname(os.path.abspath(__file__)) @@ -876,6 +878,9 @@ def session_stage_bounds(ins, rng, n): decoders = [dict(dec[0], object=base_hash, leaves=sum(1 for p in ps if p["decoder"] == 0))] if any(p["decoder"] == 1 for p in ps): decoders.append(dict(dec[1], object=CV.blake3(b"differential: a stage layer").hex(), leaves=sum(1 for p in ps if p["decoder"] == 1))) + if rng.random() < 0.15: + # The base's entry, or its layer's, at another first unit than the set's. + rng.choice(decoders)["first_unit"] += 1 w = session_stage_claim(rng, n_set, rng.choice([at1, at1, max(0, at1 - 1), min(n_set, at1 + 1)]), VIEWER, base_hash, late=late if late and at1 + late <= n_set else 0) objects = [] @@ -973,6 +978,9 @@ def session_stage_epochs(ins, rng, n): # Presented exactly when an entry names it, as an honest sink states it. for o in objects: o["presented"] = o["content_hash"] in {d["object"] for d in decoders} + if rng.random() < 0.15: + # The base's entry, or a layer's, at another first unit than the claims'. + rng.choice(decoders)["first_unit"] += rng.choice([1, 2]) units = n_set + 1 ordered = sorted(ps, key=lambda p: (p["unit"], p["layers"])) sets = sorted({(f, CV.link_hash(json.loads(w))) for f, w in named}) @@ -997,15 +1005,32 @@ def wiv1(frames, keyframe): "rans_b64": base64.b64encode(b"\x33" * 8).decode()}, keyframe=keyframe) +def wai2_of(entries, payloads): + """A WAI2 envelope of the manifest entries `entries`, each with its payload's SHA-256, + over `payloads`.""" + m = {"wai": "1.1", "media": "video", "intent": "replicate", + "renditions": [dict(e, sha256=hashlib.sha256(p).hexdigest()) for e, p in zip(entries, payloads)], "target": None} + t = json.dumps(m, separators=(",", ":")).encode() + table, o = b"", 0 + for p in payloads: + table += o.to_bytes(4, "little") + len(p).to_bytes(4, "little") + o += len(p) + return b"WAI2" + len(t).to_bytes(4, "little") + t + len(payloads).to_bytes(2, "little") + table + b"".join(payloads) + + def session_held(ins, rng, n): """§2.4.12 step 6 against the envelopes with the outputs and the objects, around the - rules that read what a held envelope gives: a base WAI1 envelope of one to six frames, - and layer envelopes refining it at layer 1 or 2 over a span or over all of its units, - or naming another base; presentations through each at one to three layers, of units - within what the envelope covers and past it, through entries whose `first_unit` is the - base's first unit or one off; the objects each envelope's figures — counted bytes, - length, fetched once or more, presented exactly when an entry names it — or one told - otherwise, listed twice, or inert bytes received beside them; the base held or not.""" + rules that read what a held envelope gives: a base of one to six frames — a WAI1 + envelope whose manifest may name a fallback the base's entry decodes through, or the + base component of a WAI2 envelope — and layers refining it at layer 1 or 2 over a span + or over all of its units, as WAI1 envelopes or as refinement components of that WAI2 + envelope, now and then naming another base or one that is a layer, at layer 0, with an + empty span or one past the base, or with no `refines`; presentations through each at + one to three layers, of units within what the envelope covers and past it, through + entries whose `first_unit` is the base's first unit or one off, the base's and the + layers' each; the objects each envelope's figures — counted bytes, length, fetched once + or more, presented exactly when an entry names it — or one told otherwise, listed + twice, or inert bytes received beside them; the base held or not.""" model = ins.by_name["session_held_layer_accept"] base = json.loads(model["receipt"]) envs = [bytes.fromhex(e["envelope"]) for e in model["context"]["envelopes"]] @@ -1017,29 +1042,77 @@ def session_held(ins, rng, n): jtext = lambda m: json.dumps(m, separators=(",", ":")).encode() dec = {d["capability"]: d for d in base["body"]["decoders"]} encrypted = encrypted_envelope(model_envelope(ins, b"WAI2")) + HYPER, REFINE = "wai.video.int_hyper", "wai.video.int_refine" for i in range(n): frames = rng.choice([1, 2, 3, 4, 4, 6]) - cap = rng.choice(["wai.video.int_hyper", "wai.video.int_hyper", "wai.video.int_motion"]) - bm = dict(base_m, model_requirement={"capability": cap}) - base_env = SV.wai1(jtext(bm), wiv1(frames, keyframe) if rng.random() < 0.95 else b"\x33" * 16) - bh = SV.content_hash(base_env) first = rng.choice([0, 0, 1, 2, 5]) - # The layers: at layer 1 or 2, over a span or the whole base, refining this base or - # another; layer 2's previous producer the layer-1 envelope before it. - layers = [] + form = rng.choice(["wai1", "wai1", "wai2"]) + # The layers: at layer 1 or 2, over a span or the whole base, and now and then one a + # sink cannot apply. + specs = [] for k in range(rng.choice([0, 1, 1, 2, 3])): - lm = copy.deepcopy(one_m) level = 1 if k == 0 or rng.random() < 0.5 else 2 frm = rng.randint(0, frames) count = rng.randint(1, max(1, frames - min(frm, frames - 1))) span = None if rng.random() < 0.3 else {"from": frm, "count": count} - ref_base = bh if rng.random() < 0.9 else CV.blake3(b"differential: another base %d" % i).hex() - prev = ref_base if level == 1 or not layers else SV.content_hash(layers[-1][1]) - lm["refines"] = {"base": ref_base, "prev": prev, "layer": level} - if span is not None: - lm["refines"]["span"] = span - payload = one_p if span is not None and span["count"] == 1 else four_p - layers.append((level, SV.wai1(jtext(lm), payload), span)) + bad = rng.choice(["layer0", "empty", "absent", "past", "on_layer"]) if rng.random() < 0.12 else None + specs.append((level, span, bad)) + + def refines(base_ref, prev, level, span, bad, on_layer): + r = {"base": base_ref, "prev": prev, "layer": 0 if bad == "layer0" else level} + if bad == "empty": + r["span"] = {"from": 0, "count": 0} + elif bad == "past": + r["span"] = {"from": frames, "count": 2} + elif span is not None: + r["span"] = span + if bad == "on_layer" and on_layer is not None: + r["base"] = r["prev"] = on_layer + r["layer"] = 1 + return r + + payload_of = lambda span: one_p if span is not None and span["count"] == 1 else four_p # noqa: E731 + if form == "wai1": + cap = rng.choice([HYPER, HYPER, "wai.video.int_motion"]) + fallback = "wai.video.av1" if rng.random() < 0.25 else None + mr = {"capability": cap, "fallback": fallback} if fallback else {"capability": cap} + base_env = SV.wai1(jtext(dict(base_m, model_requirement=mr)), wiv1(frames, keyframe) if rng.random() < 0.95 else b"\x33" * 16) + subject = SV.content_hash(base_env) + held_envs, layer_objects = [base_env], [] + for k, (level, span, bad) in enumerate(specs): + ref_base = subject if rng.random() < 0.9 else CV.blake3(b"differential: another base %d" % i).hex() + prev = ref_base if level == 1 or not layer_objects else layer_objects[-1] + lm = copy.deepcopy(one_m) + if bad == "absent": + lm.pop("refines", None) + else: + lm["refines"] = refines(ref_base, prev, level, span, bad, layer_objects[0] if layer_objects else None) + e = SV.wai1(jtext(lm), payload_of(span)) + held_envs.append(e) + layer_objects.append(SV.content_hash(e)) + base_entry = dict(dec[HYPER], capability=cap, rendition=None, object=subject, first_unit=first) + if fallback and rng.random() < 0.5: + base_entry.update(capability=fallback, pin=None, tier=None) # decoded through the fallback + elif cap != HYPER: + base_entry.update(pin=None, tier=None) # no pin above its capability's class + layer_entries = [dict(dec[REFINE], rendition=None, object=h) for h in layer_objects] + else: + comps, payloads = [{"capability": HYPER, "kind": "int_hyper", "id": "b"}], [wiv1(frames, keyframe)] + for k, (level, span, bad) in enumerate(specs): + base_id = "b" if rng.random() < 0.92 else rng.choice(["c", "B", "r0"]) + prev = base_id if level == 1 or k == 0 else f"r{k - 1}" + e = {"capability": REFINE, "kind": "refine", "id": f"r{k}", "role": "refinement"} + if bad != "absent": + e["refines"] = refines(base_id, prev, level, span, bad, "r0" if k else None) + comps.append(e) + payloads.append(payload_of(span)) + env = wai2_of(comps, payloads) + subject = SV.content_hash(env) + held_envs = [env] + base_entry = dict(dec[HYPER], rendition=0, object=subject, first_unit=first) + layer_entries = [dict(dec[REFINE], rendition=k + 1, object=subject) for k in range(len(specs))] + for d in layer_entries: + d["first_unit"] = first if rng.random() < 0.9 else rng.choice([0, first + 1]) # Each unit at one layer through the base, and some at two or three through a layer # of that level — one covering the unit, or any. units = list(range(first, first + frames)) @@ -1049,17 +1122,16 @@ def session_held(ins, rng, n): for u in sorted(set(units)): ps.append({"unit": u, "layers": 1, "decoder": 0}) for level in (1, 2): - cands = [j for j, (lv, _, sp) in enumerate(layers) if lv == level] - cover = [j for j in cands if layers[j][2] is None or layers[j][2]["from"] <= u - first < layers[j][2]["from"] + layers[j][2]["count"]] + cands = [j for j, (lv, _, _) in enumerate(specs) if lv == level] + cover = [j for j in cands if specs[j][1] is None or specs[j][1]["from"] <= u - first < specs[j][1]["from"] + specs[j][1]["count"]] pick = cover if cover and rng.random() < 0.85 else cands if not pick or rng.random() < 0.4: break ps.append({"unit": u, "layers": level + 1, "decoder": 1 + rng.choice(pick)}) - if rng.random() < 0.15 and layers: - # A presentation through an entry whose envelope gives another layer count: a - # layer's for a unit at one layer, or a layer of the other level, or the base's. + if rng.random() < 0.15 and specs: + # A presentation through an entry whose envelope gives another layer count. p = rng.choice(ps) - p["decoder"] = 1 + rng.randrange(len(layers)) if p["layers"] == 1 or rng.random() < 0.6 else 0 + p["decoder"] = 1 + rng.randrange(len(specs)) if p["layers"] == 1 or rng.random() < 0.6 else 0 for p in ps: p["out_digest"] = CV.blake3(b"differential: held %d %d %d" % (i, p["unit"], p["layers"])).hex() # Entries in first-use order, the unused layers named by none. @@ -1069,20 +1141,15 @@ def session_held(ins, rng, n): order.append(p["decoder"]) for p in ps: p["decoder"] = order.index(p["decoder"]) + all_entries = [base_entry] + layer_entries decoders = [] for j, old in enumerate(order): - if old == 0: - d = dict(dec["wai.video.int_hyper"], capability=cap, object=bh, first_unit=first) - if cap != "wai.video.int_hyper": - d.update(pin=None, tier=None) # no pin above its capability's class - else: - d = dict(dec["wai.video.int_refine"], object=SV.content_hash(layers[old - 1][1]), - first_unit=first if rng.random() < 0.9 else rng.choice([0, first + 1])) + d = dict(all_entries[old]) d["leaves"] = sum(1 for p in ps if p["decoder"] == j) decoders.append(d) if rng.random() < 0.1: decoders[0]["first_unit"] = rng.choice([first + 1, max(0, first - 1)]) - held = [base_env] + [e for _, e, _ in layers] + held = list(held_envs) named = {d["object"] for d in decoders} objects = [{"content_hash": SV.content_hash(e), "path": "primary", "counted": CV.counted_of(e), "transferred": len(e) * rng.choice([1, 1, 1, 2, 3]), "presented": SV.content_hash(e) in named} @@ -1098,8 +1165,8 @@ def session_held(ins, rng, n): o["presented"] = not o["presented"] elif k == 2: o["counted"] = rng.choice([None, 0, (o["counted"] or 0) + 1, max(0, (o["counted"] or 0) - 1)]) - elif k == 3: - held = held[1:] if rng.random() < 0.5 else held # the base not held + elif k == 3 and len(held) > 1: + held = held[1:] # the base not held elif k == 4: inert = rng.choice([encrypted, b"differential: inert bytes %d" % i]) elif k == 5: @@ -1121,7 +1188,7 @@ def session_held(ins, rng, n): ctx = {"outputs": ps, "objects": objects, "envelopes": [{"envelope": e.hex()} for e in envelopes]} if rng.random() < 0.05: del ctx["outputs"] - ins.add(f"session_held_{i}", CV.jcs(sign(dict(base, subject=bh, body=body), VIEWER)), ctx) + ins.add(f"session_held_{form}_{i}", CV.jcs(sign(dict(base, subject=subject, body=body), VIEWER)), ctx) def wai2_with(manifest_text, rest): diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index 28dd24e1b..006a9cd96 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -8170,6 +8170,177 @@ "link_hash": "4298e3350c1e2fe6bd6b298827cf537b75e63c5c54ca3fd35f946ff21e68de2a" } }, + { + "name": "session_envelope_inert_counted_zero", + "about": "the encrypted WAI2 envelope, held, listed with counted bytes 0 and the sums restated: it is not countable, so its counted bytes are null", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":11102,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0eb0de2194f5344cea24531de70efc1b4b65e0abb137bfb186a3097ab4f9c3fada7893d3ec37b42f71b97d1da7557a4870f59da7d29aef731b3294490f6d050d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "redecoded": [ + { + "index": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "index": 4, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + }, + { + "content_hash": "645e21c03105a434c53b0c0b2da54576bc3a42e4186703df7bf67171c12a6cd9", + "path": "primary", + "counted": 0, + "transferred": 1107, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414932b60000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + }, + { + "envelope": "57414932e50000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_counted_mismatch" + } + }, { "name": "session_unit_outside_rendition", "about": "the WAI2 rendition's entry states first_unit 3, so its one frame is unit 3, and unit 4 is presented through it", @@ -8841,6 +9012,1010 @@ "link_hash": "7a377a15e9880643af13a85fa36a94955e9e1d15d1b9129ce22f1017d6fe0de5" } }, + { + "name": "session_layer_first_unit_not_its_base", + "about": "the layer over unit 1 of a base whose entry states first_unit 0 is named with first_unit 2, and its presentation moved to unit 3, which its span would then cover", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":2,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"cc7121f4fec07c71c75dc99e9088bc945e6571d836ca7be6914d7a0143f11683\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8eb8868aae6aa731549456a8d58352fca33d6ea1847ce4a747b68e1e3ccc20793f1919f3fb6274f4948509ffdc27c782e5e2e860acecb326599ed7a45cabed04\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 3, + "layers": 2, + "decoder": 1, + "out_digest": "ab18c5a26c59ff8de3da644ea5f2f8c4914d50fc361c7c84d3395f3846dc5bcf" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, + { + "name": "session_layer_first_unit_past_the_title", + "about": "the layer named with first_unit 100 and presented at unit 101, far past its base's four units at 0 to 3", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":100,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"3efeea10de64e67f272b2fb549b51d6d0433f630dabcedf0721cd2aa8b762477\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"9653d62daffb53cc5d640f96974ccc8a6ae4dbe2655573cd11a4a33df091a8737067cdab3ecf59d0695f8787b10bcfdbf2f803153a59d5c1823a5f915dfc730d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 101, + "layers": 2, + "decoder": 1, + "out_digest": "c3a0e63e85187755d8d5fa643aa69d64d9c59160ad968c349053e11edb38713c" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, + { + "name": "session_layer_first_unit_shifted_with_its_base_accept", + "about": "the base and its layer both at first_unit 2: units 2 to 5, and the layer's span, unit 1 of the base, is unit 3", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":2,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":2,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"be210d236a6d18e7998108f14281bb414c8465c8e22aa0bb477e3d2386dc0788\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4b21eca1a382c927c83ffa15412f077ed979b66b5cfe8bf3b8e40bc07726eb64eaac79ac6a93da96b9cbea9461a41bdbf26f0b643c2f5919dff5f250dc2a9d0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 0, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 0, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 3, + "layers": 2, + "decoder": 1, + "out_digest": "ab18c5a26c59ff8de3da644ea5f2f8c4914d50fc361c7c84d3395f3846dc5bcf" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "71a3215c03b0f73c1922accae2a261915cf42f6ec724e68f5778b2ddd37ee61c" + } + }, + { + "name": "session_unit_fallback_accept", + "about": "a four-frame wai.video.int_hyper clip whose manifest names wai.video.av1 as its fallback, decoded through the fallback: units 0 to 3", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":355,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":355,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"19aa39cb6412db4f3407a598776d0b90da587b517771c3ff2ea7cbeb2f9a5d9b4c55dc85cfc76c5ac2737a00f68bb0e5609ffdd7c832a1addee93603d3400608\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c", + "path": "primary", + "counted": 355, + "transferred": 355, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931b30000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c2266616c6c6261636b223a227761692e766964656f2e617631227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "54083ad7490a577f79578278127f21c8bc3256b243d324a204d441d03901e031" + } + }, + { + "name": "session_unit_fallback_past_the_title", + "about": "the same clip decoded through its fallback, and unit 9 presented through it: the fallback decodes the same four-frame payload", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":355,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"2796e2bf2841e662aee7b7bcebbdb53b2f0b685b531e6cd2a6c8d489bf67ee99\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":355,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3bca993a7b121fa6644564a5d576affcc3418b04894cb75f3833f9790d83775b4b459dcb327da78eb9109491899eda76e378067cb258c1ea352af270b1f9eb02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 9, + "layers": 1, + "decoder": 0, + "out_digest": "686ff0277613c58687a493af12da86b393bcee283c6758845a2505a93d135905" + } + ], + "objects": [ + { + "content_hash": "3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c", + "path": "primary", + "counted": 355, + "transferred": 355, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931b30000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c2266616c6c6261636b223a227761692e766964656f2e617631227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_refines_layer_zero", + "about": "a held layer whose refines states layer 0, presented at nine layers", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1515,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"57db33ec98046605bd03b5139111fffc84f4a8a40ad1b883acb26e9a244c7db1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"398983fee12551097b34905a91a303d255ab786b049ce5c31b59e767f8ca8f5e\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1515,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"35b11db88bedb59f081adb9db6658a298c2668e0f478ba79a2cc766c22f2a2c69c3d04ae7de77e8ab3f64b3625c83740d4da859fa5e03ae5e3aebd695c48450d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 9, + "decoder": 1, + "out_digest": "9df7f2652febf9fe462ff426af1ee3ec158bf203c59392654482b80775804556" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "57db33ec98046605bd03b5139111fffc84f4a8a40ad1b883acb26e9a244c7db1", + "path": "primary", + "counted": 1187, + "transferred": 1187, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414931430100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a307d2c22746172676574223a6e756c6c7d54030000574952310101000004000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c0000000c0000000c0000000c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_refines_span_past_base", + "about": "a held layer whose span runs from unit 2 for 50 units, over a held base of four, and unit 40 presented through it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":956,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"0a1faea6885fd5e842e1602e346a2d5ff7c0c159a65ac2b1b3a5ddabdeb668ff\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"f871844ebf39a94f5e22a9e16fd432aef2859d7cc01e25b94ca9568dd2d9b159\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":956,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"ca7c3d8870a2ced04dc4fecb1a70df9fe73147882571404407de22787b735d36a356b1c172e54de909a055e980825bd2579f406717e0ef0847a220aba4117a02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 40, + "layers": 2, + "decoder": 1, + "out_digest": "3cc608f7181aa9440e7fd6e0cc95d9f50aa8349763b3d30c990d0ee64f6bb036" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "0a1faea6885fd5e842e1602e346a2d5ff7c0c159a65ac2b1b3a5ddabdeb668ff", + "path": "primary", + "counted": 628, + "transferred": 628, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414931600100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a322c22636f756e74223a35307d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_refines_span_empty", + "about": "a held layer whose span has count 0", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"2b42c7bb3c09e2aeca27c2560969db2f70fb160d606b44217e2e6594c7946664\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"072024312558fb508a01aff80e6ffb1eb79625bc2e2cb48e98c084cbf478913262dcae8aa811d640dec461b22de973f9409566f787705dff51f64fc3b0e3f803\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "2b42c7bb3c09e2aeca27c2560969db2f70fb160d606b44217e2e6594c7946664", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a302c22636f756e74223a307d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_refines_absent", + "about": "a held layer of wai.video.int_refine, a refinement-only capability, with no refines", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1345,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5585cbe35dc8496057975566fcd9955e0dc73d4145c86eb688592e2227433340\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1345,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dd5ba2ef86212b24a96fde92ca1a9fa7189245705b4bfb723976c46738b4c0dd75093d07790dadb511803c739ac66282bd116b4d41d491d61ccb16b6201dec03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "5585cbe35dc8496057975566fcd9955e0dc73d4145c86eb688592e2227433340", + "path": "primary", + "counted": 1017, + "transferred": 1017, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "57414931990000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7d54030000574952310101000004000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c0000000c0000000c0000000c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_refines_base_is_a_layer", + "about": "a held layer whose refines names as its base another held layer, not a base", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1554,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"8d555ec859a170c9fe71be0adb0de03dc0f85624fe6fc813d17243bef8b38b05\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":6,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"2a9b21848517ef255000bc47fc1f195c36d7165cbb7b9ccbd7bcad204319833f\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1554,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6545d372002d2bfc1f291143b501490cedd08cae03b7012ee2c2d046de7d04751e6c0d0751d0fe549fa9ec47f91c07426a82f45754dd5286ab47744f93b86707\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 1, + "layers": 3, + "decoder": 2, + "out_digest": "f422310242ff0aa741c4ac2b87de241b27cfb625307225ee151e243c6386c647" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "4c184d629a95caeb12069f98e51ca167d07cf30ec1e9de23414c3debdece7ac3", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + }, + { + "content_hash": "8d555ec859a170c9fe71be0adb0de03dc0f85624fe6fc813d17243bef8b38b05", + "path": "primary", + "counted": 599, + "transferred": 599, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + }, + { + "envelope": "57414931430100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2234633138346436323961393563616562313230363966393865353163613136376430376366333065633165396465323334313463336465626465636537616333222c2270726576223a2234633138346436323961393563616562313230363966393865353163613136376430376366333065633165396465323334313463336465626465636537616333222c226c61796572223a317d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_wai2_layer_accept", + "about": "a WAI2 envelope of a one-frame base component and a refinement component over it: unit 0 at one layer through the base, at two through the refinement", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":865,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52a798c4fa43426919db8ade72abcf93f6052b1996acdd34e2e31d96f2ee07ad\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":865,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e64dbf54167b874c4411cebbcbb89e63958fff722fab41ecec9cba525266befe63040e76f2851fc06cb4526436974e818be50276b423cea269b4420cec028002\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7", + "path": "primary", + "counted": 865, + "transferred": 865, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932a70100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "71123ad9ffdd76c396ad98ec4024a745c8ae3fcde9c2da4d92cc1023dd73c8d5" + } + }, + { + "name": "session_wai2_layer_count_past", + "about": "unit 0 at three layers through the refinement component, which refines at layer 1, so two", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":865,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"520ebe4e9178b24b707b2e498f5b587c066e4365fe886466b85be48bd045305a\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":865,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f11b43937176731202af5bde66686df009fdb7212eae612134ffa0b916454ae241b3020bdc3e38ec6153481376e141ba497d81cee2f0920b2861a3485c12640e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 3, + "decoder": 1, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "objects": [ + { + "content_hash": "ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7", + "path": "primary", + "counted": 865, + "transferred": 865, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932a70100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layers_mismatch" + } + }, + { + "name": "session_wai2_layer_unit_past", + "about": "unit 1 at two layers through the refinement component, whose base component is one frame, unit 0", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":865,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"7472a5567462d8e48880e62ec36db397840288d6163f8fc3e4f9ffa6effcd172\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":865,\"uncounted\":0,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"eaa6b0722aa703c7d504693b6ca85d1846f0e3dda3f06e1f760a642be506dce2896215c5088239a0bcef4316faf7c46047cde4695e7f87378c37606e97a63c03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7", + "path": "primary", + "counted": 865, + "transferred": 865, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932a70100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_wai2_layer_first_unit_not_its_base", + "about": "the refinement component's entry states first_unit 5 while its base component's states 0, and unit 5 is presented through it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":865,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"a0c8e462160c2488deb682f992af78bea67ad3c09feaca90d5ddc63b298c8ca0\",\"primary_units\":2,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":865,\"uncounted\":0,\"units\":2},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"042f1ee5b23cf25fa136d3978d796471fb2743c5b30e09fb11930673d9c81ff7d4f86b690736a675dc712092ac3a0a7d56079722611d885baa8fbb10a0aabc02\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 5, + "layers": 2, + "decoder": 1, + "out_digest": "567a6f4939b43f7c69111fe913abf036863a05b785d5f7a75e52733d68d8e7d8" + } + ], + "objects": [ + { + "content_hash": "ea7d56599b421c66259b19f0ce7759381a60a2daeef6860945eeec1196abe8f7", + "path": "primary", + "counted": 865, + "transferred": 865, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932a70100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, + { + "name": "session_wai2_layer_span_accept", + "about": "a refinement component with a span of unit 0 of its one-frame base", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":893,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"e5b702535e476926b2e7ed098306db9bcc6d152aa39c87d7f18e7d74116d9f2e\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"e5b702535e476926b2e7ed098306db9bcc6d152aa39c87d7f18e7d74116d9f2e\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52a798c4fa43426919db8ade72abcf93f6052b1996acdd34e2e31d96f2ee07ad\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":893,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cbc69b936e6fa1f040e78a4fa5c27c1e199fb4709f34214aaeea6a3d2015f52f33349a4db8318f300cef1ccb6337db9f5d86de31aa8ed5776e8571e9f5a1b707\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"e5b702535e476926b2e7ed098306db9bcc6d152aa39c87d7f18e7d74116d9f2e\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "e5b702535e476926b2e7ed098306db9bcc6d152aa39c87d7f18e7d74116d9f2e", + "path": "primary", + "counted": 893, + "transferred": 893, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932c30100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a302c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "3a8f6f49b29f185a40a54c7014d49507c6d3e17f3b4910a6e4c84bceb98b948b" + } + }, + { + "name": "session_wai2_refines_base_missing", + "about": "a refinement component whose refines names a component the envelope does not hold", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":865,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"651b6d060ebb3f99d101932de9142cfb9a63c8befac78fa6832419c4c895e0a6\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"651b6d060ebb3f99d101932de9142cfb9a63c8befac78fa6832419c4c895e0a6\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52a798c4fa43426919db8ade72abcf93f6052b1996acdd34e2e31d96f2ee07ad\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":865,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5ba05a8b4cc8eb2107052c707266f20a48f5163495735023196d240d503a20c584d425f971db04e34b0e60e816c395c1bdac1a59d77ab22d7426097a1c96ef03\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"651b6d060ebb3f99d101932de9142cfb9a63c8befac78fa6832419c4c895e0a6\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "651b6d060ebb3f99d101932de9142cfb9a63c8befac78fa6832419c4c895e0a6", + "path": "primary", + "counted": 865, + "transferred": 865, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932a70100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2263222c2270726576223a2263222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_wai2_refines_id_malformed", + "about": "a refinement component whose refines names its base by an id that is not a component id (an uppercase letter)", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":865,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"cc2e1dbb941059c5a90753bed35d23036d3f4058afdb72abb24e737c3feb6b19\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"cc2e1dbb941059c5a90753bed35d23036d3f4058afdb72abb24e737c3feb6b19\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52a798c4fa43426919db8ade72abcf93f6052b1996acdd34e2e31d96f2ee07ad\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":865,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d6403ec152160bb918a06f95cd966b11690e6a0d0c2bd66a14f49353d426ebf9e7c37c2f9d5d2a70888130ca3dd4f60585712aa16739f81aebabe1f888ea5c08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"cc2e1dbb941059c5a90753bed35d23036d3f4058afdb72abb24e737c3feb6b19\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "cc2e1dbb941059c5a90753bed35d23036d3f4058afdb72abb24e737c3feb6b19", + "path": "primary", + "counted": 865, + "transferred": 865, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932a70100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2242222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2242222c2270726576223a2242222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, + { + "name": "session_wai2_refines_span_past_base", + "about": "a refinement component whose span runs past its one-frame base", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":893,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"57d336381cd5b95ddad905d4709df6e82f4a7e60dd2f06c96ce72a2542e5b500\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"57d336381cd5b95ddad905d4709df6e82f4a7e60dd2f06c96ce72a2542e5b500\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52a798c4fa43426919db8ade72abcf93f6052b1996acdd34e2e31d96f2ee07ad\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":893,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8966b601e685922481854d56b234a52bf63be895883f03c658d8d76ad127c31bec0b5088bdf69b5e1b6087597074f9a0385073838282ba718d12b111ceff2b05\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"57d336381cd5b95ddad905d4709df6e82f4a7e60dd2f06c96ce72a2542e5b500\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "57d336381cd5b95ddad905d4709df6e82f4a7e60dd2f06c96ce72a2542e5b500", + "path": "primary", + "counted": 893, + "transferred": 893, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932c30100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a302c22636f756e74223a327d7d7d5d2c22746172676574223a6e756c6c7d0200000000009800000098000000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, { "name": "session_no_classical_accept", "about": "a session with no classical length, beside an envelope whose second rendition is WAI's own", @@ -10212,9 +11387,9 @@ }, { "name": "session_stage_unit_not_presented", - "about": "the stage set placed at unit 3, so its last unit is a unit the session never presented", + "about": "the stage set placed at unit 3, and the entries naming its base and layers with it, so its last unit is a unit the session never presented", "procedure": "claim", - "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":3}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"50e0b23ffaf4fac790eea746bb85f537226b04cbd0c0752abbdf10e55914749e4f0e9e7d44c39dcd7369b062061bc2a64405cb857faeca8e70bee24ffe8e240b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":3,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":3,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":3,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":3,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":3,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":3}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7fa8f2637d89d3f5c2f7b366a6b35a1252b461d5986a1209fbab31cb5dddca4210dc45e401930cc8cbfb1c15104f5b70a7da68b9344de7810e1f0e63b6831802\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { "outputs": [ { @@ -10353,6 +11528,292 @@ "reason": "session_stage_disagrees" } }, + { + "name": "session_stage_base_first_unit_not_the_sets", + "about": "the base's entry states first_unit 1, and the session names the base's stage claim at unit 0", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":1,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"736e2291826e39844ef18fc79a899152a055da757d722de49184daf34c6514ca5d649f810c7ecc964111b1399500ee7ed70f732372f820c41b410b6c22a8af0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, + { + "name": "session_stage_layer_first_unit_not_the_sets", + "about": "the entry of a layer object the stage claim lists states first_unit 2, and the session names that claim at unit 0", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":2,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4f684d17db8285e589f1fa1998dd67711af0f982a3fed739ea71e44c72cdcb2c44c5e1ee92488445cd7781a2a16cb736c693f7d3c8d46d61543821fddb11bb08\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 1, + "decoder": 1, + "out_digest": "1cd1984bc553c43ee5a48fe7e182a77e60d8ef3c2b0f959ef1a0efd3813b411f" + }, + { + "unit": 5, + "layers": 1, + "decoder": 2, + "out_digest": "e4c4344155dc2c789a1df265f8064b9ae56f3e0932d85c5ceb38782c135749fc" + }, + { + "unit": 0, + "layers": 2, + "decoder": 3, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 4, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 5, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 0, + "layers": 3, + "decoder": 6, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1", + "path": "primary", + "counted": 900, + "transferred": 900, + "presented": true + }, + { + "content_hash": "6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf", + "path": "primary", + "counted": 901, + "transferred": 901, + "presented": true + }, + { + "content_hash": "5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2", + "path": "primary", + "counted": 902, + "transferred": 902, + "presented": true + }, + { + "content_hash": "792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca", + "path": "primary", + "counted": 903, + "transferred": 903, + "presented": false + }, + { + "content_hash": "be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85", + "path": "primary", + "counted": 1000, + "transferred": 1000, + "presented": true + }, + { + "content_hash": "1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376", + "path": "primary", + "counted": 1001, + "transferred": 1001, + "presented": false + }, + { + "content_hash": "f18f33c4eebadf2caf00fb22a38cf394e19d31a62ebe68f3043c31c84ecbcf44", + "path": "primary", + "counted": null, + "transferred": 1060, + "presented": true + }, + { + "content_hash": "13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4", + "path": "fallback", + "counted": null, + "transferred": 3000, + "presented": true + } + ], + "stage_claims": [ + "{\"body\":{\"bytes_envelopes\":10607,\"conflicts\":0,\"deadline_misses\":2,\"objects\":[{\"bytes\":900,\"evidence\":\"none\",\"layer\":1,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":901,\"evidence\":\"none\",\"layer\":1,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":1}},{\"bytes\":902,\"evidence\":\"none\",\"layer\":1,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":2}},{\"bytes\":903,\"evidence\":\"none\",\"layer\":1,\"object\":\"792a12990c5207ca83a86b7420815f1f2d34918553a0130a4f9570a11354f2ca\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":3}},{\"bytes\":1000,\"evidence\":\"none\",\"layer\":2,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"reason\":null,\"status\":\"applied\",\"units\":{\"count\":1,\"from\":0}},{\"bytes\":1001,\"evidence\":\"none\",\"layer\":2,\"object\":\"1c6eae0ed41ed7fc1b2f00b46ea1de98f21a6d6cbf62bf6b22cf76a664a49376\",\"reason\":null,\"status\":\"late\",\"units\":{\"count\":1,\"from\":1}}],\"op_committed\":null,\"op_delivered\":null,\"op_requested\":null,\"presented\":{\"wai-stage:layers\":0},\"stage_hash\":null,\"tier\":\"none\",\"units_by_stage\":[1,2,1],\"vocabulary\":\"urn:wai:staged-delivery:1\"},\"class\":\"stage\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4dd3d2224ea284c09e0b1d28842547fdb90f2887c7adfccd35d58d192932741d10f2b89b96426fc87f445b7dddcd0484ddb8b9fd46864ae335cb219059d5660d\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}" + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, { "name": "session_stage_beyond_applied", "about": "unit 2 presented at three layers and unit 3 at two and three, where the stage claim lists no layer applied over them at those stages", diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index c1e45374a..f219c6d13 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -992,7 +992,7 @@ A **decoder entry**: | `capability` | term | The capability decoded. | | `rendition` | integer or `null` | Its `WAI2` rendition index (SPEC §7.1): `capability` is that rendition's capability. `null` for a `WAI1` envelope. | | `object` | 32 B hex | The content hash (§2.1) of the object it decoded from: the `WAI2` envelope whose rendition it is, or the `WAI1` envelope — a base, or a layer that refines one. An entry decodes one object, so a sink that decodes several through one decoder names an entry for each. | -| `first_unit` | integer | The title's unit that is unit 0 of the object's base: of the object itself for a base or a rendition with no `refines`, and of the base it refines for a layer. A presentation through the entry of the title's unit `u` is of the object's unit `u − first_unit`. | +| `first_unit` | integer | The title's unit that is unit 0 of the object's base: of the object itself for a base or a rendition with no `refines`, and of the base it refines for a layer. A presentation through the entry of the title's unit `u` is of the object's unit `u − first_unit`. Where a verifier holds a layer's envelope and an entry names its base, the layer's entry has that entry's `first_unit`; where it holds a `stage` claim of a set, an entry naming the set's base or a layer the claim lists has the unit `stage_sets` names that claim at (step 6). | | `path` | string | `primary` or `fallback`. | | `decoder` | string | `builtin:@` — `` 1 to 64 of `a`–`z`, `0`–`9`, `_` and `-`, `` 1 to 64 of ASCII letters, digits, `.`, `+` and `-`, beginning with a digit — or `module:sha256:` followed by a module's digest (§7.9), 64 lowercase hexadecimal digits. | | `variant` | term or `null` | A decode path within the decoder, where it has more than one, such as an exact and a floating-point path. | @@ -1101,9 +1101,13 @@ a layer — the verifier holds. An envelope is **readable** when it reads as a ` encrypted one, inert at a sink that cannot open it (SPEC §6.4), one whose `security` member is not a security object, or bytes that are not an envelope at all — is inert. An inert envelope no decoder entry names is an object received, neither counted (its -`counted` is `null`, staged-measurement §3.2) nor presented. Rules 1 and 2 need the -objects as well, rules 5 and 6 the outputs; the others need the envelopes and the claim. -In order: +`counted` is `null`, staged-measurement §3.2) nor presented; a sink lists it like any +other, so the session accounts for every byte it transferred. A **held layer** is a +readable `WAI1` envelope with `refines`, or of a refinement-only capability, or a +`WAI2` rendition likewise; its base, where held, is the readable `WAI1` envelope whose +content hash is `refines.base`, or the rendition of the same `WAI2` envelope whose `id` +it is. Rules 1 and 2 need the objects as well, rules 7 and 8 the outputs; the others +need the envelopes and the claim. In order: 1. Where the verifier holds the objects as well, each envelope is among the objects received, by its content hash (`session_source_not_received`). 2. Where it holds the objects as well, each object listed with an envelope's content hash @@ -1118,22 +1122,35 @@ In order: (`session_source_mismatch`). A signer cannot relabel a decoder entry whose envelope the verifier holds, and so cannot move a presentation through it out of the reach of the re-decode check above. -5. Where it holds the outputs as well, each presentation through a decoder entry whose +5. Each decoder entry whose `object` is a held layer names one a sink can apply as its + `refines` states (staged-delivery §3, §4.1 steps 1–2): its `refines` reads as §3 + defines it, and is present wherever the capability is refinement-only; a `WAI2` + rendition's `base` is the `id` of a rendition of the same envelope; its base, where + held, carries no `refines` and is not of a refinement-only capability; and where the + base's units are read (rule 8), its span lies within them and its runs sum to the + units it covers (`session_refines_malformed`). A sink refuses any other + (`refines-malformed`), so no presentation through it is possible. +6. Each decoder entry whose `object` is a held layer whose base a decoder entry names — + a `WAI1` base by its content hash, a `WAI2` rendition by its envelope and `rendition` + — has the `first_unit` of one of those entries (`session_first_unit_mismatch`). A + layer's units are its base's. +7. Where it holds the outputs as well, each presentation through a decoder entry whose envelope is held is at the layer count that envelope gives: 1 for a base, or a rendition with no `refines`, and `refines.layer + 1` for a layer - (`session_layers_mismatch`). A `refines` that is malformed (staged-delivery §3) gives - no count to check. -6. Where it holds the outputs as well, each presentation through a decoder entry whose + (`session_layers_mismatch`). +8. Where it holds the outputs as well, each presentation through a decoder entry whose envelope is held is of a unit that envelope covers: its `unit` is at least `first_unit + a` and below `first_unit + a + n`, where for a base, or a rendition with no `refines`, `a` is 0 and `n` the units its payload holds — a `WIV1` clip's frames, and - one for a `WIH1` picture, a `WIA1` clip and a `WIS1` tensor; for a layer, `a` and `n` - are its `span`'s `from` and `count`, or, with no span, 0 and the units of its base, - read where the base's envelope is held (a `WAI1` base by its content hash, a `WAI2` - rendition by its component id) (`session_unit_outside_object`). Where WAI reads no - unit count — a payload in no format SPEC §5 pins, one that does not parse as its own, - or a base not held — the presentation is not checked. -7. The lengths of the readable `WAI2` envelopes' classical renditions whose capability no + one for a `WIH1` picture, a `WIA1` clip and a `WIS1` tensor — read in the payload's own + format: the one SPEC §5 pins for the capability, or, for a `WAI1` manifest whose + capability pins none, for its `fallback`, which decodes the same payload (SPEC §4 step + 5), whichever capability the entry names; for a layer, `a` and `n` are its `span`'s + `from` and `count`, or, with no span, 0 and the units of its base, read where the + base's envelope is held (`session_unit_outside_object`). Where WAI reads no unit count + — a payload in no format SPEC §5 pins, one that does not parse as its own, or a base + not held — the presentation is not checked. +9. The lengths of the readable `WAI2` envelopes' classical renditions whose capability no decoder entry decoded sum to `classical_declared`, which is `null` exactly when there is none (`session_classical_mismatch`). @@ -1146,7 +1163,11 @@ epochs, and bases that cover the same units of the title each have their own. In 3. where the verifier holds the objects as well, each one's `subject`, the set's base, and every layer object it lists as arrived — `applied`, `partial`, `late` or `refused`, with bytes — are among the objects received (`session_stage_disagrees`); -4. where the verifier holds the outputs as well, for each claim and each entry of +4. each decoder entry whose `object` is the `subject` of one of them, or a layer object + one lists, has as its `first_unit` the `first_unit` of an entry of `stage_sets` naming + a claim of that object (`session_first_unit_mismatch`): a set's base and its layers + are at the units the session names the set at; +5. where the verifier holds the outputs as well, for each claim and each entry of `stage_sets` naming it, with `f` that entry's `first_unit` and `n` the units the claim counts (`session_stage_disagrees`): - every unit from `f` to `f + n − 1` is presented; @@ -1155,7 +1176,7 @@ epochs, and bases that cover the same units of the title each have their own. In unit presented on time at a stage was presented at every lower stage before it, and late presentations are leaves of the tree as well, so the tree can hold more than a `stage` claim counts and never less; -5. where it holds the outputs, from above: every unit of an entry's units presented at +6. where it holds the outputs, from above: every unit of an entry's units presented at more than `s` layers lies in the span of a layer-`s` object that a claim named by an entry holding the unit lists as `applied` or `partial` (`session_stage_disagrees`). A unit reaches a stage only through a layer the sink applied: a `late` layer missed the @@ -1905,6 +1926,8 @@ and never folds it in: confirmation changes the outcome of no step here. | 6 | `session_presented_mismatch` | an object is listed as presented and no decoder entry names it, or as not presented and one does | | 6 | `session_envelope_unreadable` | an envelope a decoder entry names is not a `WAI1` or `WAI2` envelope whose payloads are plaintext | | 6 | `session_source_mismatch` | a decoder entry names other than its object's envelope gives — another rendition, a capability that rendition or that `WAI1` manifest does not have, or a rendition of a `WAI1` envelope — or names a rendition and its envelope is not held | +| 6 | `session_refines_malformed` | a decoder entry names a held layer a sink cannot apply as its `refines` states: malformed or absent, its base not a base or not a rendition of the envelope, or its span outside a held base's units | +| 6 | `session_first_unit_mismatch` | a decoder entry's `first_unit` is not its base's: a held layer's, against the entries naming its base; or an entry naming a `stage` claim's base or layer, against the unit `stage_sets` names the claim at | | 6 | `session_layers_mismatch` | a presentation through a decoder entry whose envelope is held is at another layer count than that envelope gives | | 6 | `session_unit_outside_object` | a presentation through a decoder entry whose envelope is held is of a unit that envelope does not cover, from its `first_unit` | | 6 | `session_classical_mismatch` | the envelopes' classical renditions the session did not decode give another `classical_declared` | @@ -2404,8 +2427,17 @@ sink stated rather than derived — counted bytes above what the held envelope g not presented that one does (`session_presented_mismatch`); a session holding its base's and a layer's envelopes, accepted, and a presentation at more layers than its envelope gives (`session_layers_mismatch`), of a unit past the base's frames, outside the layer's -span, or outside a `WAI2` rendition's frame, and through an entry whose `first_unit` is -moved (`session_unit_outside_object`); a `stage` claim that verifies, one that does not, one by another key, +span, or outside a `WAI2` rendition's frame, through an entry whose `first_unit` is +moved, and past the frames of a base decoded through its manifest's `fallback` +(`session_unit_outside_object`); a held inert envelope listed with counted bytes 0 +(`session_counted_mismatch`); held layers a sink cannot apply — layer 0, a span past +or empty over a held base, no `refines` on a refinement-only capability, a base that is +itself a layer, and in a `WAI2` envelope a base that is no rendition or no component id, +and a span past it (`session_refines_malformed`); a layer's entry at another +`first_unit` than its base's, in a `WAI1` layer and a `WAI2` refinement component, and +the base's and a layer's entries at another than the unit `stage_sets` names their +`stage` claim at (`session_first_unit_mismatch`); `WAI2` refinement components presented +within and past the layers and units they give; a `stage` claim that verifies, one that does not, one by another key, one the session does not name, one about a base the session never received, one whose arrived layers the session never received, and sessions presenting stages its applied layers cannot have given — through layers it lists as late or refused among them — and diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index 7cb38e75f..506ab7385 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -362,6 +362,15 @@ pub enum Reason { /// A decoder entry's capability or rendition is not what its object's envelope /// gives, or it names a rendition of an envelope not held. SessionSourceMismatch, + /// A decoder entry names a held layer a sink cannot apply as its `refines` states: + /// a `refines` that is malformed or absent where the capability is refinement-only, a + /// base that is not a base or names no component, or a span outside a held base's + /// units. + SessionRefinesMalformed, + /// A decoder entry's `first_unit` is not its base's: a held layer's, against the + /// entries naming the base it refines, or an entry naming a `stage` claim's base or + /// layer, against the `first_unit` `stage_sets` names that claim at. + SessionFirstUnitMismatch, /// A presentation through an entry whose envelope is held is at another layer count /// than that envelope gives. SessionLayersMismatch, @@ -471,6 +480,8 @@ impl Reason { Reason::SessionPresentedMismatch => "session_presented_mismatch", Reason::SessionEnvelopeUnreadable => "session_envelope_unreadable", Reason::SessionSourceMismatch => "session_source_mismatch", + Reason::SessionRefinesMalformed => "session_refines_malformed", + Reason::SessionFirstUnitMismatch => "session_first_unit_mismatch", Reason::SessionLayersMismatch => "session_layers_mismatch", Reason::SessionUnitOutsideObject => "session_unit_outside_object", Reason::SessionClassicalMismatch => "session_classical_mismatch", @@ -3488,7 +3499,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 475 + 496 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index 7f3c87a52..a350b18b8 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -1046,6 +1046,25 @@ pub(super) fn vectors() -> Vec { &[base_envelope(), classical_envelope(), encrypted], &[&stage], )); + // The same envelope listed with counted bytes 0: an inert envelope is not countable, so + // its `counted` is null and nothing else. + let mut counted_zero = with_encrypted.clone(); + if let Some(o) = counted_zero.last_mut() { + o.counted = Some(0); + } + v.push(all_held( + reject( + "session_envelope_inert_counted_zero", + "the encrypted WAI2 envelope, held, listed with counted bytes 0 and the sums restated: it is not countable, so its counted bytes are null", + sealed(counted_from(m(), &counted_zero)).to_json(), + 6, + Reason::SessionCountedMismatch, + ), + &ps, + &counted_zero, + &[base_envelope(), classical_envelope(), encrypted_envelope()], + &[&stage], + )); // The units an envelope covers: the WAI2 envelope's first rendition is one frame, the // unit its entry's first_unit names. v.push(all_held( @@ -1061,6 +1080,7 @@ pub(super) fn vectors() -> Vec { &[&stage], )); v.extend(held_vectors()); + v.extend(apply_vectors()); v.push(env( "session_no_classical_accept", "a session with no classical length, beside an envelope whose second rendition is WAI's own", @@ -1182,13 +1202,39 @@ pub(super) fn vectors() -> Vec { )); v.push(r_stage( "session_stage_unit_not_presented", - "the stage set placed at unit 3, so its last unit is a unit the session never presented", - SessionClaim { stage_sets: vec![StageSetRef { first_unit: 3, claim: stage.link_hash() }], ..m() }, + "the stage set placed at unit 3, and the entries naming its base and layers with it, so its last unit is a unit the session never presented", + { + let mut s = SessionClaim { stage_sets: vec![StageSetRef { first_unit: 3, claim: stage.link_hash() }], ..m() }; + for d in s.decoders.iter_mut().filter(|d| d.rendition.is_none() && d.object != fallback_object()) { + d.first_unit = 3; + } + s + }, &ps, &objects, vec![stage.to_json()], Some(Reason::SessionStageDisagrees), )); + // The entries naming the set's base, or a layer its claim lists, at another first unit + // than the one the set is named at. + v.push(r_stage( + "session_stage_base_first_unit_not_the_sets", + "the base's entry states first_unit 1, and the session names the base's stage claim at unit 0", + { let mut s = m(); s.decoders[0].first_unit = 1; s }, + &ps, + &objects, + vec![stage.to_json()], + Some(Reason::SessionFirstUnitMismatch), + )); + v.push(r_stage( + "session_stage_layer_first_unit_not_the_sets", + "the entry of a layer object the stage claim lists states first_unit 2, and the session names that claim at unit 0", + { let mut s = m(); s.decoders[3].first_unit = 2; s }, + &ps, + &objects, + vec![stage.to_json()], + Some(Reason::SessionFirstUnitMismatch), + )); // S1: units presented at layers no applied layer object reaches. let mut beyond = ps.clone(); beyond.extend([pres(2, 3, 3), pres(3, 2, 3), pres(3, 3, 3)]); @@ -1503,18 +1549,24 @@ fn forget_vectors() -> Vec { /// counts it and reads its `refines`. fn layer_envelope(span: Option<(u32, u32)>) -> Vec { use crate::container::{Conditioning, Manifest, ModelRequirement, Prev, Refines, Span, Wai}; + let payload = wir1_payload(span.map_or(4, |(_, c)| c) as usize); + let base = hex(&entry()); + let refines = Refines { base: base.clone(), prev: Prev::One(base), layer: 1, span: span.map(|(from, count)| Span { from, count }) }; + let m = Manifest::new("video", "replicate", ModelRequirement::new("wai.video.int_refine"), Conditioning::new("none")).with_refines(&refines); + Wai::new(m, payload).to_bytes().expect("a WAI1 envelope") +} + +/// A `WIR1` residual of `units` 16 × 16 RGB units, coded by the reference encoder +/// (`staged::wir1::encode`). +fn wir1_payload(units: usize) -> Vec { use crate::staged::wir1::{self, Below, Predictor, RefineParams, UnitKind}; - let units = span.map_or(4, |(_, c)| c) as usize; let below = vec![0u8; 16 * 16 * 3]; let target: Vec = (0..16 * 16 * 3).map(|i| (i % 7) as u8).collect(); let belows: Vec> = (0..units).map(|_| Below::U8(&below)).collect(); let targets: Vec> = (0..units).map(|_| Below::U8(&target)).collect(); let params = RefineParams { q: 2, predictor: Predictor::Identity, rate: (1, 1), table_per_unit: false, max_symbols: 64 }; let (payload, _) = wir1::encode(UnitKind::Rgb8, &belows, (16, 16, 3), &targets, (16, 16, 3), ¶ms).expect("a WIR1 payload"); - let base = hex(&entry()); - let refines = Refines { base: base.clone(), prev: Prev::One(base), layer: 1, span: span.map(|(from, count)| Span { from, count }) }; - let m = Manifest::new("video", "replicate", ModelRequirement::new("wai.video.int_refine"), Conditioning::new("none")).with_refines(&refines); - Wai::new(m, payload).to_bytes().expect("a WAI1 envelope") + payload } /// A session over the model's base and the layer objects `layers`, each envelope held: @@ -1653,6 +1705,244 @@ fn held_vectors() -> Vec { ] } +/// A `WAI1` layer of `wai.video.int_refine` with `refines` written as `refines` (absent +/// where `None`), whatever it says, over a `WIR1` residual of `units` units. +fn layer_with(refines: Option, units: usize) -> Vec { + use crate::container::{Conditioning, Manifest, ModelRequirement, Wai}; + let mut m = Manifest::new("video", "replicate", ModelRequirement::new("wai.video.int_refine"), Conditioning::new("none")); + m.refines = refines; + Wai::new(m, wir1_payload(units)).to_bytes().expect("a WAI1 envelope") +} + +/// The model's base, a four-frame `wai.video.int_hyper` clip, whose manifest names +/// `wai.video.av1` as its fallback. +fn base_with_fallback() -> Vec { + use crate::container::{Conditioning, Manifest, ModelRequirement, Wai}; + let m = Manifest::new("video", "replicate", ModelRequirement::new("wai.video.int_hyper").with_fallback("wai.video.av1"), Conditioning::new("none")); + Wai::new(m, wiv1(4)).to_bytes().expect("a WAI1 envelope") +} + +/// A `WAI2` envelope of a one-frame `wai.video.int_hyper` base component of id `base_id` +/// and a refinement component of `wai.video.int_refine` with `refines` written as given, +/// over a `WIR1` residual of one unit. +fn wai2_layered(base_id: &str, refines: Value) -> Vec { + use crate::container::RenditionMeta; + let mut meta = RenditionMeta::new("wai.video.int_refine", "refine"); + meta.id = Some("r".into()); + meta.role = Some("refinement".into()); + meta.refines = Some(refines); + WaiMulti::new( + "video", + "replicate", + Value::Null, + vec![ + Rendition::media("wai.video.int_hyper", "int_hyper", wiv1(1)).with_id(base_id).with_payload_digest(), + Rendition::from_meta(meta, wir1_payload(1)).with_payload_digest(), + ], + ) + .to_bytes() + .expect("a WAI2 envelope") +} + +/// A session over the held envelopes `es`, the first its entry object, with `decoders` +/// and the presentations `ps`: the objects are the envelopes, each listed with what it +/// gives. +fn held_over(es: &[Vec], decoders: Vec, ps: &[Presentation]) -> (ClaimReceipt, Vec) { + let named: Vec<[u8; 32]> = decoders.iter().map(|d| d.object).collect(); + let objects: Vec = es + .iter() + .map(|e| { + let h = object_content_hash(e); + ObjectSeen { content_hash: h, path: SessionPath::Primary, counted: counted_of(e), transferred: e.len() as u64, presented: named.contains(&h) } + }) + .collect(); + let s = SessionClaim { + session_nonce: crate::pin::sha256(b"claim-conformance: a session over the envelopes it holds"), + decoders, + switches: vec![], + switches_total: 0, + deadline_us: None, + missed: 0, + missed_units: vec![], + stage_sets: vec![], + receipt_bytes: 0, + classical_declared: None, + classical_source: None, + ..model() + }; + (sealed_about(object_content_hash(&es[0]), counted_from(restated(s, ps), &objects)), objects) +} + +/// §2.4.12 step 6 against the envelopes: a held layer a sink can apply, at its base's first +/// unit, its units read in the payload's own format, and `WAI2` refinement components. +fn apply_vectors() -> Vec { + let vector = |name: &'static str, about: &'static str, es: Vec>, decoders: Vec, ps: Vec, reason: Option| { + let (c, os) = held_over(&es, decoders, &ps); + let v = match reason { + None => claim(name, about, c.to_json(), Ok(())), + Some(r) => reject(name, about, c.to_json(), 6, r), + }; + with(with(with(v, "outputs", outputs_value(&ps)), "objects", objects_value(&os)), "envelopes", envelopes_value(&es)) + }; + let base = base_envelope(); + let bh = hex(&entry()); + let hyper = |first_unit: u64| entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, None, entry(), first_unit, 0); + let refine = |object: &[u8], first_unit: u64| entry_decoder("wai.video.int_refine", SessionPath::Primary, false, None, object_content_hash(object), first_unit, 0); + let base_ps = |first: u64| -> Vec { (first..first + 4).map(|u| pres(u, 1, 0)).collect() }; + let and = |mut ps: Vec, more: &[Presentation]| { + ps.extend_from_slice(more); + ps + }; + let refines = |layer: u64, span: Option<(u64, u64)>| { + let mut r = json!({ "base": bh, "prev": bh, "layer": layer }); + if let Some((from, count)) = span { + r["span"] = json!({ "from": from, "count": count }); + } + r + }; + let span_layer = layer_envelope(Some((1, 1))); + let mut v = vec![ + // A layer's first unit is its base's. + vector( + "session_layer_first_unit_not_its_base", + "the layer over unit 1 of a base whose entry states first_unit 0 is named with first_unit 2, and its presentation moved to unit 3, which its span would then cover", + vec![base.clone(), span_layer.clone()], + vec![hyper(0), refine(&span_layer, 2)], + and(base_ps(0), &[pres(3, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + ), + vector( + "session_layer_first_unit_past_the_title", + "the layer named with first_unit 100 and presented at unit 101, far past its base's four units at 0 to 3", + vec![base.clone(), span_layer.clone()], + vec![hyper(0), refine(&span_layer, 100)], + and(base_ps(0), &[pres(101, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + ), + vector( + "session_layer_first_unit_shifted_with_its_base_accept", + "the base and its layer both at first_unit 2: units 2 to 5, and the layer's span, unit 1 of the base, is unit 3", + vec![base.clone(), span_layer.clone()], + vec![hyper(2), refine(&span_layer, 2)], + and(base_ps(2), &[pres(3, 2, 1)]), + None, + ), + // A base's units, read in its payload's own format. + { + let fb = base_with_fallback(); + let av1 = entry_decoder("wai.video.av1", SessionPath::Primary, false, None, object_content_hash(&fb), 0, 0); + vector( + "session_unit_fallback_accept", + "a four-frame wai.video.int_hyper clip whose manifest names wai.video.av1 as its fallback, decoded through the fallback: units 0 to 3", + vec![fb.clone()], + vec![av1], + base_ps(0), + None, + ) + }, + { + let fb = base_with_fallback(); + let av1 = entry_decoder("wai.video.av1", SessionPath::Primary, false, None, object_content_hash(&fb), 0, 0); + vector( + "session_unit_fallback_past_the_title", + "the same clip decoded through its fallback, and unit 9 presented through it: the fallback decodes the same four-frame payload", + vec![fb.clone()], + vec![av1], + and(base_ps(0), &[pres(9, 1, 0)]), + Some(Reason::SessionUnitOutsideObject), + ) + }, + ]; + // A held layer a sink cannot apply. + for (name, about, refines, units) in [ + ("session_refines_layer_zero", "a held layer whose refines states layer 0, presented at nine layers", Some(refines(0, None)), 4), + ("session_refines_span_past_base", "a held layer whose span runs from unit 2 for 50 units, over a held base of four, and unit 40 presented through it", Some(refines(1, Some((2, 50)))), 1), + ("session_refines_span_empty", "a held layer whose span has count 0", Some(refines(1, Some((0, 0)))), 1), + ("session_refines_absent", "a held layer of wai.video.int_refine, a refinement-only capability, with no refines", None, 4), + ] { + let layer = layer_with(refines, units); + let at = if name == "session_refines_layer_zero" { pres(1, 9, 1) } else if name == "session_refines_span_past_base" { pres(40, 2, 1) } else { pres(1, 2, 1) }; + v.push(vector(name, about, vec![base.clone(), layer.clone()], vec![hyper(0), refine(&layer, 0)], and(base_ps(0), &[at]), Some(Reason::SessionRefinesMalformed))); + } + { + // A layer whose base is a layer. + let on_layer = layer_with(Some(json!({ "base": hex(&object_content_hash(&span_layer)), "prev": hex(&object_content_hash(&span_layer)), "layer": 1 })), 1); + v.push(vector( + "session_refines_base_is_a_layer", + "a held layer whose refines names as its base another held layer, not a base", + vec![base.clone(), span_layer.clone(), on_layer.clone()], + vec![hyper(0), refine(&span_layer, 0), refine(&on_layer, 0)], + and(base_ps(0), &[pres(1, 2, 1), pres(1, 3, 2)]), + Some(Reason::SessionRefinesMalformed), + )); + } + // WAI2 refinement components. + let b = |first: u64| -> Vec { vec![pres(first, 1, 0)] }; + let wai2_decoders = |e: &[u8], fu: u64| { + vec![ + entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, Some(0), object_content_hash(e), 0, 0), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, Some(1), object_content_hash(e), fu, 0), + ] + }; + let rc = |base: &str, layer: u64, span: Option<(u64, u64)>| { + let mut r = json!({ "base": base, "prev": base, "layer": layer }); + if let Some((from, count)) = span { + r["span"] = json!({ "from": from, "count": count }); + } + r + }; + let w = wai2_layered("b", rc("b", 1, None)); + v.push(vector( + "session_wai2_layer_accept", + "a WAI2 envelope of a one-frame base component and a refinement component over it: unit 0 at one layer through the base, at two through the refinement", + vec![w.clone()], + wai2_decoders(&w, 0), + and(b(0), &[pres(0, 2, 1)]), + None, + )); + v.push(vector( + "session_wai2_layer_count_past", + "unit 0 at three layers through the refinement component, which refines at layer 1, so two", + vec![w.clone()], + wai2_decoders(&w, 0), + and(b(0), &[pres(0, 3, 1)]), + Some(Reason::SessionLayersMismatch), + )); + v.push(vector( + "session_wai2_layer_unit_past", + "unit 1 at two layers through the refinement component, whose base component is one frame, unit 0", + vec![w.clone()], + wai2_decoders(&w, 0), + and(b(0), &[pres(1, 2, 1)]), + Some(Reason::SessionUnitOutsideObject), + )); + v.push(vector( + "session_wai2_layer_first_unit_not_its_base", + "the refinement component's entry states first_unit 5 while its base component's states 0, and unit 5 is presented through it", + vec![w.clone()], + wai2_decoders(&w, 5), + and(b(0), &[pres(5, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + )); + let ws = wai2_layered("b", rc("b", 1, Some((0, 1)))); + v.push(vector( + "session_wai2_layer_span_accept", + "a refinement component with a span of unit 0 of its one-frame base", + vec![ws.clone()], + wai2_decoders(&ws, 0), + and(b(0), &[pres(0, 2, 1)]), + None, + )); + for (name, about, e) in [ + ("session_wai2_refines_base_missing", "a refinement component whose refines names a component the envelope does not hold", wai2_layered("b", rc("c", 1, None))), + ("session_wai2_refines_id_malformed", "a refinement component whose refines names its base by an id that is not a component id (an uppercase letter)", wai2_layered("B", rc("B", 1, None))), + ("session_wai2_refines_span_past_base", "a refinement component whose span runs past its one-frame base", wai2_layered("b", rc("b", 1, Some((0, 2))))), + ] { + v.push(vector(name, about, vec![e.clone()], wai2_decoders(&e, 0), and(b(0), &[pres(0, 2, 1)]), Some(Reason::SessionRefinesMalformed))); + } + v +} + /// A session of `units` units, each presented once, with `missed` presentations missed /// and `written` of them written, and `switches` switches with `switched` written. fn capped(missed: u64, written: u64, switches: u64, switched: u64, units: u64) -> SessionClaim { diff --git a/wai/wai-rs/src/claim_receipt/session.rs b/wai/wai-rs/src/claim_receipt/session.rs index b6c57cbac..4191d68fa 100644 --- a/wai/wai-rs/src/claim_receipt/session.rs +++ b/wai/wai-rs/src/claim_receipt/session.rs @@ -780,6 +780,31 @@ pub fn payload_units(capability: &str, payload: &[u8]) -> Option { one.then_some(1) } +/// The units a `WAI1` base's payload holds (§2.4.12, step 6 against the envelopes), read in +/// the payload's own format: the format pinned for the manifest's capability, or, where it +/// pins none, for its fallback, which decodes the same payload (SPEC §4 step 5). `None` +/// where neither pins a format, or the payload does not parse as it. +pub fn base_units(capability: &str, fallback: Option<&str>, payload: &[u8]) -> Option { + if crate::codecs::pinned_int_payload(capability).is_some() { + return payload_units(capability, payload); + } + payload_units(fallback?, payload) +} + +/// A well-formed `refines` with the units of its base where they are read (`n`): the +/// layer, or, where its span lies outside those units or its runs do not sum to the units +/// it covers, a layer a sink cannot apply (staged-delivery §3, §4.1 step 2). +fn layer_of_refines(r: &crate::container::Refines, n: Option) -> Result<(u64, Option<(u64, u64)>), ()> { + if let Some(n) = n { + r.check_units(u32::try_from(n).map_err(|_| ())?).map_err(|_| ())?; + } + let span = match r.span { + Some(sp) => Some((u64::from(sp.from), u64::from(sp.count))), + None => n.map(|n| (0, n)), + }; + Ok((u64::from(r.layer) + 1, span)) +} + impl ClaimReceipt { fn session(&self) -> Result<&SessionClaim, Rejection> { match &self.body { @@ -929,16 +954,26 @@ impl ClaimReceipt { /// a `WAI2` envelope and that rendition's capability, or no rendition and a `WAI1` /// envelope's capability or fallback — and each entry naming a rendition has its object /// among the readable envelopes (`session_source_mismatch`); - /// 5. with the presentations, each one through an entry whose envelope is held is at the - /// layer count that envelope gives: 1 for a base, or a rendition with no `refines`, and - /// `refines.layer + 1` for a layer (`session_layers_mismatch`); - /// 6. with the presentations, each one through an entry whose envelope is held is of a + /// 5. each decoder entry whose object is a held layer names one a sink can apply as its + /// `refines` states (staged-delivery §3, §4.1 steps 1–2): a `refines` that reads as §3 + /// defines it, present wherever the capability is refinement-only; a `WAI2` + /// component's `base` the id of a component of the same envelope; a base, where held, + /// that carries no `refines` and is not of a refinement-only capability; and, where + /// the base's units are read, a span within them and runs that sum to the units the + /// layer covers (`session_refines_malformed`); + /// 6. each decoder entry whose object is a held layer whose base a decoder entry names + /// has the `first_unit` of one of those entries (`session_first_unit_mismatch`); + /// 7. with the presentations, each one through an entry whose envelope is held is at the + /// layer count that envelope gives: 1 for a base, or a rendition with no `refines`, + /// and `refines.layer + 1` for a layer (`session_layers_mismatch`); + /// 8. with the presentations, each one through an entry whose envelope is held is of a /// unit that envelope covers: from the entry's `first_unit` plus `a`, `n` units, where - /// for a base or a rendition `a` is 0 and `n` the units its payload holds, and for a - /// layer `a` and `n` are its `span`, or 0 and its base's units with no span; a payload - /// whose units WAI does not read, or a base not held, leaves the presentation unchecked + /// for a base or a rendition `a` is 0 and `n` the units its payload holds, read in the + /// payload's own format ([`base_units`]), and for a layer `a` and `n` are its `span`, + /// or 0 and its base's units with no span; a payload whose units WAI does not read, + /// or a base not held, leaves the presentation unchecked /// (`session_unit_outside_object`); - /// 7. the lengths of the readable `WAI2` envelopes' classical renditions + /// 9. the lengths of the readable `WAI2` envelopes' classical renditions /// ([`classical_rendition`]) whose capability no decoder entry decoded sum to /// `classical_declared`, which is `null` exactly when there is none /// (`session_classical_mismatch`). @@ -999,72 +1034,111 @@ impl ClaimReceipt { return Err(Rejection::at(6, Reason::SessionSourceMismatch)); } } - // What an entry's envelope gives a presentation through it: its layer count, and - // the units it covers relative to the entry's `first_unit` — `None` where WAI does - // not read them. - let units_of = |capability: &str, payload: &[u8]| -> Option { payload_units(capability, payload) }; - let gives = |d: &DecoderEntry| -> Option<(Option, Option<(u64, u64)>)> { + // What an entry's held envelope is: a base, with the units its payload holds where + // WAI reads them, or a layer — its count, the units it covers relative to the + // entry's first unit where they are read, and the base it refines (the base's + // content hash and, in a `WAI2` envelope, its rendition) — or a layer a sink + // cannot apply. + enum Gives { + Base(Option), + Layer { layers: u64, span: Option<(u64, u64)>, base: ([u8; 32], Option) }, + Malformed, + } + // A `WAI1` layer's base is matched by its content hash, a `WAI2` one's by its + // envelope and rendition. + let layer_of = |r: &Refines, n: Option, base: ([u8; 32], Option)| -> Gives { + match layer_of_refines(r, n) { + Ok((layers, span)) => Gives::Layer { layers, span, base }, + Err(()) => Gives::Malformed, + } + }; + let gives = |d: &DecoderEntry| -> Option { + let refinement_only = crate::codecs::is_refinement_only; match held(&d.object)? { Read::One(w) => match w.refines() { - None => Some((Some(1), units_of(&d.capability, &w.payload).map(|n| (0, n)))), + None if refinement_only(w.capability()) => Some(Gives::Malformed), + None => Some(Gives::Base(base_units(w.capability(), w.fallback(), &w.payload))), + Some(Err(_)) => Some(Gives::Malformed), Some(Ok(r)) => { - let span = match r.span { - Some(sp) => Some((u64::from(sp.from), u64::from(sp.count))), - None => unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok()).and_then(|b| match held(&b) { - Some(Read::One(base)) if base.refines().is_none() => units_of(base.capability(), &base.payload).map(|n| (0, n)), - _ => None, - }), + let Some(base) = unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok()) else { return Some(Gives::Malformed) }; + // The base, where held: a base, its units read where WAI reads them. + let n = match held(&base) { + Some(Read::One(b)) => { + if b.manifest.refines.is_some() || refinement_only(b.capability()) { + return Some(Gives::Malformed); + } + base_units(b.capability(), b.fallback(), &b.payload) + } + _ => None, }; - Some((Some(u64::from(r.layer) + 1), span)) + Some(layer_of(&r, n, (base, None))) } - Some(Err(_)) => Some((None, None)), }, Read::Multi(w) => { let i = usize::try_from(d.rendition?).ok()?; let m = w.manifest.renditions.get(i)?; - match m.refines.as_ref().map(|v| Refines::from_value(v, RefForm::ComponentId)) { - None => Some((Some(1), units_of(&m.capability, &w.renditions[i]).map(|n| (0, n)))), - Some(Ok(r)) => { - let span = match r.span { - Some(sp) => Some((u64::from(sp.from), u64::from(sp.count))), - None => w - .manifest - .renditions - .iter() - .position(|e| e.id.as_deref() == Some(r.base.as_str())) - .and_then(|b| units_of(&w.manifest.renditions[b].capability, &w.renditions[b])) - .map(|n| (0, n)), + match m.refines.as_ref() { + None if refinement_only(&m.capability) => Some(Gives::Malformed), + None => Some(Gives::Base(payload_units(&m.capability, &w.renditions[i]))), + Some(v) => { + let Ok(r) = Refines::from_value(v, RefForm::ComponentId) else { return Some(Gives::Malformed) }; + let Some(j) = w.manifest.renditions.iter().position(|e| e.id.as_deref() == Some(r.base.as_str())) else { + return Some(Gives::Malformed); }; - Some((Some(u64::from(r.layer) + 1), span)) + let b = &w.manifest.renditions[j]; + if b.refines.is_some() || refinement_only(&b.capability) { + return Some(Gives::Malformed); + } + let n = payload_units(&b.capability, &w.renditions[j]); + Some(layer_of(&r, n, (d.object, Some(j as u64)))) } - Some(Err(_)) => Some((None, None)), } } } }; - if let Some(ps) = outputs { - // 5. Each presentation through a held entry is at the layers its envelope gives. - for p in ps { - let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; - if let Some((Some(layers), _)) = gives(d) - && u64::from(p.layers) != layers - { - return Err(Rejection::at(6, Reason::SessionLayersMismatch)); - } - } - // 6. ... and of a unit it covers. - for p in ps { - let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; - if let Some((_, Some((a, n)))) = gives(d) { - let from = u128::from(d.first_unit) + u128::from(a); - let unit = u128::from(p.unit); - if unit < from || unit >= from + u128::from(n) { - return Err(Rejection::at(6, Reason::SessionUnitOutsideObject)); - } + // 5. A held layer an entry names is one a sink can apply. + if s.decoders.iter().any(|d| matches!(gives(d), Some(Gives::Malformed))) { + return Err(Rejection::at(6, Reason::SessionRefinesMalformed)); + } + // 6. A held layer's entry has the first unit of an entry naming its base. + for d in &s.decoders { + if let Some(Gives::Layer { base: (object, rendition), .. }) = gives(d) { + let bases: Vec = + s.decoders.iter().filter(|e| e.object == object && (rendition.is_none() || e.rendition == rendition)).map(|e| e.first_unit).collect(); + if !bases.is_empty() && !bases.contains(&d.first_unit) { + return Err(Rejection::at(6, Reason::SessionFirstUnitMismatch)); } } } - // 7. The classical length, over the readable WAI2 envelopes. + if let Some(ps) = outputs { + // 7. Each presentation through a held entry is at the layers its envelope gives. + for p in ps { + let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; + let layers = match gives(d) { + Some(Gives::Base(_)) => 1, + Some(Gives::Layer { layers, .. }) => layers, + _ => continue, + }; + if u64::from(p.layers) != layers { + return Err(Rejection::at(6, Reason::SessionLayersMismatch)); + } + } + // 8. ... and of a unit it covers. + for p in ps { + let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; + let covers = match gives(d) { + Some(Gives::Base(Some(n))) => (0, n), + Some(Gives::Layer { span: Some(span), .. }) => span, + _ => continue, + }; + let from = u128::from(d.first_unit) + u128::from(covers.0); + let unit = u128::from(p.unit); + if unit < from || unit >= from + u128::from(covers.1) { + return Err(Rejection::at(6, Reason::SessionUnitOutsideObject)); + } + } + } + // 9. The classical length, over the readable WAI2 envelopes. let mut sum: Option = None; for (_, r) in &read { let Read::Multi(w) = r else { continue }; @@ -1087,7 +1161,10 @@ impl ClaimReceipt { /// title each have their own. In order: for each claim, it passes §3.1 steps 1–4 /// (`context_invalid`); it is a `stage` claim, signed by this claim's key, named by an /// entry of `stage_sets` (`context_mismatch`); with the objects, its base and every - /// layer object that arrived are among them (`session_stage_disagrees`). Then, with the + /// layer object that arrived are among them (`session_stage_disagrees`). Each decoder + /// entry whose object is a claim's base, or a layer object a claim lists, has a + /// `first_unit` at which `stage_sets` names a claim of that object + /// (`session_first_unit_mismatch`). Then, with the /// presentations (`session_stage_disagrees`): for each claim and each entry naming it, /// every unit of its set is presented, and for each stage `s` from 1 up the units of /// the set presented at more than `s` layers are no fewer than it counts at `s` or @@ -1121,6 +1198,18 @@ impl ClaimReceipt { } claims.push((c, named)); } + // Each entry naming a claim's base, or a layer object it lists, has a first unit at + // which `stage_sets` names a claim listing that object. + let mut at: std::collections::BTreeMap<[u8; 32], Vec> = std::collections::BTreeMap::new(); + for (c, named) in &claims { + let ClaimBody::Stage(st) = &c.body else { continue }; + for h in std::iter::once(c.subject).chain(st.objects.iter().map(|o| o.object)) { + at.entry(h).or_default().extend(named.iter().copied()); + } + } + if s.decoders.iter().any(|d| at.get(&d.object).is_some_and(|fs| !fs.contains(&d.first_unit))) { + return Err(Rejection::at(6, Reason::SessionFirstUnitMismatch)); + } let Some(ps) = outputs else { return Ok(()) }; let finals = SessionClaim::finals(ps); // (set-local unit, largest layers) of every unit presented in [f, f + n). -- 2.54.0 (Apple Git-157) From 95325d492d76384f72b7dfd8e20c99327fee416f Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 22:34:55 -0400 Subject: [PATCH 05/21] wai: the session accounts for every byte; decoderFor requires first_unit SessionRecorder::received_envelope records any bytes received whole: bytes that are not an envelope are an inert object, its content hash and path, counted null, not presented, held, so the claim's transferred is every byte the sink received and a verifier holding them accepts it while no entry names them. RecorderError::NotAnEnvelope is gone. The binding's received never refuses such bytes, and decoderFor requires the decoder's first_unit (no default of 0). verify_measure_wasm.mjs checks both, and that the session's transferred is the sum over every object. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 27 +++++++-- wai/wai-rs/src/session_recorder.rs | 70 +++++++++++------------- wai/wai-rs/src/stage_measure/session.rs | 2 +- wai/wai-rs/src/staged/claim_tests.rs | 2 +- wai/wai-web/demo/verify_measure_wasm.mjs | 32 ++++++----- wai/wai-web/src/measure.rs | 42 +++++++------- 6 files changed, 97 insertions(+), 78 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index d8e0467d4..c95c86791 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -41,9 +41,11 @@ wire format may change and such changes are recorded here. `received_unheld`, by its content hash; the recorder no longer takes an object's figures as told. The native tool's session over a title and the browser's `SessionHandle` both hold their envelopes; `decoderFor` refuses a capability that is neither the envelope's - nor its fallback, `received` takes the bytes alone and refuses at once bytes that are - not a `WAI1` or `WAI2` envelope, `verifyClaim` takes the envelopes, and integers from JS - are refused unless whole and in range. + nor its fallback and requires the decoder's `first_unit`, `received` takes the bytes + alone — bytes that are not an envelope included, recorded as an inert object neither + counted nor presented, so the session accounts for every byte transferred — + `verifyClaim` takes the envelopes, and integers from JS are refused unless whole and in + range. - **An object is listed once, as its envelope gives it** (§2.4.12, the objects). No (content hash, path) is listed twice (`session_object_duplicate`): a sink that fetches an object again lists it once, its transferred bytes every byte of every fetch, as the @@ -54,7 +56,9 @@ wire format may change and such changes are recorded here. - **Inert envelopes are received, not refused.** An encrypted envelope, or bytes of neither magic, is refused as unreadable only where a decoder entry names it (`session_envelope_unreadable`); one no entry names is a received object, uncounted and - not presented. A page that receives such bytes seals its session. + not presented, and a held one listed with counted bytes, even 0, is refused + (`session_counted_mismatch`). A page that receives such bytes lists them and seals its + session. - **The layers and units an envelope gives.** A decoder entry states `first_unit`, the unit at which its object's first unit is presented. With the outputs and the envelopes, each presentation through an entry whose envelope is held is at the layer @@ -62,9 +66,20 @@ wire format may change and such changes are recorded here. `refines.layer + 1` for a layer (`session_layers_mismatch`) — and of a unit it covers: from `first_unit` plus the span's start, the span's count of units, or the base's units where a layer has no span or the object is a base (`session_unit_outside_object`). A - re-decode decodes unit `unit − first_unit` of the entry's object. `claim_verify.py` reads + re-decode decodes unit `unit − first_unit` of the entry's object. A base's units are read + in its payload's own format — its manifest capability's, or its fallback's where the + capability pins none — whichever capability the entry names. `claim_verify.py` reads the units from the integer payloads as `wai-rs` does, and `differential.py` adds random - sessions holding a base's and its layers' envelopes. + sessions holding a base's and its layers' envelopes, as `WAI1` envelopes and as `WAI2` + components. +- **A layer is one a sink can apply, at its base's first unit** (§2.4.12). An entry naming + a held layer whose `refines` is malformed, absent on a refinement-only capability, + names a base that is a layer or no rendition of its `WAI2` envelope, or whose span + lies outside a held base's units is refused (`session_refines_malformed`): a sink + refuses such a layer, so nothing can be presented through it. A held layer's entry + states the `first_unit` of an entry naming its base, and an entry naming a `stage` + claim's base or a layer it lists states the unit `stage_sets` names that claim at + (`session_first_unit_mismatch`). - **The browser claim is a release build.** `verify_measure_wasm.mjs` requires the wasm32 claim's `host.build.profile` to be `release` and its target `wasm32-unknown-unknown`. - **The build profile is the optimisation level.** `release` is a build at `opt-level` diff --git a/wai/wai-rs/src/session_recorder.rs b/wai/wai-rs/src/session_recorder.rs index 8d26292c2..9bd932f11 100644 --- a/wai/wai-rs/src/session_recorder.rs +++ b/wai/wai-rs/src/session_recorder.rs @@ -13,14 +13,15 @@ //! holding what it recorded refuses. //! //! A sink tells the recorder what it received, and never an object's figures: the bytes -//! of an object it received whole ([`SessionRecorder::received_envelope`]), from which the -//! recorder derives its content hash and counted and transferred bytes, and holds it, so -//! `finish` checks the claim against it as a verifier holding the envelopes does (§2.4.12 -//! step 6, the `envelopes` context); or the content hash and the bytes of an object it did -//! not hold whole ([`SessionRecorder::received_unheld`]), which is not countable. Whether -//! any of an object's outputs was presented is derived from the presentations, and an -//! object received more than once on a path is one object, its `transferred` every byte -//! received for it. +//! of an object it received whole ([`SessionRecorder::received_envelope`]) — an envelope, +//! an encrypted one, or bytes that are not one — from which the recorder derives its +//! content hash and counted and transferred bytes, and holds it, so `finish` checks the +//! claim against it as a verifier holding the envelopes does (§2.4.12 step 6, the +//! `envelopes` context); or the content hash and the bytes of an object it did not hold +//! whole ([`SessionRecorder::received_unheld`]), which is not countable. The session +//! accounts for every byte transferred. Whether an object was presented is derived from +//! the decoder entries, and an object received more than once on a path is one object, +//! its `transferred` every byte received for it. use crate::claim_receipt::{ session::SESSION_CLASSICAL_SOURCES, ClaimBody, ClaimClass, ClaimReceipt, DecoderEntry, Missed, ObjectSeen, @@ -71,8 +72,6 @@ pub enum RecorderError { /// A claim named as a stage set's that is not a `stage` claim, does not verify (§3.1 /// steps 1–4), or is another key's than the stage claims named before it. NotAStageClaim, - /// Bytes received as an object that are not a `WAI1` or `WAI2` envelope. - NotAnEnvelope, } impl std::fmt::Display for RecorderError { @@ -84,7 +83,6 @@ impl std::fmt::Display for RecorderError { Self::NotLate => f.write_str("a presentation late with no deadline, or late by nothing"), Self::Switch => f.write_str("a switch to the same path, or for an unlisted reason"), Self::NotAStageClaim => f.write_str("not a verified stage claim of this key"), - Self::NotAnEnvelope => f.write_str("the bytes received are not a WAI1 or WAI2 envelope"), } } } @@ -166,30 +164,23 @@ impl SessionRecorder { } } - /// An object received whole on `path`, as its bytes: a `WAI1` or `WAI2` envelope, an - /// encrypted one included (inert at a sink that cannot open it, SPEC §6.4); any other - /// bytes are refused ([`RecorderError::NotAnEnvelope`]) and nothing is recorded. The - /// recorder derives its content hash, its counted bytes (staged-measurement §3; none - /// where it is not countable) and its length, and at the tally whether any of its - /// outputs was presented. It holds the envelope, and [`SessionRecorder::finish`] checks - /// the claim against every envelope it holds. Received again on the same path, it is the - /// same object, its `transferred` the bytes of both receipts. - pub fn received_envelope(&mut self, envelope: &[u8], path: SessionPath) -> Result<(), RecorderError> { - let readable = match envelope.get(..4) { - Some(b"WAI1") => crate::container::Wai::from_bytes(envelope).is_ok(), - Some(b"WAI2") => crate::container::WaiMulti::from_bytes(envelope).is_ok(), - _ => false, - }; - if !readable { - return Err(RecorderError::NotAnEnvelope); - } + /// An object received whole on `path`, as its bytes: a `WAI1` or `WAI2` envelope, or + /// bytes that are inert at this sink — an encrypted envelope it cannot open (SPEC §6.4), + /// or bytes that are not an envelope at all. Every one is recorded, so the session + /// accounts for every byte transferred. The recorder derives its content hash, its + /// counted bytes (staged-measurement §3; none where it is not countable, as inert bytes + /// never are) and its length, and at the tally whether a decoder entry names it. It + /// holds the bytes, and [`SessionRecorder::finish`] checks the claim against every + /// envelope it holds, where inert bytes no entry names are an object received, neither + /// counted nor presented. Received again on the same path, it is the same object, its + /// `transferred` the bytes of both receipts. + pub fn received_envelope(&mut self, envelope: &[u8], path: SessionPath) { let content_hash = crate::jwp_hash::content_hash(envelope); if !self.held.iter().any(|h| crate::jwp_hash::content_hash(h) == content_hash) { self.held.push(envelope.to_vec()); } let counted = crate::measure_framing::count_object(envelope).ok().map(|c| c.total); self.add_object(content_hash, path, counted, envelope.len() as u64); - Ok(()) } /// An object received on `path` that the sink did not hold whole — as byte ranges, or @@ -603,26 +594,31 @@ mod tests { if let Some((u, layers, entry)) = extra { r.presented(u, layers, [b, l][entry], d(u, layers), None).unwrap(); } - for e in [&base, &l1, &l2, &l2, &encrypted] { - r.received_envelope(e, SessionPath::Primary).unwrap(); + for e in [base.as_slice(), &l1, &l2, &l2, &encrypted, &base[..7], b"not an envelope at all"] { + r.received_envelope(e, SessionPath::Primary); } - assert_eq!(r.received_envelope(&base[..7], SessionPath::Primary), Err(RecorderError::NotAnEnvelope)); - assert_eq!(r.received_envelope(b"not an envelope at all", SessionPath::Primary), Err(RecorderError::NotAnEnvelope)); r }; let s = record("wai.neural.int_hyper", None).finish(hash(&base), &k, "did:example:sink", 0, None, T).unwrap(); - assert_eq!(s.objects.iter().map(|o| o.presented).collect::>(), [true, true, false, false], "presented derived from the outputs"); + assert_eq!(s.objects.iter().map(|o| o.presented).collect::>(), [true, true, false, false, false, false], "presented: named by an entry"); let want: Vec<(Option, u64)> = vec![ (Some(base.len() as u64), base.len() as u64), (Some(l1.len() as u64), l1.len() as u64), (Some(l2.len() as u64), 2 * l2.len() as u64), (None, encrypted.len() as u64), + (None, 7), + (None, 22), ]; - assert_eq!(s.objects.iter().map(|o| (o.counted, o.transferred)).collect::>(), want, "received twice: one object; encrypted: uncounted"); + assert_eq!( + s.objects.iter().map(|o| (o.counted, o.transferred)).collect::>(), + want, + "received twice: one object; encrypted, and bytes that are not an envelope: uncounted, every byte transferred" + ); let ClaimBody::ReconstructSession(body) = &s.claim.body else { panic!("a session") }; - assert_eq!((body.counted_discarded, body.uncounted), (l2.len() as u64, 1), "received and never presented"); + assert_eq!((body.counted_discarded, body.uncounted), (l2.len() as u64, 3), "received and never presented"); + assert_eq!(body.transferred, (base.len() + l1.len() + 2 * l2.len() + encrypted.len() + 7 + 22) as u64, "every byte transferred"); let refs: Vec<&[u8]> = s.envelopes.iter().map(Vec::as_slice).collect(); - assert_eq!(refs.len(), 4, "each envelope held once"); + assert_eq!(refs.len(), 6, "each object held once"); s.claim.check_session_envelopes(&refs, Some(&s.objects), Some(&s.presentations)).unwrap(); let refused = |r: SessionRecorder| r.finish(hash(&base), &k, "did:example:sink", 0, None, T).map(|_| ()).map_err(|e| (e.step, e.reason)); assert_eq!(refused(record("wai.audio.int_codec", None)), Err((6, Reason::SessionSourceMismatch))); diff --git a/wai/wai-rs/src/stage_measure/session.rs b/wai/wai-rs/src/stage_measure/session.rs index 32c513b06..174ccb3f3 100644 --- a/wai/wai-rs/src/stage_measure/session.rs +++ b/wai/wai-rs/src/stage_measure/session.rs @@ -89,7 +89,7 @@ pub fn recorder_of(t: &Title, e: &Evaluation, host: SessionHost, session_nonce: for o in &e.objects { let held = t.bases.iter().map(|b| &b.obj).chain(&t.layers).find(|x| x.path == o.path); let bytes = held.ok_or_else(|| invalid(format!("{}: {} is not one of the title's objects", t.dir, o.path)))?; - r.received_envelope(&bytes.bytes, SessionPath::Primary).map_err(|x| invalid(format!("{}: {x}", o.path)))?; + r.received_envelope(&bytes.bytes, SessionPath::Primary); } Ok((r, first.0.info.content_hash)) } diff --git a/wai/wai-rs/src/staged/claim_tests.rs b/wai/wai-rs/src/staged/claim_tests.rs index ca19acd52..88ec6a810 100644 --- a/wai/wai-rs/src/staged/claim_tests.rs +++ b/wai/wai-rs/src/staged/claim_tests.rs @@ -782,7 +782,7 @@ fn the_forget_vectors_are_what_the_sink_states() { rec.presented(u64::from(u), 2, ld, [2; 32], None).unwrap(); } for e in [&e0, &l0] { - rec.received_envelope(e, SessionPath::Primary).unwrap(); + rec.received_envelope(e, SessionPath::Primary); } for c in named { rec.stage_set(0, c).unwrap(); diff --git a/wai/wai-web/demo/verify_measure_wasm.mjs b/wai/wai-web/demo/verify_measure_wasm.mjs index e06647df4..4a3f55d48 100644 --- a/wai/wai-web/demo/verify_measure_wasm.mjs +++ b/wai/wai-web/demo/verify_measure_wasm.mjs @@ -27,8 +27,10 @@ // (session_output_mismatch), with an object left out (session_source_not_received) and // with an object miscounted (session_counted_mismatch); // - the recorder's own checks: decoderFor refuses a capability the envelope neither -// carries nor falls back to; an object received and never presented is recorded as -// not presented, whatever the page would say; and integers from JS (a unit, a layer +// carries nor falls back to, and a decoder whose first unit the page does not state; an +// object received and never presented is recorded as not presented, whatever the page +// would say; bytes that are not an envelope, and an encrypted envelope, are recorded as +// objects neither counted nor presented, every byte transferred; and integers from JS (a unit, a layer // count, a decoder handle, a picture's width and height) that are not whole numbers in // range are refused, never truncated or wrapped. // @@ -265,6 +267,8 @@ for (const [name, { files, t, golden }] of titles) { // A decoder through a capability the envelope neither carries nor falls back to. check(/neither the envelope's capability/.test(refusedBy(() => h.decoderFor(env(base), 'wai.audio.int_codec', true, 0)) ?? ''), 'decoderFor refuses a capability its envelope neither carries nor falls back to'); + check((refusedBy(() => h.decoderFor(env(base), undefined, true, undefined)) ?? '').startsWith('first_unit: a whole number'), + 'decoderFor refuses a decoder whose first unit the page does not state'); const p0 = golden.presentations.find((x) => x.layers === 1); // Integers from JS: whole numbers in range, never truncated or wrapped. Each case on a // fresh handle, refused for its own field and not for anything an earlier case left. @@ -305,25 +309,27 @@ for (const [name, { files, t, golden }] of titles) { h.presented(p.unit, p.layers, handles.get(key), p.out_sha256, undefined); } for (const o of golden.objects) h.received(env(o)); - // A repeat is one object with the bytes of both; bytes that are not an envelope are - // refused at once; an encrypted envelope no entry names is held, uncounted. + // A repeat is one object with the bytes of both; bytes that are not an envelope, and an + // encrypted envelope, no entry names are held, uncounted and not presented, so the + // session accounts for every byte transferred. h.received(env(golden.objects[0])); - for (const [what, bytes] of [['seven bytes of the base', env(base).subarray(0, 7)], ['a broken magic', Uint8Array.from([0x57, 0x41, 0x49, 0x33, 0, 0, 0, 0])]]) { - check(/not a WAI1 or WAI2 envelope/.test(refusedBy(() => h.received(bytes)) ?? ''), `received refuses ${what} at once`); - } - const encrypted = new Uint8Array(readFileSync(join(corpus, 'counting/encrypted.wai'))); - h.received(encrypted); + const inert = [['seven bytes of the base', env(base).subarray(0, 7)], ['a broken magic', Uint8Array.from([0x57, 0x41, 0x49, 0x33, 0, 0, 0, 0])], + ['an encrypted envelope', new Uint8Array(readFileSync(join(corpus, 'counting/encrypted.wai')))]]; + for (const [what, bytes] of inert) check(refusedBy(() => h.received(bytes)) === null, `received records ${what}`); const r = h.finish(SEED, undefined, T); - const seenEnc = r.objects.find((o) => o.content_hash === wai.stageContentHash(encrypted)); - check(seenEnc && seenEnc.counted === null && seenEnc.presented === false, 'an encrypted envelope received is listed uncounted and not presented'); + for (const [what, bytes] of inert) { + const o = r.objects.find((x) => x.content_hash === wai.stageContentHash(bytes)); + check(o && o.counted === null && o.presented === false && o.transferred === bytes.length, `${what}: listed uncounted and not presented, every byte transferred`); + } + check(JSON.parse(r.claim).body.transferred === r.objects.reduce((a, o) => a + o.transferred, 0), 'the session transferred every byte of every object received'); check(r.objects.find((o) => o.content_hash === base.object)?.transferred === 2 * env(base).length, 'the base received twice: one object, transferred twice its length'); vectors.push({ name: 'recorder/inert-and-repeat', procedure: 'claim', receipt: r.claim, - context: { outputs: r.outputs, objects: r.objects, envelopes: [...golden.objects.map(env), encrypted].map((e) => ({ envelope: Buffer.from(e).toString('hex') })) } }); + context: { outputs: r.outputs, objects: r.objects, envelopes: [...golden.objects.map(env), ...inert.map(([, b]) => b)].map((e) => ({ envelope: Buffer.from(e).toString('hex') })) } }); expected.push(`recorder/inert-and-repeat\taccept link_hash=${r.link_hash}`); const seen = r.objects.find((o) => o.content_hash === last.object); check(seen && seen.presented === false && JSON.parse(r.claim).body.counted_discarded === last.counted.total, 'an object received and never presented is recorded as not presented, and counted as discarded'); - check(wai.verifyClaim(r.claim, JSON.stringify(r.outputs), JSON.stringify(r.objects), [...golden.objects.map(env), encrypted]) === '', + check(wai.verifyClaim(r.claim, JSON.stringify(r.outputs), JSON.stringify(r.objects), [...golden.objects.map(env), ...inert.map(([, b]) => b)]) === '', 'that session verifies against the envelopes received'); } diff --git a/wai/wai-web/src/measure.rs b/wai/wai-web/src/measure.rs index cae1146ba..5a4b66075 100644 --- a/wai/wai-web/src/measure.rs +++ b/wai/wai-web/src/measure.rs @@ -466,26 +466,27 @@ impl SessionHandle { /// The handle of the decoder that decoded `envelope` here, through `via` (its /// manifest's capability where absent; otherwise that capability or its fallback, and /// any other is refused); `pinned` when the decode verified the parameter set the - /// manifest pins; `first_unit` the title's unit that is unit 0 of the object's base (of - /// the object for a base, of the base it refines for a layer), 0 where absent. The - /// recorder holds the envelopes, so a `first_unit` that puts a presentation outside the - /// units its envelope covers is refused when the session is sealed. The same decoder on - /// the same object gives the same handle. + /// manifest pins; `first_unit`, which the page states, the title's unit that is unit 0 + /// of the object's base (of the object for a base, of the base it refines for a layer). + /// The recorder holds the envelopes, so a `first_unit` that is not a layer's base's, or + /// that puts a presentation outside the units its envelope covers, is refused when the + /// session is sealed. The same decoder on the same object gives the same handle. #[wasm_bindgen(js_name = decoderFor)] - pub fn decoder_for(&mut self, envelope: &[u8], via: Option, pinned: bool, first_unit: Option) -> Result { - let first_unit = first_unit.map(|f| int(f, "first_unit")).transpose()?.unwrap_or(0); + pub fn decoder_for(&mut self, envelope: &[u8], via: Option, pinned: bool, first_unit: f64) -> Result { + let first_unit = int(first_unit, "first_unit")?; let k = decoder_key(envelope, via.as_deref(), pinned, first_unit).map_err(js_err)?; Ok(self.rec()?.decoder(k) as u32) } /// An object received whole on the primary path, as its bytes — every object the page - /// received, presented or not, and one it refused too, an encrypted envelope it cannot - /// open included. Bytes that are not a `WAI1` or `WAI2` envelope are refused at once and - /// nothing is recorded. The recorder derives its figures, and whether any of its outputs - /// was presented from the presentations it is told, and holds it, so `finish` checks the - /// claim against it. Received again, it is one object with the bytes of both. + /// received, presented or not, and one it refused too: an encrypted envelope it cannot + /// open, or bytes that are not an envelope at all, are an inert object, neither counted + /// nor presented, so the session accounts for every byte transferred. The recorder + /// derives its figures, and whether a decoder entry names it, and holds it, so `finish` + /// checks the claim against it. Received again, it is one object with the bytes of both. pub fn received(&mut self, envelope: &[u8]) -> Result<(), JsError> { - self.rec()?.received_envelope(envelope, SessionPath::Primary).map_err(js_err) + self.rec()?.received_envelope(envelope, SessionPath::Primary); + Ok(()) } /// A presentation: `unit` at `layers` (1 for the base alone), through the decoder @@ -708,7 +709,7 @@ mod tests { r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); } for o in &m.e.objects { - r.received_envelope(envelope_of(&o.content_hash), SessionPath::Primary).unwrap(); + r.received_envelope(envelope_of(&o.content_hash), SessionPath::Primary); } let got = finish(r, subject, &seed, None, T).unwrap(); assert_eq!(got["claim"], want["claim"], "{name}: the page's session is the native tool's"); @@ -739,8 +740,8 @@ mod tests { /// (SPEC §4); any other `via` is refused before anything is recorded. An entry naming a /// capability its envelope does not give, recorded past that check, is refused when the /// session is sealed, against the envelope the recorder holds (`session_source_mismatch`). - /// Bytes that are not an envelope are refused when received, and an encrypted envelope no - /// entry names is held, uncounted, and the session seals. + /// Bytes that are not an envelope, and an encrypted envelope, no entry names are held, + /// uncounted and not presented, and the session seals. #[test] fn a_decoder_is_named_through_its_envelopes_capability() { let dir = "staged-measure-conformance/fixtures/still"; @@ -762,15 +763,16 @@ mod tests { } let h = r.decoder(k); r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); - r.received_envelope(base, SessionPath::Primary).unwrap(); - r.received_envelope(&encrypted, SessionPath::Primary).unwrap(); - assert!(r.received_envelope(&base[..7], SessionPath::Primary).is_err(), "not an envelope"); + r.received_envelope(base, SessionPath::Primary); + r.received_envelope(&encrypted, SessionPath::Primary); + r.received_envelope(&base[..7], SessionPath::Primary); finish(r, subject, &"44".repeat(32), None, T) }; let s = session(None).unwrap(); let (claim, o, j) = (s["claim"].as_str().unwrap(), s["outputs"].to_string(), s["objects"].to_string()); assert_eq!(s["objects"][1]["counted"], Value::Null, "the encrypted envelope: uncounted"); - assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone(), encrypted.clone()])).unwrap(), "", "an inert envelope no entry names"); + assert_eq!((s["objects"][2]["counted"].clone(), s["objects"][2]["transferred"].clone()), (Value::Null, Value::from(7)), "bytes that are not an envelope: uncounted, transferred"); + assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone(), encrypted.clone(), base[..7].to_vec()])).unwrap(), "", "inert objects no entry names"); let why = session(Some("wai.audio.int_codec")).unwrap_err(); assert!(why.contains("session_source_mismatch"), "{why}"); } -- 2.54.0 (Apple Git-157) From f25b0d28f9a4d310906e0af2d55ff861b466cbb9 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 22:34:55 -0400 Subject: [PATCH 06/21] ci: wai-web-wasm runs when int-payload-conformance changes verify_measure.sh's checks import int_payload_verify (through claim_verify.py). Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-web-wasm.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/wai-web-wasm.yml b/.github/workflows/wai-web-wasm.yml index 36d562a48..2854fd532 100644 --- a/.github/workflows/wai-web-wasm.yml +++ b/.github/workflows/wai-web-wasm.yml @@ -58,6 +58,7 @@ on: - 'wai/neural-conformance/**' - 'wai/staged-conformance/**' - 'wai/staged-measure-conformance/**' + - 'wai/int-payload-conformance/**' - 'wai/claim-conformance/**' - 'wai/registry/**' - '.github/workflows/wai-web-wasm.yml' @@ -69,6 +70,7 @@ on: - 'wai/neural-conformance/**' - 'wai/staged-conformance/**' - 'wai/staged-measure-conformance/**' + - 'wai/int-payload-conformance/**' - 'wai/claim-conformance/**' - 'wai/registry/**' - '.github/workflows/wai-web-wasm.yml' -- 2.54.0 (Apple Git-157) From 2a714a7c7aa0f69e5ccd2ce361ca773190ba4287 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 22:37:19 -0400 Subject: [PATCH 07/21] wai: a vector for a WAI2 refinement component whose base is another refinement The round-4 falsification of the WAI2 base-is-a-base rule found no vector that reached it; session_wai2_refines_base_is_a_refinement does. 497 vectors. Co-Authored-By: Claude Opus 5.5 --- wai/claim-conformance/README.md | 3 +- wai/claim-conformance/vectors.json | 41 +++++++++++++++++++ wai/extensions/jwp-receipts.md | 4 +- wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 35 ++++++++++++++++ 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 2e2f592f9..bd0d83868 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -252,7 +252,8 @@ The vectors cover: (`session_counted_mismatch`); held layers a sink cannot apply — at layer 0, with a span past or empty over a held base, with no `refines` on a refinement-only capability, with a base that is itself a layer, and, as `WAI2` refinement components, with a base that - is no rendition of the envelope, named by no component id, or a span past it + is no rendition of the envelope, named by no component id, or another refinement + component, or a span past it (`session_refines_malformed`); a layer's entry at another `first_unit` than its base's entry's, as a `WAI1` layer and as a `WAI2` refinement component, and the entries of a `stage` claim's base and of a layer it lists at another than the unit `stage_sets` diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index 006a9cd96..8c234f612 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -9893,6 +9893,47 @@ "link_hash": "3a8f6f49b29f185a40a54c7014d49507c6d3e17f3b4910a6e4c84bceb98b948b" } }, + { + "name": "session_wai2_refines_base_is_a_refinement", + "about": "a refinement component whose refines names as its base another refinement component of the envelope, not a base", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1340,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"9e5dffc66bbfdb65f03df6939e267effe2ad1652555abb1153c9de3aa53ce64f\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"9e5dffc66bbfdb65f03df6939e267effe2ad1652555abb1153c9de3aa53ce64f\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":2,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"52a798c4fa43426919db8ade72abcf93f6052b1996acdd34e2e31d96f2ee07ad\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1340,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"30e68f38b5bb957e1efdb7a8965598eac32a86468ebaadfaf64b12a2fbddf57efb7b0f07650499a0be061f6eceadb92210b71c2b0adce146c2a0f997551c500a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"9e5dffc66bbfdb65f03df6939e267effe2ad1652555abb1153c9de3aa53ce64f\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + } + ], + "objects": [ + { + "content_hash": "9e5dffc66bbfdb65f03df6939e267effe2ad1652555abb1153c9de3aa53ce64f", + "path": "primary", + "counted": 1340, + "transferred": 1340, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932720200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572222c226964223a2262222c22736861323536223a2233316439386466383732346662316232336165623264323034316538396335323331623136353061383436636430333739653735643733373761303536623530227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a22726566696e65222c226964223a2273222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2272222c2270726576223a2272222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d030000000000980000009800000008010000a0010000080100005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_refines_malformed" + } + }, { "name": "session_wai2_refines_base_missing", "about": "a refinement component whose refines names a component the envelope does not hold", diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index f219c6d13..907e78f83 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -2432,8 +2432,8 @@ moved, and past the frames of a base decoded through its manifest's `fallback` (`session_unit_outside_object`); a held inert envelope listed with counted bytes 0 (`session_counted_mismatch`); held layers a sink cannot apply — layer 0, a span past or empty over a held base, no `refines` on a refinement-only capability, a base that is -itself a layer, and in a `WAI2` envelope a base that is no rendition or no component id, -and a span past it (`session_refines_malformed`); a layer's entry at another +itself a layer, and in a `WAI2` envelope a base that is no rendition, no component id or +another refinement component, and a span past it (`session_refines_malformed`); a layer's entry at another `first_unit` than its base's, in a `WAI1` layer and a `WAI2` refinement component, and the base's and a layer's entries at another than the unit `stage_sets` names their `stage` claim at (`session_first_unit_mismatch`); `WAI2` refinement components presented diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index 506ab7385..4155d595d 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -3499,7 +3499,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 496 + 497 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index a350b18b8..111b1ce0c 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -1933,6 +1933,41 @@ fn apply_vectors() -> Vec { and(b(0), &[pres(0, 2, 1)]), None, )); + { + // A refinement component whose base is another refinement component. + use crate::container::RenditionMeta; + let refinement = |id: &str, refines: Value| { + let mut meta = RenditionMeta::new("wai.video.int_refine", "refine"); + meta.id = Some(id.into()); + meta.role = Some("refinement".into()); + meta.refines = Some(refines); + Rendition::from_meta(meta, wir1_payload(1)).with_payload_digest() + }; + let e = WaiMulti::new( + "video", + "replicate", + Value::Null, + vec![ + Rendition::media("wai.video.int_hyper", "int_hyper", wiv1(1)).with_id("b").with_payload_digest(), + refinement("r", rc("b", 1, None)), + refinement("s", rc("r", 1, None)), + ], + ) + .to_bytes() + .expect("a WAI2 envelope"); + let h = object_content_hash(&e); + v.push(vector( + "session_wai2_refines_base_is_a_refinement", + "a refinement component whose refines names as its base another refinement component of the envelope, not a base", + vec![e.clone()], + vec![ + entry_decoder("wai.video.int_hyper", SessionPath::Primary, true, Some(0), h, 0, 0), + entry_decoder("wai.video.int_refine", SessionPath::Primary, false, Some(2), h, 0, 0), + ], + and(b(0), &[pres(0, 2, 1)]), + Some(Reason::SessionRefinesMalformed), + )); + } for (name, about, e) in [ ("session_wai2_refines_base_missing", "a refinement component whose refines names a component the envelope does not hold", wai2_layered("b", rc("c", 1, None))), ("session_wai2_refines_id_malformed", "a refinement component whose refines names its base by an id that is not a component id (an uppercase letter)", wai2_layered("B", rc("B", 1, None))), -- 2.54.0 (Apple Git-157) From d2d24798a2c8ef2e0f7dd6eb4092aea24ac6c662 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 23:26:55 -0400 Subject: [PATCH 08/21] wai: one base in either form, units in the payload's magic, every sink refusal accounted for MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §2.4.12, against the envelopes: - A WAI2 rendition and its exploded envelope are one base (staged-delivery §9): rules 5, 6 and 8 read a layer's base, and the entries naming it, in either form, so a WAI1 layer over a component, or a refinement component whose base an entry names as its exploded envelope, is tied to the base's first unit and its units. - A WAI1 base's units are read in the format whose magic the payload starts with, of its capability's and its fallback's pinned formats. - Rule 5 (now session_layer_not_applicable) holds every refusal of staged-delivery §4.1 steps 1-4 and 6 and SPEC §7.1's refinement conformance: capability-not-refinement, refines malformed or absent, a nonconforming refinement component, a base that is not a base or a selectable rendition, a base the layer does not admit, a base decoded only through its fallback, a span or runs outside a held base, and a payload that is not WIR1 with a unit for each unit covered. Rule 6 ties a layer only to the entries it is applied over. - Rule 4 refuses an entry naming a WAI2 companion, a rendition or refinement whose payload does not match its sha256, a capability that is not dispatchable, or the fallback of a WAI1 whose capability is companion-only. - §2.4.12 names each refusal it leaves to the signer's statement. The claim-conformance README's table lists every sink refusal that decides whether a presentation can happen, each with its rule and vectors or the sentence that leaves it to the signer. New vectors from the review's probes (A1-A4, B1-B2, H0, H2, H4, H5, R0/R1) and for every row the table closes; 525 vectors, the pinned prefix unchanged. claim_verify.py agrees on every vector and probe; differential.py adds bases named by exploded envelopes, fallbacks of another format, admission, digests and refinement conformance. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 30 +- wai/claim-conformance/README.md | 70 +- wai/claim-conformance/claim_verify.py | 185 +- wai/claim-conformance/differential.py | 105 +- wai/claim-conformance/vectors.json | 1785 ++++++++++++++++- wai/extensions/jwp-receipts.md | 146 +- wai/wai-rs/src/claim_receipt.rs | 15 +- .../src/claim_receipt/corpus/session.rs | 351 +++- wai/wai-rs/src/claim_receipt/session.rs | 268 ++- 9 files changed, 2707 insertions(+), 248 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index c95c86791..b9ae4fff0 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -67,19 +67,31 @@ wire format may change and such changes are recorded here. from `first_unit` plus the span's start, the span's count of units, or the base's units where a layer has no span or the object is a base (`session_unit_outside_object`). A re-decode decodes unit `unit − first_unit` of the entry's object. A base's units are read - in its payload's own format — its manifest capability's, or its fallback's where the - capability pins none — whichever capability the entry names. `claim_verify.py` reads + in its payload's own format — of its manifest capability's and its fallback's pinned + formats, the one whose magic the payload starts with — whichever capability the entry + names. `claim_verify.py` reads the units from the integer payloads as `wai-rs` does, and `differential.py` adds random sessions holding a base's and its layers' envelopes, as `WAI1` envelopes and as `WAI2` components. - **A layer is one a sink can apply, at its base's first unit** (§2.4.12). An entry naming - a held layer whose `refines` is malformed, absent on a refinement-only capability, - names a base that is a layer or no rendition of its `WAI2` envelope, or whose span - lies outside a held base's units is refused (`session_refines_malformed`): a sink - refuses such a layer, so nothing can be presented through it. A held layer's entry - states the `first_unit` of an entry naming its base, and an entry naming a `stage` - claim's base or a layer it lists states the unit `stage_sets` names that claim at - (`session_first_unit_mismatch`). + a held layer a sink refuses is refused (`session_layer_not_applicable`): not a + refinement or with a fallback, its `refines` malformed or absent, a `WAI2` refinement + component that does not conform (SPEC §7.1), its base a layer, not admitted by the + layer's capability or decoded only through its fallback, its span or runs outside a + held base's units, or its payload not `WIR1` with a unit for each it covers + (staged-delivery §4.1 steps 1–4 and 6). A `WAI2` component and its exploded envelope + are one base in either form (staged-delivery §9). A held layer's entry states the + `first_unit` of an entry it is applied over — naming its base through its own + capability — and an entry naming a `stage` claim's base or a layer it lists states the + unit `stage_sets` names that claim at (`session_first_unit_mismatch`). +- **An entry names what a sink dispatches** (§2.4.12 rule 4): never a `WAI2` companion, + a rendition or refinement whose payload does not match its `sha256`, a capability that + is not dispatchable, or the fallback of a `WAI1` whose capability is companion-only + (`session_source_mismatch`). +- **Every refusal accounted for.** The claim-conformance README's table lists each + refusal a sink makes that decides whether a presentation can happen — staged-delivery + §3, §4.1, §4.3–§4.5, §9; SPEC §4, §5, §7.1 — with the §2.4.12 rule and vector that + refuse it, or the sentence of §2.4.12 that leaves it to the signer's statement. - **The browser claim is a release build.** `verify_measure_wasm.mjs` requires the wasm32 claim's `host.build.profile` to be `release` and its target `wasm32-unknown-unknown`. - **The build profile is the optimisation level.** `release` is a build at `opt-level` diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index bd0d83868..0b6749cc4 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -249,20 +249,21 @@ The vectors cover: (`session_presented_mismatch`); an encrypted envelope, a `WAI1` envelope with no manifest members and bytes of neither magic, each named by an entry (`session_envelope_unreadable`); a held inert envelope listed with counted bytes 0 - (`session_counted_mismatch`); held layers a sink cannot apply — at layer 0, with a span - past or empty over a held base, with no `refines` on a refinement-only capability, with - a base that is itself a layer, and, as `WAI2` refinement components, with a base that - is no rendition of the envelope, named by no component id, or another refinement - component, or a span past it - (`session_refines_malformed`); a layer's entry at another `first_unit` than its base's - entry's, as a `WAI1` layer and as a `WAI2` refinement component, and the entries of a - `stage` claim's base and of a layer it lists at another than the unit `stage_sets` + (`session_counted_mismatch`); entries a sink cannot have decoded through — a `WAI2` + companion, a rendition or refinement whose payload does not match its `sha256`, a + `WAI1` whose capability is companion-only, a fallback that is + (`session_source_mismatch`); held layers a sink cannot apply, each row of the table + below that names rule 5 (`session_layer_not_applicable`); a layer's entry at another + `first_unit` than its base's entry's, as a `WAI1` layer, as a `WAI2` refinement + component and across a `WAI2` component and its exploded envelope, and the entries of + a `stage` claim's base and of a layer it lists at another than the unit `stage_sets` names the claim at (`session_first_unit_mismatch`); a unit presented at more layers than its layer envelope, its refinement component or its base gives (`session_layers_mismatch`); a unit past the base's frames, the same past the frames - of a base decoded through its manifest's `fallback`, outside a layer's span, a `WAI2` - rendition's frame or a refinement component's base, and through an entry whose - `first_unit` is moved (`session_unit_outside_object`); a second rendition of a capability the session decoded, + of a base decoded through its manifest's `fallback`, in the fallback's format where + the capability's is another, outside a layer's span, a `WAI2` rendition's frame, a + refinement component's base or a `WAI2` base a `WAI1` layer refines, and through an + entry whose `first_unit` is moved (`session_unit_outside_object`); a second rendition of a capability the session decoded, of another media, WAI's own, a companion, a record, a parameter set, a neural codec, an unregistered string, or a text capability in a text envelope — none a classical rendition the session did not need — and a length one byte off @@ -279,6 +280,44 @@ The vectors cover: and a `measurement` claim on an unmetered session, which carries no figure. +### The sink's refusals, and what the session claim does with each + +Every refusal a sink makes that decides whether a presentation can happen — +staged-delivery §3, §4.1 (each step), §4.3–§4.5 and §9; SPEC §4 (step 5, the fallback), +§5 and §7.1; and `WaiMulti::check_component_roles`'s refinement codes — is either refused +by a rule of jwp-receipts §2.4.12 against the envelopes, with a vector here that reaches +it, or left to the signer's statement by the sentence of §2.4.12 that names it ("So, +deliberately, is each refusal a sink makes that the rules above do not check"). A row +with neither is a hole; there is none. + +| source | refusal | §2.4.12 | vectors | +|---|---|---|---| +| staged-delivery §3 | `refines` malformed: member types and ranges, `prev`'s forms, adjacent runs of one producer, an array of one run, a producer other than `base` at layer 1, runs that do not sum to the span | rule 5, `session_layer_not_applicable` | `session_refines_layer_zero`, `session_refines_span_empty`, `session_wai2_refines_id_malformed` | +| staged-delivery §3 | `refines` absent on a refinement-only capability, present on one that is not | rule 5 | `session_refines_absent`, `session_refines_on_a_base_capability`, `session_wai2_refines_on_a_rendition` | +| staged-delivery §3, §4.1 step 2 | with the base: a span outside its units, runs that do not sum to the units covered | rule 5 | `session_refines_span_past_base`, `session_wai2_refines_span_past_base`, `session_refines_runs_short`; accepted: `session_refines_runs_whole_accept` | +| §4.1 step 1 | `capability-not-refinement`: a layer not of a refinement-only capability, or with a fallback | rule 5 | `session_layer_with_fallback`, `session_refines_on_a_base_capability` | +| §4.1 step 2 | `base-absent`: no base decoded with the content hash `refines.base` | where the base is held and is a layer, rule 5; otherwise the signer's statement | `session_refines_base_is_a_layer`, `session_wai2_refines_base_is_a_refinement` | +| §4.1 step 3 | `base-via-fallback` | rule 5 (applied over an entry decoding the base through its own capability); rule 6 ties the layer only to such entries | `session_layer_base_via_fallback` | +| §4.1 step 4 | `base-not-admitted` (SPEC §5, *Base admission*) | rule 5 | `session_layer_base_not_admitted`, `session_wai2_layer_base_not_admitted` | +| §4.1 step 5 | `refinement-unattested` | the signer's statement: no context carries a delivery receipt | — | +| §4.1 step 6 | `payload-malformed`: the payload does not parse, or holds another number of units than the layer covers | rule 5, where the count of units covered is read | `session_layer_payload_not_wir1`, `session_layer_payload_units_short` | +| §4.1 step 6 | `payload-malformed` for a stream that does not decode canonically; `cost-over-limit`; `chain-over-limit` | the signer's statement; a re-decode of a byte-exact presentation checks its output | — | +| §4.1 steps 7–10 | `layer-conflict`, `prev-mismatch`, `layer-gap`, `geometry-mismatch`, `deadline-missed` | the signer's statement; rules 7 and 8 bound a layer's presentations to its count and units, and the `stage` claims the stages a unit reached | `session_layers_past_the_object`, `session_unit_outside_span`, `session_stage_beyond_applied` | +| §4.1, after step 10 | a unit presented from a layer that failed for it | rules 7 and 8 | as above | +| §4.3–§4.5 | the hold bound, batches, the chain budget for a base | the signer's statement | — | +| staged-delivery §9 | a `WAI2` component and its exploded envelope are one object | rules 5, 6 and 8 read a base in either form | `session_alias_layer_on_component_accept`, `session_alias_layer_first_unit_not_its_base`, `session_alias_layer_unit_past_the_base`, `session_alias_exploded_held_first_unit`, `session_alias_component_layer_named_as_exploded` | +| SPEC §4 steps 3, 5 | a `WAI1` decoded through its `capability`, else its `fallback`, and nothing else | rule 4, `session_source_mismatch` | `session_relabel_wai1_base`, `session_relabel_av1` | +| SPEC §4 | a capability that is not dispatchable never taken; a `WAI1` whose capability is companion-only inert, its fallback never taken | rule 4 | `session_wai1_fallback_not_dispatchable`, `session_wai1_companion_only_capability` | +| SPEC §4 step 5 | the fallback decodes the same payload | rule 8 reads the units in the payload's own format | `session_unit_fallback_past_the_title`, `session_unit_fallback_format_past_the_title`, `session_unit_fallback_format_audio`; accepted: `session_unit_fallback_accept`, `session_unit_fallback_format_accept` | +| SPEC §3.1, §4 | a pin that does not resolve, a module not held, a key log's revocation | the signer's statement, which a decoder entry's `pin` and `tier` state | — | +| SPEC §6.4 | an encrypted envelope is inert | rule 3, `session_envelope_unreadable`, where an entry names it | `session_envelope_encrypted` | +| SPEC §5 | a refinement-only capability is never a `capability` or `fallback` a sink dispatches, a selectable rendition or a companion | rules 4 and 5 | `session_layer_with_fallback`, `session_wai2_refines_on_a_rendition` | +| SPEC §7.1, *Selection algorithm* | a companion, or a capability that is not dispatchable, is never picked | rule 4 | `session_wai2_entry_names_a_companion` | +| SPEC §7.1, *Component identity* | `component_digest_mismatch`: a rendition whose payload does not match its `sha256` is skipped, a refinement is not offered | rule 4 | `session_wai2_rendition_digest_mismatch`, `session_wai2_refinement_digest_mismatch` | +| SPEC §7.1, *Component identity* | an `id`, `sha256` or `companion_of_id` that is not a string: the reader rejects the envelope | rule 3 | `session_wai2_component_id_not_a_string` | +| SPEC §7.1, *Refinement components* (`refinement-not-refinement-only`, `refinement-identity-missing`, `refines-malformed`, `refinement-base-missing`, `refinement-base-not-admitted`, `refinement-prev-missing`, `refinement-before-selectable`, `refines-on-non-refinement`, `refinement-only-as-component`) | a refinement component that does not conform is not offered | rule 5 | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_wai2_refines_on_a_rendition` | +| SPEC §7.1, *Companion components* | a companion that breaks rules 1–3 or its `companion_of_id`; an enhancement layer whose base is not unique | no bearing on a presentation: a sink does not apply the companion and may still present the rendition it picked; the output's digest holds whatever was applied | — | + ## Steps 1 and 2: types, and the order a body is read in §3.1 step 2 checks exactly the type a member table gives, member by member in the @@ -399,10 +438,15 @@ counted bytes that are not a held envelope's, a `first_unit` moved, inert bytes and named by an entry or not, every acquisition class), checked against its presentations, objects, WAI2 envelopes and a `stage` claim; and sessions holding their envelopes — a base of one to six frames, a `WAI1` envelope whose manifest may name a fallback its entry -decodes through or the base component of a `WAI2` envelope, and layers refining it at +decodes through, of the capability's format or another, or a companion-only capability, +the base component of a `WAI2` envelope, named by its envelope or by its exploded +envelope, held or not, or such a component that `WAI1` layers refine by its exploded +envelope's content hash, and layers refining it at layer 1 or 2 over a span or all of its units, as `WAI1` envelopes or refinement components, now and then naming another base or a layer as their base, at layer 0, with -an empty span or one past the base, or with no `refines` — with presentations through +an empty span or one past the base, with no `refines`, of a capability that does not +admit the base, with a `WIR1` payload a unit short, or, as components, with no `sha256`, +no role or another payload's digest, over a base that is a companion — with presentations through each at one to three layers, within what each envelope covers and past it, entries whose `first_unit` is the base's or one off, the base's and the layers' each, and objects whose figures are each envelope's or one told otherwise, listed twice, fetched again, or beside diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 69b4779a7..4a345c0c4 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -933,25 +933,44 @@ def read_envelope(data): def base_units(cap, fallback, p): - """§2.4.12: the units a WAI1 base's payload holds, read in the payload's own format: the - format pinned for the manifest's capability, or, where it pins none, for its fallback, - which decodes the same payload (SPEC §4 step 5).""" - if cap in IPV.CAP_MAGIC: - return payload_units(cap, p) - return payload_units(fallback, p) if isinstance(fallback, str) else None + """§2.4.12: the units a WAI1 base's payload holds, read in the payload's own format: of + the formats pinned for the manifest's capability and its fallback, which decodes the + same payload (SPEC §4 step 5), the one whose magic the payload starts with.""" + for c in (cap, fallback): + if isinstance(c, str) and IPV.CAP_MAGIC.get(c) == p[:4]: + return payload_units(c, p) + return None -def layer_of(ref, n, base): - """A well-formed refines and its base's units where read: ("layer", layers, span, - base), or ("malformed",) where its span lies outside those units or its runs do not - sum to the units it covers (staged-delivery §3, §4.1 step 2).""" +def layer_units(ref, n): + """A well-formed refines and its base's units where read: (layers, span), or None where + its span lies outside those units or its runs do not sum to the units it covers + (staged-delivery §3, §4.1 step 2).""" if n is not None: try: SV.check_units(ref, n) except SV.Malformed: - return ("malformed",) + return None span = ref["span"] if ref["span"] is not None else (None if n is None else (0, n)) - return ("layer", ref["layer"] + 1, span, base) + return ref["layer"] + 1, span + + +def dispatchable(cap): + """SPEC §4: a capability a sink decodes on its own — one the registry does not list, + or a payload that is not a candidate.""" + c = REGISTRY.get(cap) + return c is None or (c["kind"] == "payload" and c["status"] != "candidate") + + +def companion_only(cap): + c = REGISTRY.get(cap) + return c is not None and c["kind"] == "companion" + + +def digest_matches(e, payload): + """SPEC §7.1: a rendition's payload matches its stated sha256, if it states one.""" + h = e.get("sha256") + return h is None or (SV.is_hash(h) and hashlib.sha256(payload).hexdigest() == h) def check_session_envelopes(c, envs, objs, ps): @@ -971,84 +990,146 @@ def check_session_envelopes(c, envs, objs, ps): for e in envs: h, n = SV.content_hash(e), counted_of(e) need(all(o["counted"] == n for o in objs if o["content_hash"] == h), 6, "session_counted_mismatch") - by_hash, inert, readable = {}, set(), [] + by_hash, inert, readable, exploded = {}, set(), [], [] for data in envs: r = read_envelope(data) if r is None: inert.add(SV.content_hash(data)) else: - by_hash.setdefault(SV.content_hash(data), r) + h = SV.content_hash(data) + if r[0] == "multi": + # Each rendition is also its exploded envelope, the same object (SPEC §7.1, + # staged-delivery §9). + try: + each = SV.explode_each(data) + except Exception: # noqa: BLE001 (an envelope that does not explode has no aliases) + each = [] + exploded += [(SV.content_hash(x), h, j) for j, x in enumerate(each) if x is not None] + by_hash.setdefault(h, r) readable.append(r) need(not any(d["object"] in inert and d["object"] not in by_hash for d in b["decoders"]), 6, "session_envelope_unreadable") + refinement_only = lambda cap: cap in SV.UNIT_KIND # noqa: E731 + layer_entry = lambda e: e.get("refines") is not None or e.get("role") == "refinement" or refinement_only(e["capability"]) # noqa: E731 + layer_one = lambda m: m.get("refines") is not None or refinement_only(m["model_requirement"]["capability"]) # noqa: E731 for d in b["decoders"]: r = by_hash.get(d["object"]) if r is not None and r[0] == "multi": - rs = r[1]["renditions"] - gives = d["rendition"] is not None and d["rendition"] < len(rs) and rs[d["rendition"]]["capability"] == d["capability"] + rs, i = r[1]["renditions"], d["rendition"] + gives = (i is not None and i < len(rs) and rs[i]["capability"] == d["capability"] + and (selectable(rs[i]) or layer_entry(rs[i])) and digest_matches(rs[i], r[2][i])) elif r is not None: mr = r[1]["model_requirement"] - gives = d["rendition"] is None and d["capability"] in (mr["capability"], mr.get("fallback")) + gives = (d["rendition"] is None and d["capability"] in (mr["capability"], mr.get("fallback")) + and (layer_one(r[1]) or (dispatchable(d["capability"]) and not companion_only(mr["capability"])))) else: gives = d["rendition"] is None need(gives, 6, "session_source_mismatch") + def component(m, payloads, j): + e = m["renditions"][j] + return {"capability": e["capability"], "units": payload_units(e["capability"], payloads[j]), + "is_base": selectable(e) and e.get("refines") is None} + + def base_by_hash(h): + r = by_hash.get(h) + if r is not None and r[0] == "one": + mr = r[1]["model_requirement"] + return {"capability": mr["capability"], "units": base_units(mr["capability"], mr.get("fallback"), r[2]), + "is_base": not layer_one(r[1])} + hit = next(((w, j) for x, w, j in exploded if x == h), None) + if hit is None or by_hash[hit[0]][0] != "multi": + return None + return component(by_hash[hit[0]][1], by_hash[hit[0]][2], hit[1]) + + def names_of(hash_form, pair): + hashes = [hash_form] if hash_form is not None else [] + pairs = [pair] if pair is not None else [] + for x, w, j in exploded: + if hash_form == x: + pairs.append((w, j)) + if pair == (w, j): + hashes.append(x) + return hashes, pairs + + ds = b["decoders"] + + def layer_of(cap, ref, base, names, payload): + """A layer of capability cap over the base (where held) named by names: ("layer", + layers, span, first units of the entries it is applied over), or ("na",).""" + n = None + if base is not None: + if not base["is_base"] or base["capability"] not in SV.ADMIT.get(cap, ()): + return ("na",) + n = base["units"] + hashes, pairs = names + naming = [e for e in ds if e["object"] in hashes or (e["rendition"] is not None and (e["object"], e["rendition"]) in pairs)] + over = [e["first_unit"] for e in naming + if e["capability"] in SV.ADMIT.get(cap, ()) and (base is None or e["capability"] == base["capability"])] + if naming and not over: + return ("na",) + lu = layer_units(ref, n) + if lu is None: + return ("na",) + try: + w = SV.parse_wir1(payload, SV.UNIT_KIND[cap]) + except (SV.Refused, KeyError): + return ("na",) + if lu[1] is not None and w["n_units"] != lu[1][1]: + return ("na",) + return ("layer", lu[0], lu[1], over) + def given(d): """What d's held envelope is: ("base", units or None), ("layer", layers, span or - None, (base hash, base rendition or None)), or ("malformed",); None where the + None, first units), or ("na",) for a layer a sink cannot apply; None where the envelope is not held.""" r = by_hash.get(d["object"]) if r is None: return None - refinement_only = lambda cap: cap in SV.UNIT_KIND # noqa: E731 if r[0] == "one": m, payload = r[1], r[2] mr = m["model_requirement"] - ref = m.get("refines") - if ref is None: - if refinement_only(mr["capability"]): - return ("malformed",) + if not layer_one(m): return ("base", base_units(mr["capability"], mr.get("fallback"), payload)) try: - ref = SV.parse_refines(ref) + ref = SV.parse_refines(m.get("refines")) except SV.Malformed: - return ("malformed",) - n = None - base = by_hash.get(ref["base"]) - if base is not None and base[0] == "one": - bmr = base[1]["model_requirement"] - if base[1].get("refines") is not None or refinement_only(bmr["capability"]): - return ("malformed",) - n = base_units(bmr["capability"], bmr.get("fallback"), base[2]) - return layer_of(ref, n, (ref["base"], None)) - if d["rendition"] is None: + return ("na",) + if not refinement_only(mr["capability"]) or mr.get("fallback") is not None: + return ("na",) + return layer_of(mr["capability"], ref, base_by_hash(ref["base"]), names_of(ref["base"], None), payload) + i = d["rendition"] + if i is None: return None m, payloads = r[1], r[2] rs = m["renditions"] - if d["rendition"] >= len(rs): + if i >= len(rs): return None - e = rs[d["rendition"]] - ref = e.get("refines") - if ref is None: - if refinement_only(e["capability"]): - return ("malformed",) - return ("base", payload_units(e["capability"], payloads[d["rendition"]])) + e = rs[i] + if not layer_entry(e): + return ("base", payload_units(e["capability"], payloads[i])) + identified = lambda x: x.get("id") is not None and x.get("sha256") is not None # noqa: E731 + if e.get("refines") is None: + return ("na",) try: - ref = SV.parse_refines_ids(ref) + ref = SV.parse_refines_ids(e["refines"]) except SV.Malformed: - return ("malformed",) - j = next((j for j, x in enumerate(rs) if x.get("id") == ref["base"]), None) - if j is None or rs[j].get("refines") is not None or refinement_only(rs[j]["capability"]): - return ("malformed",) - return layer_of(ref, payload_units(rs[j]["capability"], payloads[j]), (d["object"], j)) + return ("na",) + by_id = lambda x: next((j for j, y in enumerate(rs) if y.get("id") == x), None) # noqa: E731 + bj = by_id(ref["base"]) + conforms = (e.get("role") == "refinement" and refinement_only(e["capability"]) and identified(e) + and bj is not None and selectable(rs[bj]) and identified(rs[bj]) + and all(by_id(p) is not None and (selectable(rs[by_id(p)]) or (by_id(p) < i and rs[by_id(p)].get("role") == "refinement")) + and identified(rs[by_id(p)]) for p, _ in ref["runs"]) + and not any(selectable(y) for y in rs[i + 1:])) + if not conforms: + return ("na",) + return layer_of(e["capability"], ref, component(m, payloads, bj), names_of(None, (d["object"], bj)), payloads[i]) - ds = b["decoders"] - need(not any((given(d) or ("",))[0] == "malformed" for d in ds), 6, "session_refines_malformed") + need(not any((given(d) or ("",))[0] == "na" for d in ds), 6, "session_layer_not_applicable") for d in ds: g = given(d) if g is not None and g[0] == "layer": - h, j = g[3] - bases = [e["first_unit"] for e in ds if e["object"] == h and (j is None or e["rendition"] == j)] - need(not bases or d["first_unit"] in bases, 6, "session_first_unit_mismatch") + need(not g[3] or d["first_unit"] in g[3], 6, "session_first_unit_mismatch") if ps is not None: for p in ps: g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None diff --git a/wai/claim-conformance/differential.py b/wai/claim-conformance/differential.py index d3b004bed..f7f6702be 100644 --- a/wai/claim-conformance/differential.py +++ b/wai/claim-conformance/differential.py @@ -26,7 +26,9 @@ their caps, a null deadline with misses, presences that disagree, decoder indice range, leaves moved between entries, entries out of first-use order, every acquisition class — with their outputs, re-decodes, objects, entry envelopes and stage claims that reach their stages or miss them, and sessions holding a base's and its layers' envelopes -— WAI1 envelopes or a WAI2 envelope's components, some layers a sink cannot apply — +— WAI1 envelopes or a WAI2 envelope's components, a base named by its exploded +envelope or by its envelope and rendition, a base whose fallback is of another format, +some layers a sink cannot apply — presented within and past the layers and units each envelope gives, through entries at their base's first unit or another, with objects whose figures are each envelope's or told otherwise — @@ -52,7 +54,7 @@ there is still a difference in the claim verdict, and is reported like any other listing marks it, since its cause is in the two OER verifiers rather than the claim rules. Those two are compared on their own by `../oer-conformance/fuzz_differential.py`. """ -import argparse, base64, copy, hashlib, io, json, os, random, subprocess, sys, tempfile +import argparse, base64, copy, hashlib, io, json, os, random, struct, subprocess, sys, tempfile from decimal import Decimal, localcontext HERE = os.path.dirname(os.path.abspath(__file__)) @@ -1006,10 +1008,10 @@ def wiv1(frames, keyframe): def wai2_of(entries, payloads): - """A WAI2 envelope of the manifest entries `entries`, each with its payload's SHA-256, - over `payloads`.""" + """A WAI2 envelope of the manifest entries `entries`, each with its payload's SHA-256 + unless it states its own, over `payloads`.""" m = {"wai": "1.1", "media": "video", "intent": "replicate", - "renditions": [dict(e, sha256=hashlib.sha256(p).hexdigest()) for e, p in zip(entries, payloads)], "target": None} + "renditions": [dict({"sha256": hashlib.sha256(p).hexdigest()}, **e) for e, p in zip(entries, payloads)], "target": None} t = json.dumps(m, separators=(",", ":")).encode() table, o = b"", 0 for p in payloads: @@ -1018,6 +1020,21 @@ def wai2_of(entries, payloads): return b"WAI2" + len(t).to_bytes(4, "little") + t + len(payloads).to_bytes(2, "little") + table + b"".join(payloads) +def wir1_units(n, _cache={}): + """A WIR1 payload of `n` units that parses (staged-delivery Appendix A): the corpus's + four-unit layer's header and table, its first unit's stream for every unit. Nothing + decodes it.""" + if "four" not in _cache: + raise RuntimeError("wir1_units before session_held read the corpus's layer") + p = _cache["four"] + w = SV.parse_wir1(p, "rgb8") + cdf_len = struct.unpack_from(" "session_presented_mismatch", Reason::SessionEnvelopeUnreadable => "session_envelope_unreadable", Reason::SessionSourceMismatch => "session_source_mismatch", - Reason::SessionRefinesMalformed => "session_refines_malformed", + Reason::SessionLayerNotApplicable => "session_layer_not_applicable", Reason::SessionFirstUnitMismatch => "session_first_unit_mismatch", Reason::SessionLayersMismatch => "session_layers_mismatch", Reason::SessionUnitOutsideObject => "session_unit_outside_object", @@ -3499,7 +3500,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 497 + 525 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index 111b1ce0c..9775a4a1e 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -1081,6 +1081,7 @@ pub(super) fn vectors() -> Vec { )); v.extend(held_vectors()); v.extend(apply_vectors()); + v.extend(sweep_vectors()); v.push(env( "session_no_classical_accept", "a session with no classical length, beside an envelope whose second rendition is WAI's own", @@ -1862,7 +1863,7 @@ fn apply_vectors() -> Vec { ] { let layer = layer_with(refines, units); let at = if name == "session_refines_layer_zero" { pres(1, 9, 1) } else if name == "session_refines_span_past_base" { pres(40, 2, 1) } else { pres(1, 2, 1) }; - v.push(vector(name, about, vec![base.clone(), layer.clone()], vec![hyper(0), refine(&layer, 0)], and(base_ps(0), &[at]), Some(Reason::SessionRefinesMalformed))); + v.push(vector(name, about, vec![base.clone(), layer.clone()], vec![hyper(0), refine(&layer, 0)], and(base_ps(0), &[at]), Some(Reason::SessionLayerNotApplicable))); } { // A layer whose base is a layer. @@ -1873,7 +1874,7 @@ fn apply_vectors() -> Vec { vec![base.clone(), span_layer.clone(), on_layer.clone()], vec![hyper(0), refine(&span_layer, 0), refine(&on_layer, 0)], and(base_ps(0), &[pres(1, 2, 1), pres(1, 3, 2)]), - Some(Reason::SessionRefinesMalformed), + Some(Reason::SessionLayerNotApplicable), )); } // WAI2 refinement components. @@ -1965,7 +1966,7 @@ fn apply_vectors() -> Vec { entry_decoder("wai.video.int_refine", SessionPath::Primary, false, Some(2), h, 0, 0), ], and(b(0), &[pres(0, 2, 1)]), - Some(Reason::SessionRefinesMalformed), + Some(Reason::SessionLayerNotApplicable), )); } for (name, about, e) in [ @@ -1973,7 +1974,349 @@ fn apply_vectors() -> Vec { ("session_wai2_refines_id_malformed", "a refinement component whose refines names its base by an id that is not a component id (an uppercase letter)", wai2_layered("B", rc("B", 1, None))), ("session_wai2_refines_span_past_base", "a refinement component whose span runs past its one-frame base", wai2_layered("b", rc("b", 1, Some((0, 2))))), ] { - v.push(vector(name, about, vec![e.clone()], wai2_decoders(&e, 0), and(b(0), &[pres(0, 2, 1)]), Some(Reason::SessionRefinesMalformed))); + v.push(vector(name, about, vec![e.clone()], wai2_decoders(&e, 0), and(b(0), &[pres(0, 2, 1)]), Some(Reason::SessionLayerNotApplicable))); + } + v +} + +/// A `WAI1` envelope of `capability`, its `fallback` and `refines` as given, over `payload`. +fn wai1_of(capability: &str, fallback: Option<&str>, refines: Option, payload: Vec) -> Vec { + use crate::container::{Conditioning, Manifest, ModelRequirement, Wai}; + let mut req = ModelRequirement::new(capability); + if let Some(f) = fallback { + req = req.with_fallback(f); + } + let mut m = Manifest::new("video", "replicate", req, Conditioning::new("none")); + m.refines = refines; + Wai::new(m, payload).to_bytes().expect("a WAI1 envelope") +} + +/// A `WAI2` component of `capability` with `id`: a rendition, or with `role`; `refines` as +/// given; its payload's `sha256` stated, or another digest where `digest` says so. +fn component_of(capability: &str, id: &str, role: Option<&str>, refines: Option, payload: Vec, digest: Option<&str>) -> Rendition { + use crate::container::RenditionMeta; + let mut meta = RenditionMeta::new(capability, "c"); + meta.id = Some(id.into()); + meta.role = role.map(Into::into); + meta.refines = refines; + meta.sha256 = Some(digest.map_or_else(|| crate::pin::sha256_hex(&payload), Into::into)); + Rendition::from_meta(meta, payload) +} + +fn wai2_of(components: Vec) -> Vec { + WaiMulti::new("video", "replicate", Value::Null, components).to_bytes().expect("a WAI2 envelope") +} + +/// §2.4.12 step 6 against the envelopes, every refusal a sink makes that bears on whether a +/// presentation can happen (the claim-conformance README's sweep): a `WAI2` component and +/// its exploded envelope as one base, a base's units in its payload's own format, base +/// admission and a base decoded through its fallback, what a sink dispatches, and the +/// layers a sink cannot apply. +fn sweep_vectors() -> Vec { + let vector = |name: &'static str, about: &'static str, es: Vec>, decoders: Vec, ps: Vec, reason: Option| { + let (c, os) = held_over(&es, decoders, &ps); + let v = match reason { + None => claim(name, about, c.to_json(), Ok(())), + Some(r) => reject(name, about, c.to_json(), 6, r), + }; + with(with(with(v, "outputs", outputs_value(&ps)), "objects", objects_value(&os)), "envelopes", envelopes_value(&es)) + }; + let h = |e: &[u8]| object_content_hash(e); + let hx = |e: &[u8]| hex(&object_content_hash(e)); + let dec = |cap: &str, rendition: Option, object: &[u8], first_unit: u64| { + entry_decoder(cap, SessionPath::Primary, false, rendition, h(object), first_unit, 0) + }; + let four = |first: u64, d: u16| -> Vec { (first..first + 4).map(|u| pres(u, 1, d)).collect() }; + let and = |mut ps: Vec, more: &[Presentation]| { + ps.extend_from_slice(more); + ps + }; + let refines = |base: &str, prev: Value, layer: u64, span: Option<(u64, u64)>| { + let mut r = json!({ "base": base, "prev": prev, "layer": layer }); + if let Some((from, count)) = span { + r["span"] = json!({ "from": from, "count": count }); + } + r + }; + const HYPER: &str = "wai.video.int_hyper"; + const REFINE: &str = "wai.video.int_refine"; + let mut v = Vec::new(); + + // A WAI2 component and its exploded envelope are one base (staged-delivery §9). + let w = wai2_of(vec![component_of(HYPER, "b", None, None, wiv1(4), None)]); + let x = WaiMulti::explode(&w, 0).expect("the component's exploded envelope"); + let on_x = |span: Option<(u64, u64)>, units: usize| wai1_of(REFINE, None, Some(refines(&hx(&x), json!(hx(&x)), 1, span)), wir1_payload(units)); + let l = on_x(Some((1, 1)), 1); + v.push(vector( + "session_alias_layer_on_component_accept", + "a WAI1 layer whose refines.base is the exploded envelope of a WAI2 envelope's base component, which an entry names by envelope and rendition: one base, so the layer at its first unit covers unit 1", + vec![w.clone(), l.clone()], + vec![dec(HYPER, Some(0), &w, 0), dec(REFINE, None, &l, 0)], + and(four(0, 0), &[pres(1, 2, 1)]), + None, + )); + v.push(vector( + "session_alias_layer_first_unit_not_its_base", + "the same layer named with first_unit 50 and presented at unit 51, while the entry naming its base, the component, states 0", + vec![w.clone(), l.clone()], + vec![dec(HYPER, Some(0), &w, 0), dec(REFINE, None, &l, 50)], + and(four(0, 0), &[pres(51, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + )); + let whole = on_x(None, 4); + v.push(vector( + "session_alias_layer_unit_past_the_base", + "a layer with no span over the component, which holds four frames, and unit 1000 presented through it", + vec![w.clone(), whole.clone()], + vec![dec(HYPER, Some(0), &w, 0), dec(REFINE, None, &whole, 0)], + and(four(0, 0), &[pres(1000, 2, 1)]), + Some(Reason::SessionUnitOutsideObject), + )); + v.push(vector( + "session_alias_exploded_held_first_unit", + "as the layer at first_unit 50, with the component's exploded envelope held too and listed as an object received", + vec![w.clone(), l.clone(), x.clone()], + vec![dec(HYPER, Some(0), &w, 0), dec(REFINE, None, &l, 50)], + and(four(0, 0), &[pres(51, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + )); + { + let w2 = wai2_of(vec![ + component_of(HYPER, "b", None, None, wiv1(4), None), + component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None), + ]); + let x2 = WaiMulti::explode(&w2, 0).expect("the base's exploded envelope"); + v.push(vector( + "session_alias_component_layer_named_as_exploded", + "a WAI2 refinement component at first_unit 50 whose base component an entry names as its exploded WAI1 envelope at 0: one base", + vec![x2.clone(), w2.clone()], + vec![dec(HYPER, None, &x2, 0), dec(REFINE, Some(1), &w2, 50)], + and(four(0, 0), &[pres(51, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + )); + } + + // A base's units in its payload's own format: the magic decides. + for (name, about, cap, fb, ps, reason) in [ + ("session_unit_fallback_format_accept", "a WIV1 clip of four frames under a wai.neural.int_hyper manifest whose fallback wai.video.int_hyper pins WIV1, decoded through the fallback: units 0 to 3", "wai.neural.int_hyper", "wai.video.int_hyper", four(0, 0), None), + ("session_unit_fallback_format_past_the_title", "the same, with unit 9 presented: the payload is WIV1, the fallback's format, whatever the capability's is", "wai.neural.int_hyper", "wai.video.int_hyper", and(four(0, 0), &[pres(9, 1, 0)]), Some(Reason::SessionUnitOutsideObject)), + ("session_unit_fallback_format_audio", "a WIV1 clip under a wai.audio.int_codec manifest whose fallback is wai.video.int_motion, and unit 9 presented through the fallback", "wai.audio.int_codec", "wai.video.int_motion", and(four(0, 0), &[pres(9, 1, 0)]), Some(Reason::SessionUnitOutsideObject)), + ] { + let e = wai1_of(cap, Some(fb), None, wiv1(4)); + v.push(vector(name, about, vec![e.clone()], vec![dec(fb, None, &e, 0)], ps, reason)); + } + + // Base admission, and a base decoded through its fallback (staged-delivery §4.1 steps 3-4). + { + let b = wai1_of(HYPER, Some("wai.video.av1"), None, wiv1(4)); + let l = wai1_of(REFINE, None, Some(refines(&hx(&b), json!(hx(&b)), 1, Some((1, 1)))), wir1_payload(1)); + v.push(vector( + "session_layer_base_via_fallback", + "a layer over a base that the session decoded only through its manifest's fallback, wai.video.av1: a sink applies a layer only over a base decoded through its capability", + vec![b.clone(), l.clone()], + vec![dec("wai.video.av1", None, &b, 0), dec(REFINE, None, &l, 0)], + and(four(0, 0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + let base = base_envelope(); + let img = wai1_of("wai.image.int_refine", None, Some(refines(&hx(&base), json!(hx(&base)), 1, Some((1, 1)))), wir1_payload(1)); + v.push(vector( + "session_layer_base_not_admitted", + "a wai.image.int_refine layer over a wai.video.int_hyper base, which it does not admit", + vec![base.clone(), img.clone()], + vec![dec(HYPER, None, &base, 0), dec("wai.image.int_refine", None, &img, 0)], + and(four(0, 0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + let audio = wai2_of(vec![ + component_of("wai.audio.int_codec", "b", None, None, wiv1(4), None), + component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None), + ]); + v.push(vector( + "session_wai2_layer_base_not_admitted", + "a WAI2 refinement component of wai.video.int_refine over a wai.audio.int_codec base component", + vec![audio.clone()], + vec![dec("wai.audio.int_codec", Some(0), &audio, 0), dec(REFINE, Some(1), &audio, 0)], + and(four(0, 0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + let companion = wai2_of(vec![ + component_of(HYPER, "b", Some("companion"), None, wiv1(4), None), + component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None), + ]); + v.push(vector( + "session_wai2_entry_names_a_companion", + "an entry decoding a WAI2 component marked a companion, which a sink never picks", + vec![companion.clone()], + vec![dec(HYPER, Some(0), &companion, 0), dec(REFINE, Some(1), &companion, 0)], + and(four(0, 0), &[pres(1, 2, 1)]), + Some(Reason::SessionSourceMismatch), + )); + v.push(vector( + "session_wai2_refines_base_companion", + "a refinement component whose base is a companion, named by no entry: not a selectable base", + vec![companion.clone()], + vec![dec(REFINE, Some(1), &companion, 0)], + vec![pres(1, 2, 0)], + Some(Reason::SessionLayerNotApplicable), + )); + } + + // What a sink dispatches (SPEC §4, §7.1 *Selection algorithm*). + { + let wrong = wai2_of(vec![component_of(HYPER, "b", None, None, wiv1(4), Some(&crate::pin::sha256_hex(b"another payload")))]); + v.push(vector( + "session_wai2_rendition_digest_mismatch", + "an entry decoding a WAI2 rendition whose payload does not match its stated sha256: a sink skips it", + vec![wrong.clone()], + vec![dec(HYPER, Some(0), &wrong, 0)], + four(0, 0), + Some(Reason::SessionSourceMismatch), + )); + let r_wrong = wai2_of(vec![ + component_of(HYPER, "b", None, None, wiv1(4), None), + component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), Some(&crate::pin::sha256_hex(b"another layer"))), + ]); + v.push(vector( + "session_wai2_refinement_digest_mismatch", + "an entry applying a refinement component whose payload does not match its stated sha256: a sink does not offer it", + vec![r_wrong.clone()], + vec![dec(HYPER, Some(0), &r_wrong, 0), dec(REFINE, Some(1), &r_wrong, 0)], + and(four(0, 0), &[pres(1, 2, 1)]), + Some(Reason::SessionSourceMismatch), + )); + let hdr = wai1_of("wai.meta.hdr10plus", Some(HYPER), None, wiv1(4)); + v.push(vector( + "session_wai1_companion_only_capability", + "an entry decoding, through its fallback, a WAI1 envelope whose capability is companion-only: inert, its fallback never taken", + vec![hdr.clone()], + vec![dec(HYPER, None, &hdr, 0)], + four(0, 0), + Some(Reason::SessionSourceMismatch), + )); + let dovi = wai1_of(HYPER, Some("wai.meta.dovi"), None, wiv1(4)); + v.push(vector( + "session_wai1_fallback_not_dispatchable", + "an entry decoding a WAI1 envelope through its fallback, a companion-only capability a sink never dispatches", + vec![dovi.clone()], + vec![dec("wai.meta.dovi", None, &dovi, 0)], + four(0, 0), + Some(Reason::SessionSourceMismatch), + )); + } + + // Layers a sink cannot apply (staged-delivery §4.1 steps 1, 2 and 6; SPEC §7.1). + let base = base_envelope(); + let bh = hx(&base); + let span_layer = layer_envelope(Some((1, 1))); + let lh = hx(&span_layer); + let one_layer = |name: &'static str, about: &'static str, layer: Vec, cap: &str, at: Presentation, reason: Option| { + vector(name, about, vec![base.clone(), layer.clone()], vec![dec(HYPER, None, &base, 0), dec(cap, None, &layer, 0)], and(four(0, 0), &[at]), reason) + }; + v.push(one_layer( + "session_layer_with_fallback", + "a layer of wai.video.int_refine whose manifest names a fallback: not a refinement (capability-not-refinement)", + wai1_of(REFINE, Some("wai.video.av1"), Some(refines(&bh, json!(bh), 1, Some((1, 1)))), wir1_payload(1)), + REFINE, + pres(1, 2, 1), + Some(Reason::SessionLayerNotApplicable), + )); + v.push(one_layer( + "session_refines_on_a_base_capability", + "a WAI1 envelope of wai.video.int_hyper carrying refines, applied as a layer: refines on a capability that is not refinement-only", + wai1_of(HYPER, None, Some(refines(&bh, json!(bh), 1, Some((1, 1)))), wir1_payload(1)), + HYPER, + pres(1, 2, 1), + Some(Reason::SessionLayerNotApplicable), + )); + v.push(one_layer( + "session_layer_payload_units_short", + "a layer whose span covers two units, units 1 and 2, over a WIR1 payload of one unit (payload-malformed)", + wai1_of(REFINE, None, Some(refines(&bh, json!(bh), 1, Some((1, 2)))), wir1_payload(1)), + REFINE, + pres(1, 2, 1), + Some(Reason::SessionLayerNotApplicable), + )); + v.push(one_layer( + "session_layer_payload_not_wir1", + "a layer whose payload is a WIV1 clip, not WIR1 (payload-malformed)", + wai1_of(REFINE, None, Some(refines(&bh, json!(bh), 1, Some((1, 1)))), wiv1(1)), + REFINE, + pres(1, 2, 1), + Some(Reason::SessionLayerNotApplicable), + )); + for (name, about, runs, reason) in [ + ("session_refines_runs_short", "a layer 2 with no span whose prev runs sum to two units over a held base of four (refines-malformed, with the base)", json!([{ "producer": bh, "count": 1 }, { "producer": lh, "count": 1 }]), Some(Reason::SessionLayerNotApplicable)), + ("session_refines_runs_whole_accept", "a layer 2 with no span whose prev runs sum to the held base's four units, over a WIR1 payload of four", json!([{ "producer": bh, "count": 3 }, { "producer": lh, "count": 1 }]), None), + ] { + let l2 = wai1_of(REFINE, None, Some(refines(&bh, runs, 2, None)), wir1_payload(4)); + v.push(vector( + name, + about, + vec![base.clone(), span_layer.clone(), l2.clone()], + vec![dec(HYPER, None, &base, 0), dec(REFINE, None, &span_layer, 0), dec(REFINE, None, &l2, 0)], + and(four(0, 0), &[pres(1, 2, 1), pres(1, 3, 2)]), + reason, + )); + } + // A WAI2 manifest whose component id is not a string: the reader rejects the envelope. + { + let e = wai2_of(vec![component_of(HYPER, "b", None, None, wiv1(4), None)]); + let ml = u32::from_le_bytes([e[4], e[5], e[6], e[7]]) as usize; + let text = std::str::from_utf8(&e[8..8 + ml]).expect("a manifest").replacen("\"id\":\"b\"", "\"id\":5", 1); + let mut bad = b"WAI2".to_vec(); + bad.extend((text.len() as u32).to_le_bytes()); + bad.extend(text.as_bytes()); + bad.extend(&e[8 + ml..]); + v.push(vector( + "session_wai2_component_id_not_a_string", + "an entry decoding a rendition of a WAI2 envelope whose component id is the number 5, not a string: the manifest is malformed and the envelope unreadable", + vec![bad.clone()], + vec![dec(HYPER, Some(0), &bad, 0)], + four(0, 0), + Some(Reason::SessionEnvelopeUnreadable), + )); + } + // WAI2 refinement components that do not conform (SPEC §7.1). + for (name, about, comps) in [ + ( + "session_wai2_refines_on_a_rendition", + "a component of wai.video.int_refine carrying refines that is not marked a refinement", + vec![ + component_of(HYPER, "b", None, None, wiv1(4), None), + component_of(REFINE, "r", None, Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None), + ], + ), + ( + "session_wai2_refinement_identity_missing", + "a refinement component that states no sha256", + vec![component_of(HYPER, "b", None, None, wiv1(4), None), { + let mut r = component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None); + r.meta.sha256 = None; + r + }], + ), + ( + "session_wai2_refinement_prev_missing", + "a layer-2 refinement component whose prev names a component the envelope does not hold", + vec![ + component_of(HYPER, "b", None, None, wiv1(4), None), + component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("q"), 2, Some((1, 1)))), wir1_payload(1), None), + ], + ), + ( + "session_wai2_refinement_before_selectable", + "a refinement component followed by a selectable rendition", + vec![ + component_of(HYPER, "b", None, None, wiv1(4), None), + component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None), + component_of("wai.video.int_motion", "m", None, None, wiv1(4), None), + ], + ), + ] { + let e = wai2_of(comps); + let layers = if name == "session_wai2_refinement_prev_missing" { 3 } else { 2 }; + v.push(vector(name, about, vec![e.clone()], vec![dec(HYPER, Some(0), &e, 0), dec(REFINE, Some(1), &e, 0)], and(four(0, 0), &[pres(1, layers, 1)]), Some(Reason::SessionLayerNotApplicable))); } v } diff --git a/wai/wai-rs/src/claim_receipt/session.rs b/wai/wai-rs/src/claim_receipt/session.rs index 4191d68fa..4f0fe3961 100644 --- a/wai/wai-rs/src/claim_receipt/session.rs +++ b/wai/wai-rs/src/claim_receipt/session.rs @@ -781,14 +781,13 @@ pub fn payload_units(capability: &str, payload: &[u8]) -> Option { } /// The units a `WAI1` base's payload holds (§2.4.12, step 6 against the envelopes), read in -/// the payload's own format: the format pinned for the manifest's capability, or, where it -/// pins none, for its fallback, which decodes the same payload (SPEC §4 step 5). `None` -/// where neither pins a format, or the payload does not parse as it. +/// the payload's own format: of the formats pinned for the manifest's capability and its +/// fallback, which decodes the same payload (SPEC §4 step 5), the one whose magic the +/// payload starts with. `None` where neither pins a format the payload is in, or the +/// payload does not parse as it. pub fn base_units(capability: &str, fallback: Option<&str>, payload: &[u8]) -> Option { - if crate::codecs::pinned_int_payload(capability).is_some() { - return payload_units(capability, payload); - } - payload_units(fallback?, payload) + let own = |c: &&str| crate::codecs::pinned_int_payload(c).is_some_and(|m| payload.get(..4) == Some(&m[..])); + payload_units([Some(capability), fallback].into_iter().flatten().find(own)?, payload) } /// A well-formed `refines` with the units of its base where they are read (`n`): the @@ -950,19 +949,29 @@ impl ClaimReceipt { /// §7.1) whose payloads are plaintext (`session_envelope_unreadable`); one no entry /// names may be inert — encrypted (SPEC §6.4), or not an envelope at all — and is then /// a received object that is neither counted nor presented; - /// 4. each decoder entry whose object is one of them names what it gives — a rendition of - /// a `WAI2` envelope and that rendition's capability, or no rendition and a `WAI1` - /// envelope's capability or fallback — and each entry naming a rendition has its object - /// among the readable envelopes (`session_source_mismatch`); - /// 5. each decoder entry whose object is a held layer names one a sink can apply as its - /// `refines` states (staged-delivery §3, §4.1 steps 1–2): a `refines` that reads as §3 - /// defines it, present wherever the capability is refinement-only; a `WAI2` - /// component's `base` the id of a component of the same envelope; a base, where held, - /// that carries no `refines` and is not of a refinement-only capability; and, where - /// the base's units are read, a span within them and runs that sum to the units the - /// layer covers (`session_refines_malformed`); - /// 6. each decoder entry whose object is a held layer whose base a decoder entry names - /// has the `first_unit` of one of those entries (`session_first_unit_mismatch`); + /// 4. each decoder entry whose object is one of them names what it gives, as a sink + /// dispatches it — a rendition of a `WAI2` envelope and that rendition's capability, + /// a rendition selectable or a layer, whose payload matches its stated `sha256` + /// (SPEC §7.1, *Selection algorithm*); or no rendition and a `WAI1` envelope's + /// capability or fallback, dispatchable, of a manifest whose capability is not + /// companion-only (SPEC §4), where the envelope is not a layer — and each entry + /// naming a rendition has its object among the readable envelopes + /// (`session_source_mismatch`); + /// 5. each decoder entry whose object is a held layer — a `WAI1` envelope, or a `WAI2` + /// rendition, that carries `refines`, is a refinement, or is of a refinement-only + /// capability — names one a sink can apply (`session_layer_not_applicable`): of a + /// refinement-only capability with no fallback, its `refines` well formed + /// (staged-delivery §3, §4.1 step 1); a `WAI2` refinement conforming as SPEC §7.1 + /// states; its base, where held — a `WAI1` envelope by its content hash, or a `WAI2` + /// rendition by its component id or its exploded envelope's content hash, the same + /// object (staged-delivery §9) — a base whose capability the layer admits (§4.1 step + /// 4); where entries name the base, one decoding it through a capability the layer + /// admits, and the base's own where it is held, not its fallback (§4.1 step 3); where + /// the base's units are read, a span within them and runs that sum to those it covers + /// (§4.1 step 2); and a `WIR1` payload of its unit kind with a unit for each it + /// covers, where that count is read (§4.1 step 6); + /// 6. each decoder entry whose object is a held layer whose base entries name has the + /// `first_unit` of one of the entries it is applied over (`session_first_unit_mismatch`); /// 7. with the presentations, each one through an entry whose envelope is held is at the /// layer count that envelope gives: 1 for a base, or a rendition with no `refines`, /// and `refines.layer + 1` for a layer (`session_layers_mismatch`); @@ -1009,9 +1018,25 @@ impl ClaimReceipt { }; let mut read: Vec<([u8; 32], Read)> = Vec::new(); let mut inert: Vec<[u8; 32]> = Vec::new(); + // Each rendition of a readable WAI2 envelope is also its exploded envelope (SPEC + // §7.1), the same object (staged-delivery §9): (the exploded envelope's content + // hash, the envelope's, the rendition). + let mut exploded: Vec<([u8; 32], [u8; 32], u64)> = Vec::new(); for bytes in envelopes { match read_one(bytes) { - Some(r) => read.push((hash(bytes), r)), + Some(r) => { + let h = hash(bytes); + if matches!(r, Read::Multi(_)) + && let Ok(each) = WaiMulti::explode_each(bytes) + { + for (j, e) in each.into_iter().enumerate() { + if let Ok(e) = e { + exploded.push((hash(&e), h, j as u64)); + } + } + } + read.push((h, r)); + } None => inert.push(hash(bytes)), } } @@ -1020,94 +1045,165 @@ impl ClaimReceipt { return Err(Rejection::at(6, Reason::SessionEnvelopeUnreadable)); } let held = |object: &[u8; 32]| read.iter().find(|(h, _)| h == object).map(|(_, r)| r); - // 4. Each entry names what its envelope gives. + let refinement_only = crate::codecs::is_refinement_only; + // A rendition that is a layer: it carries `refines`, is marked a refinement, or is of + // a refinement-only capability; likewise a WAI1 manifest. + let layer_entry = |m: &crate::container::RenditionMeta| m.refines.is_some() || m.is_refinement() || refinement_only(&m.capability); + let layer_one = |w: &Wai| w.manifest.refines.is_some() || refinement_only(w.capability()); + // 4. Each entry names what its envelope gives, as a sink dispatches it. for d in &s.decoders { let gives = match held(&d.object) { - Some(Read::Multi(w)) => usize::try_from(d.rendition.unwrap_or(u64::MAX)) - .ok() - .and_then(|r| w.manifest.renditions.get(r)) - .is_some_and(|m| m.capability == d.capability), - Some(Read::One(w)) => d.rendition.is_none() && (w.capability() == d.capability || w.fallback() == Some(d.capability.as_str())), + Some(Read::Multi(w)) => usize::try_from(d.rendition.unwrap_or(u64::MAX)).ok().is_some_and(|i| { + w.manifest.renditions.get(i).is_some_and(|m| { + m.capability == d.capability && (m.is_selectable() || layer_entry(m)) && m.payload_digest_matches(&w.renditions[i]) + }) + }), + Some(Read::One(w)) => { + d.rendition.is_none() + && (w.capability() == d.capability || w.fallback() == Some(d.capability.as_str())) + && (layer_one(w) || (crate::codecs::is_dispatchable(&d.capability) && !crate::codecs::is_companion_only(w.capability()))) + } None => d.rendition.is_none(), }; if !gives { return Err(Rejection::at(6, Reason::SessionSourceMismatch)); } } - // What an entry's held envelope is: a base, with the units its payload holds where - // WAI reads them, or a layer — its count, the units it covers relative to the - // entry's first unit where they are read, and the base it refines (the base's - // content hash and, in a `WAI2` envelope, its rendition) — or a layer a sink - // cannot apply. - enum Gives { - Base(Option), - Layer { layers: u64, span: Option<(u64, u64)>, base: ([u8; 32], Option) }, - Malformed, + // A base: its own capability, the units its payload holds where WAI reads them, and + // whether it is one (a base rendition, not a layer). + struct Base { + capability: String, + units: Option, + is_base: bool, } - // A `WAI1` layer's base is matched by its content hash, a `WAI2` one's by its - // envelope and rendition. - let layer_of = |r: &Refines, n: Option, base: ([u8; 32], Option)| -> Gives { - match layer_of_refines(r, n) { - Ok((layers, span)) => Gives::Layer { layers, span, base }, - Err(()) => Gives::Malformed, + let component = |w: &WaiMulti, j: usize| -> Base { + let m = &w.manifest.renditions[j]; + Base { capability: m.capability.clone(), units: payload_units(&m.capability, &w.renditions[j]), is_base: m.is_selectable() && m.refines.is_none() } + }; + // The base a layer names, where held: a WAI1 envelope by its content hash, or a WAI2 + // rendition, by its exploded envelope's content hash or by its envelope and index. + let base_by_hash = |h: &[u8; 32]| -> Option { + if let Some(Read::One(b)) = held(h) { + return Some(Base { + capability: b.capability().to_string(), + units: base_units(b.capability(), b.fallback(), &b.payload), + is_base: !layer_one(b), + }); + } + let &(_, w, j) = exploded.iter().find(|(x, ..)| x == h)?; + match held(&w)? { + Read::Multi(m) => Some(component(m, j as usize)), + Read::One(_) => None, } }; + // The names of a base: its content hashes (a WAI1 base's, a rendition's exploded + // envelope's) and its (envelope, rendition) pairs. + let names_of = |hash_form: Option<[u8; 32]>, pair: Option<([u8; 32], u64)>| -> (Vec<[u8; 32]>, Vec<([u8; 32], u64)>) { + let mut hashes: Vec<[u8; 32]> = hash_form.into_iter().collect(); + let mut pairs: Vec<([u8; 32], u64)> = pair.into_iter().collect(); + for &(x, w, j) in &exploded { + if hash_form == Some(x) { + pairs.push((w, j)); + } + if pair == Some((w, j)) { + hashes.push(x); + } + } + (hashes, pairs) + }; + // What an entry's held envelope is. + enum Gives { + Base(Option), + Layer { layers: u64, span: Option<(u64, u64)>, first_units: Vec }, + NotApplicable, + } + // A layer of capability `cap` over the base `b` (where held) named by `names`, with + // `r` its refines and `payload` its WIR1 payload: what a sink applies, or nothing. + let layer_of = |cap: &str, r: &Refines, b: Option, names: (Vec<[u8; 32]>, Vec<([u8; 32], u64)>), payload: &[u8]| -> Gives { + let n = match &b { + Some(b) if !b.is_base || !crate::codecs::admits(cap, &b.capability) => return Gives::NotApplicable, + Some(b) => b.units, + None => None, + }; + // The entries naming the base, and those a sink applies the layer over: through + // a capability the layer admits, and the base's own where it is held. + let (hashes, pairs) = names; + let naming: Vec<&DecoderEntry> = s + .decoders + .iter() + .filter(|e| hashes.contains(&e.object) || e.rendition.is_some_and(|j| pairs.contains(&(e.object, j)))) + .collect(); + let over: Vec = naming + .iter() + .filter(|e| crate::codecs::admits(cap, &e.capability) && b.as_ref().is_none_or(|b| e.capability == b.capability)) + .map(|e| e.first_unit) + .collect(); + if !naming.is_empty() && over.is_empty() { + return Gives::NotApplicable; + } + let Ok((layers, span)) = layer_of_refines(r, n) else { return Gives::NotApplicable }; + // Its payload parses as WIR1 for its unit kind, with a unit for each it covers. + let Some(kind) = crate::staged::unit_kind(cap) else { return Gives::NotApplicable }; + let Ok(p) = crate::staged::wir1::parse(payload, kind) else { return Gives::NotApplicable }; + if span.is_some_and(|(_, count)| u64::from(p.n_units) != count) { + return Gives::NotApplicable; + } + Gives::Layer { layers, span, first_units: over } + }; let gives = |d: &DecoderEntry| -> Option { - let refinement_only = crate::codecs::is_refinement_only; match held(&d.object)? { - Read::One(w) => match w.refines() { - None if refinement_only(w.capability()) => Some(Gives::Malformed), - None => Some(Gives::Base(base_units(w.capability(), w.fallback(), &w.payload))), - Some(Err(_)) => Some(Gives::Malformed), - Some(Ok(r)) => { - let Some(base) = unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok()) else { return Some(Gives::Malformed) }; - // The base, where held: a base, its units read where WAI reads them. - let n = match held(&base) { - Some(Read::One(b)) => { - if b.manifest.refines.is_some() || refinement_only(b.capability()) { - return Some(Gives::Malformed); - } - base_units(b.capability(), b.fallback(), &b.payload) - } - _ => None, - }; - Some(layer_of(&r, n, (base, None))) + Read::One(w) => { + if !layer_one(w) { + return Some(Gives::Base(base_units(w.capability(), w.fallback(), &w.payload))); } - }, + let Some(Ok(r)) = w.refines() else { return Some(Gives::NotApplicable) }; + if !refinement_only(w.capability()) || w.fallback().is_some() { + return Some(Gives::NotApplicable); + } + let base = unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok())?; + Some(layer_of(w.capability(), &r, base_by_hash(&base), names_of(Some(base), None), &w.payload)) + } Read::Multi(w) => { let i = usize::try_from(d.rendition?).ok()?; - let m = w.manifest.renditions.get(i)?; - match m.refines.as_ref() { - None if refinement_only(&m.capability) => Some(Gives::Malformed), - None => Some(Gives::Base(payload_units(&m.capability, &w.renditions[i]))), - Some(v) => { - let Ok(r) = Refines::from_value(v, RefForm::ComponentId) else { return Some(Gives::Malformed) }; - let Some(j) = w.manifest.renditions.iter().position(|e| e.id.as_deref() == Some(r.base.as_str())) else { - return Some(Gives::Malformed); - }; - let b = &w.manifest.renditions[j]; - if b.refines.is_some() || refinement_only(&b.capability) { - return Some(Gives::Malformed); - } - let n = payload_units(&b.capability, &w.renditions[j]); - Some(layer_of(&r, n, (d.object, Some(j as u64)))) - } + let rs = &w.manifest.renditions; + let m = rs.get(i)?; + if !layer_entry(m) { + return Some(Gives::Base(payload_units(&m.capability, &w.renditions[i]))); } + // SPEC §7.1, *Refinement components*: a refinement conforms only if its + // capability is refinement-only, it carries id and sha256, its refines is + // well formed, its base is a selectable rendition carrying both, every + // producer a selectable rendition or a refinement before it carrying + // both, and no selectable rendition follows it. + let identified = |e: &crate::container::RenditionMeta| e.id.is_some() && e.sha256.is_some(); + let Some(v) = m.refines.as_ref() else { return Some(Gives::NotApplicable) }; + let Ok(r) = Refines::from_value(v, RefForm::ComponentId) else { return Some(Gives::NotApplicable) }; + let by_id = |id: &str| rs.iter().position(|e| e.id.as_deref() == Some(id)); + let conforms = m.is_refinement() + && refinement_only(&m.capability) + && identified(m) + && by_id(&r.base).is_some_and(|j| rs[j].is_selectable() && identified(&rs[j])) + && r.producers().all(|p| by_id(p).is_some_and(|j| (rs[j].is_selectable() || (j < i && rs[j].is_refinement())) && identified(&rs[j]))) + && !rs[i + 1..].iter().any(|e| e.is_selectable()); + if !conforms { + return Some(Gives::NotApplicable); + } + let j = by_id(&r.base)?; + Some(layer_of(&m.capability, &r, Some(component(w, j)), names_of(None, Some((d.object, j as u64))), &w.renditions[i])) } } }; // 5. A held layer an entry names is one a sink can apply. - if s.decoders.iter().any(|d| matches!(gives(d), Some(Gives::Malformed))) { - return Err(Rejection::at(6, Reason::SessionRefinesMalformed)); + if s.decoders.iter().any(|d| matches!(gives(d), Some(Gives::NotApplicable))) { + return Err(Rejection::at(6, Reason::SessionLayerNotApplicable)); } - // 6. A held layer's entry has the first unit of an entry naming its base. + // 6. A held layer's entry has the first unit of an entry it is applied over. for d in &s.decoders { - if let Some(Gives::Layer { base: (object, rendition), .. }) = gives(d) { - let bases: Vec = - s.decoders.iter().filter(|e| e.object == object && (rendition.is_none() || e.rendition == rendition)).map(|e| e.first_unit).collect(); - if !bases.is_empty() && !bases.contains(&d.first_unit) { - return Err(Rejection::at(6, Reason::SessionFirstUnitMismatch)); - } + if let Some(Gives::Layer { first_units, .. }) = gives(d) + && !first_units.is_empty() + && !first_units.contains(&d.first_unit) + { + return Err(Rejection::at(6, Reason::SessionFirstUnitMismatch)); } } if let Some(ps) = outputs { -- 2.54.0 (Apple Git-157) From 59b37a9f8ba0661bee65b1883c6ef77b7018d93a Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 23:28:17 -0400 Subject: [PATCH 09/21] wai: a vector tying a layer to its base decoded through its capability, not its fallback Co-Authored-By: Claude Opus 5.5 --- wai/claim-conformance/README.md | 2 +- wai/claim-conformance/vectors.json | 93 +++++++++++++++++++ wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 13 +++ 4 files changed, 108 insertions(+), 2 deletions(-) diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 0b6749cc4..09221f997 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -297,7 +297,7 @@ with neither is a hole; there is none. | staged-delivery §3, §4.1 step 2 | with the base: a span outside its units, runs that do not sum to the units covered | rule 5 | `session_refines_span_past_base`, `session_wai2_refines_span_past_base`, `session_refines_runs_short`; accepted: `session_refines_runs_whole_accept` | | §4.1 step 1 | `capability-not-refinement`: a layer not of a refinement-only capability, or with a fallback | rule 5 | `session_layer_with_fallback`, `session_refines_on_a_base_capability` | | §4.1 step 2 | `base-absent`: no base decoded with the content hash `refines.base` | where the base is held and is a layer, rule 5; otherwise the signer's statement | `session_refines_base_is_a_layer`, `session_wai2_refines_base_is_a_refinement` | -| §4.1 step 3 | `base-via-fallback` | rule 5 (applied over an entry decoding the base through its own capability); rule 6 ties the layer only to such entries | `session_layer_base_via_fallback` | +| §4.1 step 3 | `base-via-fallback` | rule 5 (applied over an entry decoding the base through its own capability); rule 6 ties the layer only to such entries | `session_layer_base_via_fallback`, `session_layer_tied_to_its_base_not_the_fallback` | | §4.1 step 4 | `base-not-admitted` (SPEC §5, *Base admission*) | rule 5 | `session_layer_base_not_admitted`, `session_wai2_layer_base_not_admitted` | | §4.1 step 5 | `refinement-unattested` | the signer's statement: no context carries a delivery receipt | — | | §4.1 step 6 | `payload-malformed`: the payload does not parse, or holds another number of units than the layer covers | rule 5, where the count of units covered is read | `session_layer_payload_not_wir1`, `session_layer_payload_units_short` | diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index 9088bdb62..ebecfca36 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -10650,6 +10650,99 @@ "reason": "session_layer_not_applicable" } }, + { + "name": "session_layer_tied_to_its_base_not_the_fallback", + "about": "the same base decoded twice, through its capability at first_unit 0 and through its fallback at 10, and the layer at 10: a sink applies the layer only over the base decoded through its capability, so the layer's first unit is 0", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":982,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":10,\"leaves\":4,\"module_status\":null,\"object\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":10,\"leaves\":1,\"module_status\":null,\"object\":\"5735ccd5eea133f5562f514abf4f81c1e5aadd47b48caea8c1e4dbf2da8d50ad\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":9,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"8059a2f9b0cc375ef348c4311ffc9f7b45c8af28169c5cc13e38679c56ace217\",\"primary_units\":8,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":982,\"uncounted\":0,\"units\":8},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"982f7bda2948557dfc12b4d28277ba6cdac4edac8005905013c1e2cb7670b3e0e8eee8d799ff3d40d03011743d8e515e7a55a799f4b1454ed88a19d79477590c\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 10, + "layers": 1, + "decoder": 1, + "out_digest": "23851d2c5e0cc5365e329fbd9c01238313ac71fd4edb4730fa7d58cc74e74823" + }, + { + "unit": 11, + "layers": 1, + "decoder": 1, + "out_digest": "66270813e69c6cffbacb67f95a9c182b2f04ce8c3b2ee4829c257227a5f4a17a" + }, + { + "unit": 12, + "layers": 1, + "decoder": 1, + "out_digest": "47c089823c210a1989895087dc4d44dc5ed8ee0453d7f2517ccce83cb686c824" + }, + { + "unit": 13, + "layers": 1, + "decoder": 1, + "out_digest": "3a1e42600a46cf28926fc9f03946a3186264cef938e207b9e159591c179fa7ed" + }, + { + "unit": 11, + "layers": 2, + "decoder": 2, + "out_digest": "63ccabbcf04666fa294b9639cebbab4b9202f4dbb0db498e7946b388de3f6c8a" + } + ], + "objects": [ + { + "content_hash": "3296e1d8d0e4e4a167a8026ff77bd68d609b9725a29eb5d316dad74915b2f44c", + "path": "primary", + "counted": 355, + "transferred": 355, + "presented": true + }, + { + "content_hash": "5735ccd5eea133f5562f514abf4f81c1e5aadd47b48caea8c1e4dbf2da8d50ad", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931b30000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c2266616c6c6261636b223a227761692e766964656f2e617631227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2233323936653164386430653465346131363761383032366666373762643638643630396239373235613239656235643331366461643734393135623266343463222c2270726576223a2233323936653164386430653465346131363761383032366666373762643638643630396239373235613239656235643331366461643734393135623266343463222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, { "name": "session_layer_base_not_admitted", "about": "a wai.image.int_refine layer over a wai.video.int_hyper base, which it does not admit", diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index cac1daa24..d54c212cc 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -3500,7 +3500,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 525 + 526 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index 9775a4a1e..3248ad00f 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -2118,6 +2118,19 @@ fn sweep_vectors() -> Vec { and(four(0, 0), &[pres(1, 2, 1)]), Some(Reason::SessionLayerNotApplicable), )); + v.push(vector( + "session_layer_tied_to_its_base_not_the_fallback", + "the same base decoded twice, through its capability at first_unit 0 and through its fallback at 10, and the layer at 10: a sink applies the layer only over the base decoded through its capability, so the layer's first unit is 0", + vec![b.clone(), l.clone()], + vec![dec(HYPER, None, &b, 0), dec("wai.video.av1", None, &b, 10), dec(REFINE, None, &l, 10)], + { + let mut ps = four(0, 0); + ps.extend(four(10, 1)); + ps.push(pres(11, 2, 2)); + ps + }, + Some(Reason::SessionFirstUnitMismatch), + )); let base = base_envelope(); let img = wai1_of("wai.image.int_refine", None, Some(refines(&hx(&base), json!(hx(&base)), 1, Some((1, 1)))), wir1_payload(1)); v.push(vector( -- 2.54.0 (Apple Git-157) From 6ac671e8316469134ceb59741c32ef89163b821c Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Wed, 7 Oct 2026 23:30:23 -0400 Subject: [PATCH 10/21] wai: a vector for base admission where no entry names the base The round-5 falsification found no vector that reached the held base's own admission alone: with an entry naming the base, the applied-over check refuses first. session_layer_base_not_admitted_unnamed does. Co-Authored-By: Claude Opus 5.5 --- wai/claim-conformance/README.md | 2 +- wai/claim-conformance/vectors.json | 45 +++++++++++++++++++ wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 8 ++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 09221f997..2ac6bbbfa 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -298,7 +298,7 @@ with neither is a hole; there is none. | §4.1 step 1 | `capability-not-refinement`: a layer not of a refinement-only capability, or with a fallback | rule 5 | `session_layer_with_fallback`, `session_refines_on_a_base_capability` | | §4.1 step 2 | `base-absent`: no base decoded with the content hash `refines.base` | where the base is held and is a layer, rule 5; otherwise the signer's statement | `session_refines_base_is_a_layer`, `session_wai2_refines_base_is_a_refinement` | | §4.1 step 3 | `base-via-fallback` | rule 5 (applied over an entry decoding the base through its own capability); rule 6 ties the layer only to such entries | `session_layer_base_via_fallback`, `session_layer_tied_to_its_base_not_the_fallback` | -| §4.1 step 4 | `base-not-admitted` (SPEC §5, *Base admission*) | rule 5 | `session_layer_base_not_admitted`, `session_wai2_layer_base_not_admitted` | +| §4.1 step 4 | `base-not-admitted` (SPEC §5, *Base admission*) | rule 5 | `session_layer_base_not_admitted`, `session_layer_base_not_admitted_unnamed`, `session_wai2_layer_base_not_admitted` | | §4.1 step 5 | `refinement-unattested` | the signer's statement: no context carries a delivery receipt | — | | §4.1 step 6 | `payload-malformed`: the payload does not parse, or holds another number of units than the layer covers | rule 5, where the count of units covered is read | `session_layer_payload_not_wir1`, `session_layer_payload_units_short` | | §4.1 step 6 | `payload-malformed` for a stream that does not decode canonically; `cost-over-limit`; `chain-over-limit` | the signer's statement; a re-decode of a byte-exact presentation checks its output | — | diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index ebecfca36..9a6b3221e 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -10812,6 +10812,51 @@ "reason": "session_layer_not_applicable" } }, + { + "name": "session_layer_base_not_admitted_unnamed", + "about": "the wai.image.int_refine layer over the held wai.video.int_hyper base, with no entry naming the base: the held base's own capability is not one the layer admits", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":328,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.image.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"7edebf4f16ff78e3f9a4220c67caae3449117047661109202747890f3d074ea2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":1,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"c35c3cad65f30e45a3bbf8a45226d984960550b0c4643907508bebdca411a899\",\"primary_units\":1,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":1},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bef3757b0da1ac21630bb169baf16fa7c1774d54a8ca47aab4e7cdc3ed0c6e970c51e4a45ec1d92bd12bbfb00e393e4b3f13b512ea3b09f7c805a95cca160f0b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 1, + "layers": 2, + "decoder": 0, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": false + }, + { + "content_hash": "7edebf4f16ff78e3f9a4220c67caae3449117047661109202747890f3d074ea2", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e696d6167652e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, { "name": "session_wai2_layer_base_not_admitted", "about": "a WAI2 refinement component of wai.video.int_refine over a wai.audio.int_codec base component", diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index d54c212cc..ed4e09743 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -3500,7 +3500,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 526 + 527 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index 3248ad00f..b60fb7953 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -2141,6 +2141,14 @@ fn sweep_vectors() -> Vec { and(four(0, 0), &[pres(1, 2, 1)]), Some(Reason::SessionLayerNotApplicable), )); + v.push(vector( + "session_layer_base_not_admitted_unnamed", + "the wai.image.int_refine layer over the held wai.video.int_hyper base, with no entry naming the base: the held base's own capability is not one the layer admits", + vec![base.clone(), img.clone()], + vec![dec("wai.image.int_refine", None, &img, 0)], + vec![pres(1, 2, 0)], + Some(Reason::SessionLayerNotApplicable), + )); let audio = wai2_of(vec![ component_of("wai.audio.int_codec", "b", None, None, wiv1(4), None), component_of(REFINE, "r", Some("refinement"), Some(refines("b", json!("b"), 1, Some((1, 1)))), wir1_payload(1), None), -- 2.54.0 (Apple Git-157) From 37fe5dc39b1b69006406e8b0938b351251f4e471 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 00:18:54 -0400 Subject: [PATCH 11/21] =?UTF-8?q?wai:=20one=20verdict=20for=20either=20nam?= =?UTF-8?q?e,=20layers=20by=20capability,=20a=20key=20holder's=20session,?= =?UTF-8?q?=20=C2=A77.1's=20offer=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §2.4.12, against the envelopes: - An entry naming a held WAI2 rendition by its exploded envelope's content hash, with no rendition, is read as naming the rendition by rules 4-8 (it skipped them before); the exploded envelope's own bytes, held, are a separate delivery, read as the WAI1 they are. - A manifest or rendition is a layer only when its capability is refinement-only; any other is a base and a refines it carries is ignored, as dispatch, selection and staged::decode_base already treat it. wai stage apply routes by capability. The stray-refines bases X1-X3 now accept. - An encrypted envelope an entry names is admitted by rule 3: a sink holding its key decrypts and dispatches it (SPEC §6.4 step 3), so what the entry states of it is the signer's statement. session_envelope_encrypted (index 390, outside the pinned prefix) now rejects only for the classical length the verifier cannot read; session_envelope_encrypted_named_accept accepts. - Rule 5 offers a WAI2 refinement only from an envelope every component of which conforms, as SPEC §7.1 now states the reference sink's rule: check_component_roles moves to ManifestV2, the HTTP session applies an envelope's refinements only when it passes, and wai stage explode refuses a refinement of an envelope that does not. claim_verify.py ports the whole check; a differential sweep over every registered capability as a companion confirms the two agree. Vectors for Y1, Y2, Y5, Y7 (entries by exploded hash), X1-X3 (accepted), X4 exploded and X4b delivered alone, F1, F2, G1, two companion-and-refinement accepts, and S1/S2 (a span past the base with the payload's count right). 545 vectors; the pinned prefix unchanged. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 15 + wai/SPEC.md | 21 +- wai/claim-conformance/README.md | 34 +- wai/claim-conformance/claim_verify.py | 219 +++- wai/claim-conformance/differential.py | 72 +- wai/claim-conformance/vectors.json | 1111 ++++++++++++++++- wai/extensions/jwp-receipts.md | 51 +- wai/extensions/staged-delivery.md | 6 +- wai/wai-rs/src/bin/wai_cli/stage.rs | 13 +- wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 242 +++- wai/wai-rs/src/claim_receipt/session.rs | 135 +- wai/wai-rs/src/container.rs | 357 +++--- wai/wai-rs/src/http_binding/session.rs | 8 +- 14 files changed, 1967 insertions(+), 319 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index b9ae4fff0..df48dc820 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -88,6 +88,21 @@ wire format may change and such changes are recorded here. a rendition or refinement whose payload does not match its `sha256`, a capability that is not dispatchable, or the fallback of a `WAI1` whose capability is companion-only (`session_source_mismatch`). +- **One verdict for either name, by capability, and for a key holder** (§2.4.12). An entry + naming a `WAI2` rendition by its exploded envelope's content hash, with only the `WAI2` + held, is read as naming the rendition by rules 4–8; the exploded envelope's own bytes, + held, are a separate delivery. A manifest or rendition is a layer only when its + capability is refinement-only: a base carrying a stray `refines` is a base, as + dispatch and selection already treat it (SPEC §4, staged-delivery §3), and `wai stage + apply` now routes by capability. An encrypted envelope an entry names is accepted — + a sink holding its key decrypts and dispatches it (SPEC §6.4 step 3) — and what the + entry states of it is the signer's statement. +- **A WAI2 offers its refinements only when every component conforms** (SPEC §7.1, + *Selection*). The text now states the reference sink's rule: an envelope one of whose + components breaks a rule of §7.1 or §5 (`check_component_roles`, now on `ManifestV2`) + offers none of its refinements, and may still present the rendition it picked. The + HTTP session's applied components and `wai stage explode` follow it; rule 5 matches it + for the whole envelope. - **Every refusal accounted for.** The claim-conformance README's table lists each refusal a sink makes that decides whether a presentation can happen — staged-delivery §3, §4.1, §4.3–§4.5, §9; SPEC §4, §5, §7.1 — with the §2.4.12 rule and vector that diff --git a/wai/SPEC.md b/wai/SPEC.md index 83ab61760..7e0ebff11 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -422,8 +422,12 @@ payload is companion data, so step 5 is not taken either (§5). A WAI **payload always corresponds to exactly one capability**. v1.0 does not support multi-codec multiplexed payloads. -A sink never takes step 3 or step 5 with a capability §5 registers as -**refinement-only**, and a `WAI1` whose `cap` is refinement-only takes neither: +Dispatch goes by `cap`: a `WAI1` whose `cap` is not refinement-only is dispatched as +above whatever else its manifest carries, a `refines` member included, which such a +manifest MUST NOT carry and a sink ignores +([staged-delivery](extensions/staged-delivery.md) §3). A sink never takes step 3 or +step 5 with a capability §5 registers as **refinement-only**, and a `WAI1` whose `cap` +is refinement-only takes neither: its payload refines the output of a base, and [staged-delivery](extensions/staged-delivery.md) §4 processes it. A sink that does not implement that extension finds the capability unsupported, and the envelope is @@ -1859,8 +1863,17 @@ component*, above), so it is the same object as the layer carried on its own. - **Selection.** Selection never picks one (step 2: it is not selectable). A sink picks a rendition as above, then offers to staged-delivery §4, in `renditions` order, the exploded envelopes of the refinements whose `refines.base` is the picked - entry's `id`, up to the stage its deployer policy chooses. A refinement whose - payload does not match its `sha256` is not offered. + entry's `id`, up to the stage its deployer policy chooses. It offers them only from + an envelope every component of which conforms — each refinement below, each + companion (*Companion components*), each `id` (*Component identity*) and each + capability in the role §5 gives it (the reference `WaiMulti::check_component_roles`, + which reads the manifest alone): an envelope one component of which breaks a rule + offers none of its refinements. It MAY still present the rendition it picked. A + refinement whose payload does not match its `sha256` is not offered. A refinement's + exploded envelope a sink receives on its own, as a `WAI1` object + ([staged-delivery](extensions/staged-delivery.md) §9), is a separate delivery, which + staged-delivery §4 processes as any layer, whatever the envelope it was exploded + from. - **Conformance.** A refinement component conforms only if, in this order: its capability is refinement-only (§5); it carries `id` and `sha256`; its `refines` is well formed (staged-delivery §3, with ids in place of hashes); `refines.base` diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 2ac6bbbfa..845aff5b4 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -206,7 +206,10 @@ The vectors cover: `record_budget`, its envelopes and the `stage` claim of each epoch as the sink's observer states them), naming both epochs' claims and only the first's; the base fetched twice and listed once; an encrypted `WAI2` envelope received and named by no - entry, uncounted, and inert bytes no entry names; a session holding its base's and a + entry, uncounted, and one named by an entry, decoded by a sink holding its key; inert + bytes no entry names; entries naming a `WAI2` rendition by its exploded envelope's + content hash; bases carrying a stray `refines`; refinements beside a conforming + companion; a session holding its base's and a layer's envelopes, and a layer with no span through which a unit of its base is presented, with its base held and not; output trees of 1 to 33 leaves, half through a @@ -246,9 +249,10 @@ The vectors cover: envelope gives (`session_counted_mismatch`); an object listed twice (`session_object_duplicate`); an object a decoder entry names marked not presented, and one no entry names marked presented, the sums restated to agree - (`session_presented_mismatch`); an encrypted envelope, a `WAI1` envelope with no - manifest members and bytes of neither magic, each named by an entry - (`session_envelope_unreadable`); a held inert envelope listed with counted bytes 0 + (`session_presented_mismatch`); a `WAI1` envelope with no manifest members and bytes + of neither magic, each named by an entry (`session_envelope_unreadable`), and an + encrypted envelope named by one, whose plaintext's classical length the verifier + cannot read (`session_classical_mismatch`); a held inert envelope listed with counted bytes 0 (`session_counted_mismatch`); entries a sink cannot have decoded through — a `WAI2` companion, a rendition or refinement whose payload does not match its `sha256`, a `WAI1` whose capability is companion-only, a fallback that is @@ -293,9 +297,10 @@ with neither is a hole; there is none. | source | refusal | §2.4.12 | vectors | |---|---|---|---| | staged-delivery §3 | `refines` malformed: member types and ranges, `prev`'s forms, adjacent runs of one producer, an array of one run, a producer other than `base` at layer 1, runs that do not sum to the span | rule 5, `session_layer_not_applicable` | `session_refines_layer_zero`, `session_refines_span_empty`, `session_wai2_refines_id_malformed` | -| staged-delivery §3 | `refines` absent on a refinement-only capability, present on one that is not | rule 5 | `session_refines_absent`, `session_refines_on_a_base_capability`, `session_wai2_refines_on_a_rendition` | -| staged-delivery §3, §4.1 step 2 | with the base: a span outside its units, runs that do not sum to the units covered | rule 5 | `session_refines_span_past_base`, `session_wai2_refines_span_past_base`, `session_refines_runs_short`; accepted: `session_refines_runs_whole_accept` | -| §4.1 step 1 | `capability-not-refinement`: a layer not of a refinement-only capability, or with a fallback | rule 5 | `session_layer_with_fallback`, `session_refines_on_a_base_capability` | +| staged-delivery §3 | `refines` absent on a refinement-only capability | rule 5 | `session_refines_absent` | +| staged-delivery §3, SPEC §4 | `refines` on a manifest or rendition whose capability is not refinement-only: a sink routes by capability, so it is a base and the `refines` is ignored (in a `WAI2`, a broken component: no refinement of that envelope is offered) | rules 4 and 7 read it as a base | accepted: `session_stray_refines_base_accept`, `session_stray_refines_layer_over_it_accept`, `session_stray_refines_wai2_rendition_accept`; refused: `session_refines_on_a_base_capability` (at two layers, `session_layers_mismatch`), `session_wai2_refines_on_a_rendition` | +| staged-delivery §3, §4.1 step 2 | with the base: a span outside its units, runs that do not sum to the units covered | rule 5 | `session_refines_span_past_base_alone`, `session_wai2_refines_span_past_base_alone` (the payload's count right, so the span check alone decides), `session_refines_span_past_base`, `session_wai2_refines_span_past_base`, `session_refines_runs_short`; accepted: `session_refines_runs_whole_accept` | +| §4.1 step 1 | `capability-not-refinement`: a layer with a fallback (an envelope of any other capability is a base, the row above) | rule 5 | `session_layer_with_fallback` | | §4.1 step 2 | `base-absent`: no base decoded with the content hash `refines.base` | where the base is held and is a layer, rule 5; otherwise the signer's statement | `session_refines_base_is_a_layer`, `session_wai2_refines_base_is_a_refinement` | | §4.1 step 3 | `base-via-fallback` | rule 5 (applied over an entry decoding the base through its own capability); rule 6 ties the layer only to such entries | `session_layer_base_via_fallback`, `session_layer_tied_to_its_base_not_the_fallback` | | §4.1 step 4 | `base-not-admitted` (SPEC §5, *Base admission*) | rule 5 | `session_layer_base_not_admitted`, `session_layer_base_not_admitted_unnamed`, `session_wai2_layer_base_not_admitted` | @@ -305,18 +310,18 @@ with neither is a hole; there is none. | §4.1 steps 7–10 | `layer-conflict`, `prev-mismatch`, `layer-gap`, `geometry-mismatch`, `deadline-missed` | the signer's statement; rules 7 and 8 bound a layer's presentations to its count and units, and the `stage` claims the stages a unit reached | `session_layers_past_the_object`, `session_unit_outside_span`, `session_stage_beyond_applied` | | §4.1, after step 10 | a unit presented from a layer that failed for it | rules 7 and 8 | as above | | §4.3–§4.5 | the hold bound, batches, the chain budget for a base | the signer's statement | — | -| staged-delivery §9 | a `WAI2` component and its exploded envelope are one object | rules 5, 6 and 8 read a base in either form | `session_alias_layer_on_component_accept`, `session_alias_layer_first_unit_not_its_base`, `session_alias_layer_unit_past_the_base`, `session_alias_exploded_held_first_unit`, `session_alias_component_layer_named_as_exploded` | +| staged-delivery §9 | a `WAI2` component and its exploded envelope are one object | rules 5, 6 and 8 read a base in either form, and rules 4–8 read an entry naming a rendition by its exploded envelope's content hash, with only the `WAI2` held, as naming the rendition; the exploded envelope's own bytes, held, are a separate delivery | `session_alias_layer_on_component_accept`, `session_alias_layer_first_unit_not_its_base`, `session_alias_layer_unit_past_the_base`, `session_alias_exploded_held_first_unit`, `session_alias_component_layer_named_as_exploded`, `session_alias_entry_accept`, `session_alias_entry_relabelled`, `session_alias_entry_unit_past_the_base`, `session_alias_refinement_entry_first_unit`, `session_alias_refinement_entry_not_admitted`; a separate delivery: `session_roles_exploded_layer_delivered_alone_accept` | | SPEC §4 steps 3, 5 | a `WAI1` decoded through its `capability`, else its `fallback`, and nothing else | rule 4, `session_source_mismatch` | `session_relabel_wai1_base`, `session_relabel_av1` | | SPEC §4 | a capability that is not dispatchable never taken; a `WAI1` whose capability is companion-only inert, its fallback never taken | rule 4 | `session_wai1_fallback_not_dispatchable`, `session_wai1_companion_only_capability` | | SPEC §4 step 5 | the fallback decodes the same payload | rule 8 reads the units in the payload's own format | `session_unit_fallback_past_the_title`, `session_unit_fallback_format_past_the_title`, `session_unit_fallback_format_audio`; accepted: `session_unit_fallback_accept`, `session_unit_fallback_format_accept` | | SPEC §3.1, §4 | a pin that does not resolve, a module not held, a key log's revocation | the signer's statement, which a decoder entry's `pin` and `tier` state | — | -| SPEC §6.4 | an encrypted envelope is inert | rule 3, `session_envelope_unreadable`, where an entry names it | `session_envelope_encrypted` | +| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3) | rule 3 admits an entry naming it; what the entry states of it is the signer's statement, and no classical length is read from it | `session_envelope_encrypted_named_accept`, `session_envelope_encrypted` (`session_classical_mismatch`) | | SPEC §5 | a refinement-only capability is never a `capability` or `fallback` a sink dispatches, a selectable rendition or a companion | rules 4 and 5 | `session_layer_with_fallback`, `session_wai2_refines_on_a_rendition` | | SPEC §7.1, *Selection algorithm* | a companion, or a capability that is not dispatchable, is never picked | rule 4 | `session_wai2_entry_names_a_companion` | | SPEC §7.1, *Component identity* | `component_digest_mismatch`: a rendition whose payload does not match its `sha256` is skipped, a refinement is not offered | rule 4 | `session_wai2_rendition_digest_mismatch`, `session_wai2_refinement_digest_mismatch` | | SPEC §7.1, *Component identity* | an `id`, `sha256` or `companion_of_id` that is not a string: the reader rejects the envelope | rule 3 | `session_wai2_component_id_not_a_string` | -| SPEC §7.1, *Refinement components* (`refinement-not-refinement-only`, `refinement-identity-missing`, `refines-malformed`, `refinement-base-missing`, `refinement-base-not-admitted`, `refinement-prev-missing`, `refinement-before-selectable`, `refines-on-non-refinement`, `refinement-only-as-component`) | a refinement component that does not conform is not offered | rule 5 | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_wai2_refines_on_a_rendition` | -| SPEC §7.1, *Companion components* | a companion that breaks rules 1–3 or its `companion_of_id`; an enhancement layer whose base is not unique | no bearing on a presentation: a sink does not apply the companion and may still present the rendition it picked; the output's digest holds whatever was applied | — | +| SPEC §7.1, *Refinement components*, *Selection* (every `WaiMulti::check_component_roles` code: the refinement codes, `refines-on-non-refinement`, `refinement-only-as-component`, the companion codes, `component-id-malformed`, `duplicate-component-id`) | a sink offers a `WAI2`'s refinements only when every component conforms | rule 5, the whole envelope | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_roles_refinement_before_selectable_exploded`, `session_wai2_refines_on_a_rendition`, `session_roles_base_without_sha256`, `session_roles_layer_before_its_prev`, `session_roles_unbound_companion`; accepted: `session_roles_companion_and_refinement_accept`, `session_roles_companion_by_id_and_refinement_accept` | +| SPEC §7.1, *Companion components* | a companion that breaks rules 1–3 or its `companion_of_id`; an enhancement layer whose base is not unique | for the rendition picked, no bearing: a sink does not apply the companion and may still present the rendition, the output's digest holding whatever was applied; for the envelope's refinements, the row above | `session_roles_unbound_companion` | ## Steps 1 and 2: types, and the order a body is read in @@ -450,7 +455,12 @@ no role or another payload's digest, over a base that is a companion — with pr each at one to three layers, within what each envelope covers and past it, entries whose `first_unit` is the base's or one off, the base's and the layers' each, and objects whose figures are each envelope's or one told otherwise, listed twice, fetched again, or beside -inert bytes, the base held or not. Further session families: +inert bytes, the base held or not, and entries naming a `WAI2` base or refinement by its +exploded envelope's content hash, its own bytes held or not; and, over every registered +capability and an unregistered string, a refinement beside a companion of that +capability bound to the base, and beside an HDR10+ descriptor and an enhancement layer +bound to a rendition of it (SPEC §7.1's component rules, which decide whether the +envelope offers its refinements). Further session families: sessions that pass steps 1–5 against a `stage` claim whose first layer applied to some units and arrived late for others, presented at one to three layers, with objects that hold or lack the set's base and layers (both bounds of §2.4.12's check), the base's or diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 4a345c0c4..090adfd80 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -973,6 +973,149 @@ def digest_matches(e, payload): return h is None or (SV.is_hash(h) and hashlib.sha256(payload).hexdigest() == h) +def encrypted_envelope(data): + """SPEC §6.4: an envelope a sink holding its key decrypts and dispatches — well formed, + with a security object naming an encryption.""" + if data[:4] == b"WAI2": + r = wai2_read(data) + if r is None: + return False + sec = r[0].get("security") + return isinstance(sec, dict) and plaintext_v2(r[0]) is False and isinstance(sec.get("encryption"), str) and ( + sec.get("kid") is None or (isinstance(sec["kid"], int) and not isinstance(sec["kid"], bool) and 0 <= sec["kid"] < 2 ** 64)) + if data[:4] == b"WAI1": + try: + m, _, _ = SV.read_wai1(data) + except SV.NotWai1: + return False + return m.get("security") is not None and not SV.plaintext(m) + return False + + +VIDEO_OUTSIDE_NAMESPACE = {"wai.neural.video_bmshj2018", "wai.neural.dcvc_rt", "wai.neural.dcvc_fm", "wai.film.linear", "wai.film.reel"} +ENHANCEMENT = {"wai.video.lcevc": {"wai.video.avc", "wai.video.hevc", "wai.video.vvc", "wai.video.evc", "wai.video.evc.baseline", + "wai.video.vp9", "wai.video.av1", "wai.video.av1.lossless"}} + + +def known(cap): + """A capability the reference's component rules know (`codecs::is_known_capability`): + a registered payload, companion or refinement; a record or a derivation is not one.""" + c = REGISTRY.get(cap) + return c is not None and c["kind"] in ("payload", "companion", "refinement") + + +def video_class(cap): + return known(cap) and ((cap.startswith("wai.video.") and not companion_only(cap) and cap not in SV.UNIT_KIND) + or cap in VIDEO_OUTSIDE_NAMESPACE) + + +def companion_applies_to(companion, base): + if companion_only(base) or base in SV.UNIT_KIND: + return False + if companion in ("wai.meta.hdr10plus", "wai.meta.dovi"): + return not known(base) or video_class(base) + return base in ENHANCEMENT.get(companion, ()) + + +def component_roles(rs): + """SPEC §5 / §7.1's component rules over a WAI2 table, in the order + `WaiMulti::check_component_roles` reads them: None where every component conforms, + else the first break's code. A sink offers the envelope's refinements only when it + conforms.""" + by_id = lambda x: next((j for j, y in enumerate(rs) if y.get("id") == x), None) # noqa: E731 + role = lambda e: e.get("role") # noqa: E731 + for i, m in enumerate(rs): + if m.get("id") is not None: + if not SV.is_component_id(m["id"]): + return "component-id-malformed" + if any(e.get("id") == m["id"] for e in rs[:i]): + return "duplicate-component-id" + + def refinement(i): + m = rs[i] + if m["capability"] not in SV.UNIT_KIND: + return "refinement-not-refinement-only" + if m.get("id") is None or m.get("sha256") is None: + return "refinement-identity-missing" + if m.get("refines") is None: + return "refines-malformed" + try: + ref = SV.parse_refines_ids(m["refines"]) + except SV.Malformed: + return "refines-malformed" + b = by_id(ref["base"]) + if b is None or not selectable(rs[b]): + return "refinement-base-missing" + if rs[b].get("sha256") is None: + return "refinement-identity-missing" + if rs[b]["capability"] not in SV.ADMIT.get(m["capability"], ()): + return "refinement-base-not-admitted" + for p, _ in ref["runs"]: + e = by_id(p) + if e is None or not (selectable(rs[e]) or (e < i and role(rs[e]) == "refinement")): + return "refinement-prev-missing" + if rs[e].get("sha256") is None: + return "refinement-identity-missing" + if any(selectable(rs[j]) for j in range(i + 1, len(rs))): + return "refinement-before-selectable" + return None + + def bound_base(i): + m = rs[i] + if m.get("companion_of_id") is not None: + return by_id(m["companion_of_id"]) + t = m.get("companion_of") + if t is None: + return None + hits = [j for j, b in enumerate(rs) if selectable(b) and b["capability"] == t] + return hits[0] if len(hits) == 1 else None + + for i, m in enumerate(rs): + cap = m["capability"] + if role(m) == "refinement": + why = refinement(i) + if why: + return why + continue + if m.get("refines") is not None: + return "refines-on-non-refinement" + if cap in SV.UNIT_KIND: + return "refinement-only-as-component" + co = companion_only(cap) + if role(m) != "companion": + if co: + return "companion-only-as-rendition" + continue + if not co and known(cap): + return "standalone-as-companion" + target = m.get("companion_of") + if target is None: + return "unbound-companion" + if co and not companion_applies_to(cap, target): + return "incompatible-base" + if m.get("companion_of_id") is not None: + b = by_id(m["companion_of_id"]) + if b is None: + return "companion-id-unresolved" + if rs[b]["capability"] != target: + return "companion-id-capability-mismatch" + if not selectable(rs[b]): + return "unbound-companion" + else: + n = sum(1 for e in rs if selectable(e) and e["capability"] == target) + if cap in ENHANCEMENT: + if n != 1: + return "enhancement-base-not-unique" + elif n == 0: + return "unbound-companion" + if cap in ENHANCEMENT: + bi = bound_base(i) + if any(role(rs[e]) == "companion" and rs[e]["capability"] in ENHANCEMENT and bound_base(e) is not None + and bound_base(e) == bi for e in range(i)): + return "duplicate-enhancement-layer" + return None + + def check_session_envelopes(c, envs, objs, ps): """§2.4.12 against the envelopes the session received: every WAI2 one, and any WAI1 one the verifier holds, with the objects and the presentations where those are held. @@ -990,11 +1133,11 @@ def check_session_envelopes(c, envs, objs, ps): for e in envs: h, n = SV.content_hash(e), counted_of(e) need(all(o["counted"] == n for o in objs if o["content_hash"] == h), 6, "session_counted_mismatch") - by_hash, inert, readable, exploded = {}, set(), [], [] + by_hash, inert, encrypted, readable, exploded = {}, set(), set(), [], [] for data in envs: r = read_envelope(data) if r is None: - inert.add(SV.content_hash(data)) + (encrypted if encrypted_envelope(data) else inert).add(SV.content_hash(data)) else: h = SV.content_hash(data) if r[0] == "multi": @@ -1007,11 +1150,24 @@ def check_session_envelopes(c, envs, objs, ps): exploded += [(SV.content_hash(x), h, j) for j, x in enumerate(each) if x is not None] by_hash.setdefault(h, r) readable.append(r) - need(not any(d["object"] in inert and d["object"] not in by_hash for d in b["decoders"]), 6, "session_envelope_unreadable") - refinement_only = lambda cap: cap in SV.UNIT_KIND # noqa: E731 - layer_entry = lambda e: e.get("refines") is not None or e.get("role") == "refinement" or refinement_only(e["capability"]) # noqa: E731 - layer_one = lambda m: m.get("refines") is not None or refinement_only(m["model_requirement"]["capability"]) # noqa: E731 + need(not any(d["object"] in inert and d["object"] not in by_hash and d["object"] not in encrypted for d in b["decoders"]), + 6, "session_envelope_unreadable") + # Each entry as the envelopes resolve it: one naming a held WAI2 rendition by its exploded + # envelope's content hash, with no rendition, names that rendition, unless the exploded + # envelope's own bytes are held (a separate delivery). + resolved = [] for d in b["decoders"]: + hit = next(((w, j) for x, w, j in exploded if x == d["object"]), None) + if d["rendition"] is None and d["object"] not in by_hash and hit is not None: + resolved.append(hit) + else: + resolved.append((d["object"], d["rendition"])) + refinement_only = lambda cap: cap in SV.UNIT_KIND # noqa: E731 + # A layer is decided by its capability; any other is a base, a refines on it ignored. + layer_entry = lambda e: refinement_only(e["capability"]) # noqa: E731 + layer_one = lambda m: refinement_only(m["model_requirement"]["capability"]) # noqa: E731 + for d0, (o, rn) in zip(b["decoders"], resolved): + d = dict(d0, object=o, rendition=rn) r = by_hash.get(d["object"]) if r is not None and r[0] == "multi": rs, i = r[1]["renditions"], d["rendition"] @@ -1022,13 +1178,13 @@ def check_session_envelopes(c, envs, objs, ps): gives = (d["rendition"] is None and d["capability"] in (mr["capability"], mr.get("fallback")) and (layer_one(r[1]) or (dispatchable(d["capability"]) and not companion_only(mr["capability"])))) else: - gives = d["rendition"] is None + gives = d["rendition"] is None or d["object"] in encrypted need(gives, 6, "session_source_mismatch") def component(m, payloads, j): e = m["renditions"][j] return {"capability": e["capability"], "units": payload_units(e["capability"], payloads[j]), - "is_base": selectable(e) and e.get("refines") is None} + "is_base": selectable(e)} def base_by_hash(h): r = by_hash.get(h) @@ -1062,7 +1218,8 @@ def check_session_envelopes(c, envs, objs, ps): return ("na",) n = base["units"] hashes, pairs = names - naming = [e for e in ds if e["object"] in hashes or (e["rendition"] is not None and (e["object"], e["rendition"]) in pairs)] + naming = [e for e, (o, rn) in zip(ds, resolved) + if e["object"] in hashes or o in hashes or (rn is not None and (o, rn) in pairs)] over = [e["first_unit"] for e in naming if e["capability"] in SV.ADMIT.get(cap, ()) and (base is None or e["capability"] == base["capability"])] if naming and not over: @@ -1078,11 +1235,12 @@ def check_session_envelopes(c, envs, objs, ps): return ("na",) return ("layer", lu[0], lu[1], over) - def given(d): - """What d's held envelope is: ("base", units or None), ("layer", layers, span or - None, first units), or ("na",) for a layer a sink cannot apply; None where the + def given(k): + """What entry k's held envelope is: ("base", units or None), ("layer", layers, span + or None, first units), or ("na",) for a layer a sink cannot apply; None where the envelope is not held.""" - r = by_hash.get(d["object"]) + obj, rendition = resolved[k] + r = by_hash.get(obj) if r is None: return None if r[0] == "one": @@ -1094,10 +1252,10 @@ def check_session_envelopes(c, envs, objs, ps): ref = SV.parse_refines(m.get("refines")) except SV.Malformed: return ("na",) - if not refinement_only(mr["capability"]) or mr.get("fallback") is not None: + if mr.get("fallback") is not None: return ("na",) return layer_of(mr["capability"], ref, base_by_hash(ref["base"]), names_of(ref["base"], None), payload) - i = d["rendition"] + i = rendition if i is None: return None m, payloads = r[1], r[2] @@ -1107,36 +1265,25 @@ def check_session_envelopes(c, envs, objs, ps): e = rs[i] if not layer_entry(e): return ("base", payload_units(e["capability"], payloads[i])) - identified = lambda x: x.get("id") is not None and x.get("sha256") is not None # noqa: E731 - if e.get("refines") is None: + # SPEC §7.1: a sink offers a WAI2's refinements only when every component conforms. + if component_roles(rs) is not None: return ("na",) - try: - ref = SV.parse_refines_ids(e["refines"]) - except SV.Malformed: - return ("na",) - by_id = lambda x: next((j for j, y in enumerate(rs) if y.get("id") == x), None) # noqa: E731 - bj = by_id(ref["base"]) - conforms = (e.get("role") == "refinement" and refinement_only(e["capability"]) and identified(e) - and bj is not None and selectable(rs[bj]) and identified(rs[bj]) - and all(by_id(p) is not None and (selectable(rs[by_id(p)]) or (by_id(p) < i and rs[by_id(p)].get("role") == "refinement")) - and identified(rs[by_id(p)]) for p, _ in ref["runs"]) - and not any(selectable(y) for y in rs[i + 1:])) - if not conforms: - return ("na",) - return layer_of(e["capability"], ref, component(m, payloads, bj), names_of(None, (d["object"], bj)), payloads[i]) + ref = SV.parse_refines_ids(e["refines"]) + bj = next(j for j, y in enumerate(rs) if y.get("id") == ref["base"]) + return layer_of(e["capability"], ref, component(m, payloads, bj), names_of(None, (obj, bj)), payloads[i]) - need(not any((given(d) or ("",))[0] == "na" for d in ds), 6, "session_layer_not_applicable") - for d in ds: - g = given(d) + need(not any((given(k) or ("",))[0] == "na" for k in range(len(ds))), 6, "session_layer_not_applicable") + for k, d in enumerate(ds): + g = given(k) if g is not None and g[0] == "layer": need(not g[3] or d["first_unit"] in g[3], 6, "session_first_unit_mismatch") if ps is not None: for p in ps: - g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None + g = given(p["decoder"]) if p["decoder"] < len(ds) else None if g is not None and g[0] in ("base", "layer"): need(p["layers"] == (1 if g[0] == "base" else g[1]), 6, "session_layers_mismatch") for p in ps: - g = given(ds[p["decoder"]]) if p["decoder"] < len(ds) else None + g = given(p["decoder"]) if p["decoder"] < len(ds) else None covers = None if g is not None and g[0] == "base" and g[1] is not None: covers = (0, g[1]) diff --git a/wai/claim-conformance/differential.py b/wai/claim-conformance/differential.py index f7f6702be..a7c4d6e5d 100644 --- a/wai/claim-conformance/differential.py +++ b/wai/claim-conformance/differential.py @@ -1065,6 +1065,7 @@ def session_held(ins, rng, n): frames = rng.choice([1, 2, 3, 4, 4, 6]) first = rng.choice([0, 0, 1, 2, 5]) form = rng.choice(["wai1", "wai1", "wai2", "alias"]) + listed_only = [] # objects received and listed whose bytes the verifier does not hold # The layers: at layer 1 or 2, over a span or the whole base, and now and then one a # sink cannot apply. specs = [] @@ -1117,7 +1118,11 @@ def session_held(ins, rng, n): subject, held_envs = SV.content_hash(w), [w] + ([x] if rng.random() < 0.3 else []) base_entry = dict(dec[HYPER], rendition=0, object=subject, first_unit=first) else: - subject, held_envs = layer_base, [x] + ([w] if rng.random() < 0.7 else []) + # The exploded envelope's own bytes held, or only the WAI2 the entry + # resolves to, or neither. + subject = layer_base + held_envs = ([x] if rng.random() < 0.5 else []) + ([w] if rng.random() < 0.8 else []) + listed_only = [] if x in held_envs else [x] base_entry = dict(dec[HYPER], rendition=None, object=subject, first_unit=first) if base_entry["capability"] != HYPER: base_entry.update(pin=None, tier=None) # no pin above its capability's class @@ -1161,15 +1166,29 @@ def session_held(ins, rng, n): subject = SV.content_hash(env) held_envs = [env] base_entry = dict(dec[HYPER], rendition=0, object=subject, first_unit=first) - if rng.random() < 0.25: - # The base component named by its exploded envelope, held. - x = SV.explode_each(env)[0] - if x is not None: + each = SV.explode_each(env) + if rng.random() < 0.25 and each[0] is not None: + # The base component named by its exploded envelope, its own bytes held or + # not (then the entry resolves to the WAI2's rendition). + x = each[0] + if rng.random() < 0.5: held_envs.append(x) - subject = SV.content_hash(x) - base_entry = dict(dec[HYPER], rendition=None, object=subject, first_unit=first) - layer_entries = [dict(dec[REFINE], capability=comps[k + 1]["capability"], rendition=k + 1, object=SV.content_hash(env)) - for k in range(len(specs))] + else: + listed_only.append(x) + subject = SV.content_hash(x) + base_entry = dict(dec[HYPER], rendition=None, object=subject, first_unit=first) + layer_entries = [] + for k in range(len(specs)): + xk = each[k + 1] if k + 1 < len(each) else None + if xk is not None and rng.random() < 0.25: + # A refinement named by its exploded envelope's content hash. + layer_entries.append(dict(dec[REFINE], capability=comps[k + 1]["capability"], rendition=None, object=SV.content_hash(xk))) + if rng.random() < 0.3: + held_envs.append(xk) + else: + listed_only.append(xk) + else: + layer_entries.append(dict(dec[REFINE], capability=comps[k + 1]["capability"], rendition=k + 1, object=SV.content_hash(env))) for d in layer_entries: d["first_unit"] = first if rng.random() < 0.9 else rng.choice([0, first + 1]) # Each unit at one layer through the base, and some at two or three through a layer @@ -1210,9 +1229,10 @@ def session_held(ins, rng, n): decoders[0]["first_unit"] = rng.choice([first + 1, max(0, first - 1)]) held = list(held_envs) named = {d["object"] for d in decoders} + listed = held + [e for e in listed_only if e not in held] objects = [{"content_hash": SV.content_hash(e), "path": "primary", "counted": CV.counted_of(e), "transferred": len(e) * rng.choice([1, 1, 1, 2, 3]), "presented": SV.content_hash(e) in named} - for e in held] + for e in listed] # One or two defects among the objects and envelopes. inert = None for _ in range(rng.choice([0, 0, 1, 1, 2])): @@ -1250,6 +1270,37 @@ def session_held(ins, rng, n): ins.add(f"session_held_{form}_{i}", CV.jcs(sign(dict(base, subject=subject, body=body), VIEWER)), ctx) +def session_roles_sweep(ins): + """SPEC §7.1's component rules, which decide whether a WAI2 offers its refinements, over + every registered capability and an unregistered string: a refinement beside a companion + of each capability bound to the base, and beside an HDR10+ descriptor and an + enhancement layer bound to a rendition of each capability.""" + model = ins.by_name["session_roles_companion_and_refinement_accept"] + base = json.loads(model["receipt"]) + w = bytes.fromhex(model["context"]["envelopes"][0]["envelope"]) + _, m, payloads = CV.read_envelope(w) + b, comp, ref = m["renditions"] + for cap in sorted(CV.REGISTRY) + ["org.example.meta"]: + cases = [ + ("companion", [b, dict(comp, capability=cap), ref], [payloads[0], payloads[1], payloads[2]], 2), + ("hdr_over", [b, {"capability": cap, "kind": "k", "id": "x"}, dict(comp, companion_of=cap, companion_of_id=None), ref], + [payloads[0], payloads[0], payloads[1], payloads[2]], 3), + ("lcevc_over", [b, {"capability": cap, "kind": "k", "id": "x"}, dict(comp, capability="wai.video.lcevc", companion_of=cap, companion_of_id=None), ref], + [payloads[0], payloads[0], payloads[1], payloads[2]], 3), + ] + for tag, entries, pls, ri in cases: + entries = [{k: v for k, v in e.items() if v is not None} for e in entries] + e2 = wai2_of(entries, pls) + h = SV.content_hash(e2) + body = copy.deepcopy(base["body"]) + body["decoders"][0]["object"] = h + body["decoders"][1].update(object=h, rendition=ri) + objects = [{"content_hash": h, "path": "primary", "counted": CV.counted_of(e2), "transferred": len(e2), "presented": True}] + restate(body, objects) + ctx = dict(model["context"], objects=objects, envelopes=[{"envelope": e2.hex()}]) + ins.add(f"session_roles_{tag}_{cap}", CV.jcs(sign(dict(base, subject=h, body=body), VIEWER)), ctx) + + def wai2_with(manifest_text, rest): """A WAI2 envelope of the manifest text (or bytes) given, with the rest of the session corpus's envelope: its rendition count, table and payloads.""" @@ -1960,6 +2011,7 @@ def main(argv): session_envelopes(ins) session_wai1_envelopes(ins) session_classical_sweep(ins) + session_roles_sweep(ins) doc = text_of({"about": "differential inputs; no outcome is declared", "vectors": ins.out}) with tempfile.NamedTemporaryFile("w", suffix=".json", delete=False, encoding="utf-8") as f: f.write(doc) diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index 9a6b3221e..d62507920 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -7917,9 +7917,26 @@ "reason": "session_classical_mismatch" } }, + { + "name": "session_envelope_encrypted_named_accept", + "about": "the WAI2 envelope encrypted, its first rendition decoded by a sink that holds the key: what the entry names of it is the signer's statement, and no classical length is read from it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"645e21c03105a434c53b0c0b2da54576bc3a42e4186703df7bf67171c12a6cd9\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7793d276fa71c11d863bdb369b8660ff000a147a4c24ed92caef1b239f9e928029341c6047c1daa66a6411d5c72ea1b7b6453cda9c94f52500ee2aa0b3bd4904\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "envelopes": [ + { + "envelope": "57414932e50000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a22696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e617663222c226b696e64223a227365636f6e64227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d0200000000009800000098000000bc0200005749563101010100010000001000000010000000010000000100000000000000030000000000000000800000000001000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "2916ad7b91bffbb12b9d94b1205c8a04d143ca00b92e40c68da53f7aa2748c02" + } + }, { "name": "session_envelope_encrypted", - "about": "the WAI2 envelope encrypted: inert at every sink that cannot open it", + "about": "the WAI2 envelope encrypted, with the classical length its plaintext would give stated: the verifier reads no classical rendition from an envelope it cannot open", "procedure": "claim", "receipt": "{\"body\":{\"classical_declared\":700,\"classical_source\":\"wai2-table\",\"counted_discarded\":1904,\"counted_fallback\":0,\"counted_primary\":5935,\"deadline_us\":40000,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":null,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":4,\"leaves\":1,\"module_status\":null,\"object\":\"645e21c03105a434c53b0c0b2da54576bc3a42e4186703df7bf67171c12a6cd9\",\"path\":\"primary\",\"pin\":\"7b4371854df0aa1645ac6525b373387c0617b873d5a57748932ee0f386ea164b\",\"rendition\":0,\"tier\":\"decode-equivalence\",\"variant\":null},{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":5,\"leaves\":1,\"module_status\":null,\"object\":\"13b04249eca2b1a9061dba8ca2846169d3f5fa3548d9e138a0cf2cb553798cf4\",\"path\":\"fallback\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"47a2c23727d2eb9d2beef0931c3e9b2675408d372660420cce427dc27fd21fe1\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"6b74be11e64461c7d972fc5cb6ba15e98427e9d6e60622b0a753222138de28cf\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"5e7a38ca5c04442cbe00b040d58e4494f5aa36fb81e8bbe0d304fd2d1ce722b2\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"be5055af8e32359265852c512667b10ab6a07455e5ab06603e278763f6633a85\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":1,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":10,\"media\":\"video\",\"missed\":1,\"missed_units\":[{\"late_us\":1200,\"layers\":1,\"unit\":5}],\"output_root\":\"b62a8425b7fe3a085a14f2f2156ea22ae3b4349884d799b5afe66dccc7d4dd7f\",\"primary_units\":5,\"receipt_bytes\":640,\"session_nonce\":\"57c5462dfdabd1b7bdd204d34ba33649c057eb535349f29f45eb8f8c7d4a7e7f\",\"stage_sets\":[{\"claim\":\"7ff63c64ae3826c013fd8c2387f51307c4bf715842b0a803528349e200d95551\",\"first_unit\":0}],\"switches\":[{\"from\":\"primary\",\"reason\":\"set-incomplete\",\"to\":\"fallback\",\"unit\":5}],\"switches_total\":1,\"transferred\":9995,\"uncounted\":2,\"units\":6},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"3eb85f501060ba5f57ee04ae0781b722a3a1bd8a2dfbbfce347188558ff89ca9ea8961bfdcae5ccc063584f4d7640deee7292feaa6bc6d6f8c28394fef90060b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { @@ -7932,7 +7949,7 @@ "expected": { "outcome": "reject", "step": 6, - "reason": "session_envelope_unreadable" + "reason": "session_classical_mismatch" } }, { @@ -11299,7 +11316,7 @@ }, { "name": "session_refines_on_a_base_capability", - "about": "a WAI1 envelope of wai.video.int_hyper carrying refines, applied as a layer: refines on a capability that is not refinement-only", + "about": "a WAI1 envelope of wai.video.int_hyper carrying refines, presented at two layers: its capability makes it a base, the refines ignored, and a base gives one layer", "procedure": "claim", "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":328,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"aa5392ba8f2f0ba2725203fef8552392a52e5ad56e67f008b3e28b7cead5b49b\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":954,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"c7e400680827692154e507fa925a1e3342090717ce0239f711b6018192dd5957b36ebff7ee541b8c5688ce289068a3048e8d8cdcca5594ad4ab8ef0247abae07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", "context": { @@ -11363,7 +11380,7 @@ "expected": { "outcome": "reject", "step": 6, - "reason": "session_layer_not_applicable" + "reason": "session_layers_mismatch" } }, { @@ -11962,6 +11979,1092 @@ "reason": "session_layer_not_applicable" } }, + { + "name": "session_alias_entry_accept", + "about": "the base's entry names the WAI2's base rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":394,\"counted_fallback\":0,\"counted_primary\":721,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":721,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"580e6b3dace6682b783d7b3009f5d8972b08522140fd3ce040a48e7da5bc8c94bf5a5b2ca9e2e790da38cf8d2abbf4c60c22d7abfdb318efd74c08d2999ca205\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281", + "path": "primary", + "counted": 327, + "transferred": 327, + "presented": true + }, + { + "content_hash": "c4b8e80fa363209dba004a2eb800c912f0e16dbe6be57008726fd114a7235369", + "path": "primary", + "counted": 394, + "transferred": 394, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932d40000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "ecba13206e5f92c206f663938883dc7ae2c6e31d43668ba1df088800024bf5a5" + } + }, + { + "name": "session_alias_entry_relabelled", + "about": "the same entry relabelled wai.video.av1, a capability the rendition does not have", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":394,\"counted_fallback\":0,\"counted_primary\":721,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.av1\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":721,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"560f90bda816b3e5d2404a89ff705c519a4b8e44eaf0cba720b66a9c086fef4d6babf20d94a544f7f58aacdc5b4c0fda6a51deb3f60aba0ba2c813660b6d4b09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281", + "path": "primary", + "counted": 327, + "transferred": 327, + "presented": true + }, + { + "content_hash": "c4b8e80fa363209dba004a2eb800c912f0e16dbe6be57008726fd114a7235369", + "path": "primary", + "counted": 394, + "transferred": 394, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932d40000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_alias_entry_unit_past_the_base", + "about": "the same entry, and unit 1000 presented through it, past the rendition's four frames", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":394,\"counted_fallback\":0,\"counted_primary\":721,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":5,\"module_status\":null,\"object\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"545587b772c7b8c8e9190c4b3733aa539eb49bcbe8fae75713532b5929f97fee\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":721,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"1f8bd0e120f94df9dced0477274c8cb61cf30c813f97c24b672a6394e196c20d6f2a52ac6a66d66f8cb6be4c3475456625acddedf8dc077a15a64c89266c2f0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1000, + "layers": 1, + "decoder": 0, + "out_digest": "2824e56f98735e65ffee4fd1b77c644465d686a6982e69d4c241636c95d4d3b1" + } + ], + "objects": [ + { + "content_hash": "0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281", + "path": "primary", + "counted": 327, + "transferred": 327, + "presented": true + }, + { + "content_hash": "c4b8e80fa363209dba004a2eb800c912f0e16dbe6be57008726fd114a7235369", + "path": "primary", + "counted": 394, + "transferred": 394, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932d40000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_unit_outside_object" + } + }, + { + "name": "session_alias_refinement_entry_first_unit", + "about": "a refinement named by its exploded envelope's content hash at first_unit 50, while the entry naming its base rendition states 0", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1518,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"2512d7b9b22d7dee90dcfdd30a4ac3c7e095fb6903be6c393bf6df48da900adf\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":50,\"leaves\":1,\"module_status\":null,\"object\":\"9cacc228d8c317b388e2163fc45da678cd5d022e90afb63e90bdbbeb2f1da4fa\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"4546d33cdcefff052eedcfe0189dc61764526ade82821ffae01bf0ba7798cf4e\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1518,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"50a864eb6a11d098520b7324ec4a98ccb850abaf1f1c29e8a4a4b3aa21b4191e4950cf30c2133ed9184710d072f24531aff661fe3728bd392a20b49342f7ad0f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"2512d7b9b22d7dee90dcfdd30a4ac3c7e095fb6903be6c393bf6df48da900adf\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 51, + "layers": 2, + "decoder": 1, + "out_digest": "443c166ebddc5671cd5edd02ab4d6c6d62b1bcac39fb3b8d0653f8fe8a4f4f55" + } + ], + "objects": [ + { + "content_hash": "2512d7b9b22d7dee90dcfdd30a4ac3c7e095fb6903be6c393bf6df48da900adf", + "path": "primary", + "counted": 892, + "transferred": 892, + "presented": true + }, + { + "content_hash": "9cacc228d8c317b388e2163fc45da678cd5d022e90afb63e90bdbbeb2f1da4fa", + "path": "primary", + "counted": 626, + "transferred": 626, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932b60100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d020000000000a4000000a4000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_first_unit_mismatch" + } + }, + { + "name": "session_alias_refinement_entry_not_admitted", + "about": "a wai.image.int_refine refinement over the video base, named by its exploded envelope's content hash: the envelope does not conform, so no refinement of it is offered", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1518,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"63ea49daf4a6dd0f6262bcf47be17e4d6dc95514b36c0662d5119a09cf5f184c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.image.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"e661b9efec246190e7ca6fb50f350cb8a898b1f34c384ff1f2f6a62217762f8c\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1518,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"d0b03a761158ae62cc61d1b74080d05c50a96bf9cb4d081e716f6c08fcf3c945009e6f81b4e124d8e818193e9f055f5c187035465746b817adcd5b48c443950b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"63ea49daf4a6dd0f6262bcf47be17e4d6dc95514b36c0662d5119a09cf5f184c\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "63ea49daf4a6dd0f6262bcf47be17e4d6dc95514b36c0662d5119a09cf5f184c", + "path": "primary", + "counted": 892, + "transferred": 892, + "presented": true + }, + { + "content_hash": "e661b9efec246190e7ca6fb50f350cb8a898b1f34c384ff1f2f6a62217762f8c", + "path": "primary", + "counted": 626, + "transferred": 626, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932b60100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e696d6167652e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d020000000000a4000000a4000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_roles_refinement_before_selectable_exploded", + "about": "a refinement placed before a selectable rendition, named by its exploded envelope's content hash with only the WAI2 held: one verdict with the rendition named by index", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":626,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"233320ac044e3e2ae1ad05739fefd02dd6029b373ceea165ae6ce84d2f0af650\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"9cacc228d8c317b388e2163fc45da678cd5d022e90afb63e90bdbbeb2f1da4fa\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1824,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"04f5aad29adb7d0a32da760bdf3a07a8ee966d152d4e5015d8231c910ed7c7c76fdb7acce5cfb9cdc3cbf23d881c989e95c61b2af9996460d7a39d8fba903e0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"233320ac044e3e2ae1ad05739fefd02dd6029b373ceea165ae6ce84d2f0af650\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "233320ac044e3e2ae1ad05739fefd02dd6029b373ceea165ae6ce84d2f0af650", + "path": "primary", + "counted": null, + "transferred": 1198, + "presented": true + }, + { + "content_hash": "9cacc228d8c317b388e2163fc45da678cd5d022e90afb63e90bdbbeb2f1da4fa", + "path": "primary", + "counted": 626, + "transferred": 626, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "574149323c0200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d2c7b226361706162696c697479223a227761692e766964656f2e696e745f6d6f74696f6e222c226b696e64223a2263222c226964223a226d222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c7d030000000000a4000000a400000008010000ac010000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449415749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_roles_exploded_layer_delivered_alone_accept", + "about": "the same refinement's exploded envelope received on its own and held: a WAI1 layer, a separate delivery staged-delivery §4 processes alone, over the WAI2's base rendition", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":626,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"233320ac044e3e2ae1ad05739fefd02dd6029b373ceea165ae6ce84d2f0af650\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"9cacc228d8c317b388e2163fc45da678cd5d022e90afb63e90bdbbeb2f1da4fa\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1824,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"04f5aad29adb7d0a32da760bdf3a07a8ee966d152d4e5015d8231c910ed7c7c76fdb7acce5cfb9cdc3cbf23d881c989e95c61b2af9996460d7a39d8fba903e0e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"233320ac044e3e2ae1ad05739fefd02dd6029b373ceea165ae6ce84d2f0af650\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "233320ac044e3e2ae1ad05739fefd02dd6029b373ceea165ae6ce84d2f0af650", + "path": "primary", + "counted": null, + "transferred": 1198, + "presented": true + }, + { + "content_hash": "9cacc228d8c317b388e2163fc45da678cd5d022e90afb63e90bdbbeb2f1da4fa", + "path": "primary", + "counted": 626, + "transferred": 626, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "574149323c0200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d2c7b226361706162696c697479223a227761692e766964656f2e696e745f6d6f74696f6e222c226b696e64223a2263222c226964223a226d222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c7d030000000000a4000000a400000008010000ac010000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449415749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315e0100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c2266616c6c6261636b223a6e756c6c7d2c22636f6e646974696f6e696e67223a7b226b696e64223a2263227d2c22726566696e6573223a7b2262617365223a2230393330616536323838313438613661353238346364613062313734313531333464306437613736353935656236396438666234323235396635663632323831222c2270726576223a2230393330616536323838313438613661353238346364613062313734313531333464306437613736353935656236396438666234323235396635663632323831222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "c428d45298d4984e4b15c4ad493c5d30c7a27ba2ec003a88bc08a1afc2e27403" + } + }, + { + "name": "session_roles_base_without_sha256", + "about": "a refinement whose base rendition states no sha256: the refinement does not conform, so it is not offered", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":816,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"297841a2dd4072116bc43d07b43fecc2c439d154b239681151d5bfb69cd9a8e1\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"297841a2dd4072116bc43d07b43fecc2c439d154b239681151d5bfb69cd9a8e1\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":816,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b4a70c10e0e3085185e9e46f090f3ca5e18c8e6600dcee9bad73a425c60852a92423e5a159f75a0b8a61537fd972c416721bdc66284fe9e7990d4a83b457b500\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"297841a2dd4072116bc43d07b43fecc2c439d154b239681151d5bfb69cd9a8e1\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "297841a2dd4072116bc43d07b43fecc2c439d154b239681151d5bfb69cd9a8e1", + "path": "primary", + "counted": 816, + "transferred": 816, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "574149326a0100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d020000000000a4000000a4000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_roles_layer_before_its_prev", + "about": "layer 2 listed before the layer 1 it names as its producer: its prev names no refinement before it", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":2513,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"5f40a0c0301933673ccedfe0b802db591145a0a6392d85b3c71ec4f7507e8495\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"5f40a0c0301933673ccedfe0b802db591145a0a6392d85b3c71ec4f7507e8495\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"5f40a0c0301933673ccedfe0b802db591145a0a6392d85b3c71ec4f7507e8495\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":12,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"3ff28beff095ff37b9ade766b42e69e4eaadea0ef3e52823000371234ea60bd4\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":2513,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"f394215343df68797100cc72619146c2d823174b84052a86a6de21003c595a4709b5b5568dad699b95ac0d437f902a4da42b67f74243b817122c986b4b84ae07\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"5f40a0c0301933673ccedfe0b802db591145a0a6392d85b3c71ec4f7507e8495\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 0, + "layers": 2, + "decoder": 1, + "out_digest": "cedffc10c0d2e777c954459c198af496e316170b3a8c35276a3f473edf438a0e" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + }, + { + "unit": 2, + "layers": 2, + "decoder": 1, + "out_digest": "446c9941549464ba1b15c36c6e738380f8918f4a63a47ebbbdd67058a1975a80" + }, + { + "unit": 3, + "layers": 2, + "decoder": 1, + "out_digest": "ab18c5a26c59ff8de3da644ea5f2f8c4914d50fc361c7c84d3395f3846dc5bcf" + }, + { + "unit": 0, + "layers": 3, + "decoder": 2, + "out_digest": "a80c01cb3ded2f965b69ec4a5b3f1dcb6996e05454d9963e0b05455f9f27bc2f" + }, + { + "unit": 1, + "layers": 3, + "decoder": 2, + "out_digest": "f422310242ff0aa741c4ac2b87de241b27cfb625307225ee151e243c6386c647" + }, + { + "unit": 2, + "layers": 3, + "decoder": 2, + "out_digest": "7551edabc99ca230891d980b4d9cc4df3c3691a2e5553fb4c152b225fed8fdae" + }, + { + "unit": 3, + "layers": 3, + "decoder": 2, + "out_digest": "9dc228b1cac50579d249e74dbb45dfb7ddbe50f7e61e7168cf93644a2ffaf22d" + } + ], + "objects": [ + { + "content_hash": "5f40a0c0301933673ccedfe0b802db591145a0a6392d85b3c71ec4f7507e8495", + "path": "primary", + "counted": 2513, + "transferred": 2513, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932630200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a227232222c22736861323536223a2262643833393865326435666332626561626330333566356639356332373162333139666437336433373235326138656161323535376331656262623666646263222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a227231222c226c61796572223a327d7d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a227231222c22736861323536223a2262643833393865326435666332626561626330333566356639356332373162333139666437336433373235326138656161323535376331656262623666646263222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d030000000000a4000000a400000054030000f8030000540300005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000004000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c0000000c0000000c0000000c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941574952310101000004000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c0000000c0000000c0000000c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a449417d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_roles_unbound_companion", + "about": "a refinement beside a companion with no companion_of: the envelope does not conform, so its refinement is not offered", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"b40c261a5b16ad51cff715e33f5f6c59b667892510f5c45df33b587417426120\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"b40c261a5b16ad51cff715e33f5f6c59b667892510f5c45df33b587417426120\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1074,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"bd2e74c639a6e0d0bcbb3fe92e249d50ac77946f53f7c987bf08a20526538386da0caaa364196d1105c20b4a32ba54fb59471d9041ef4801245055868ac9b406\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"b40c261a5b16ad51cff715e33f5f6c59b667892510f5c45df33b587417426120\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "b40c261a5b16ad51cff715e33f5f6c59b667892510f5c45df33b587417426120", + "path": "primary", + "counted": null, + "transferred": 1074, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932550200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e6d6574612e6864723130706c7573222c226b696e64223a226864723130706c7573222c226964223a2268222c22736861323536223a2231323138316666386430383661316132303236646163613937663264343331313835353330633266636665306338313466316531316462666333623263613730222c22726f6c65223a22636f6d70616e696f6e227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d030000000000a4000000a40000000f000000b3000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb48445231302b206d65746164617461574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_roles_companion_and_refinement_accept", + "about": "a refinement beside an HDR10+ companion bound to the base rendition by capability: every component conforms", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"7e086ec19bfcca98e40434f0c529dff0f0f924a32ca152ebeb142f7add1f92ac\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"7e086ec19bfcca98e40434f0c529dff0f0f924a32ca152ebeb142f7add1f92ac\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1111,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"cef7b83fdcda53850faa7dfb86f03758e08fa9b5ef3ad845ddec89be3e1a5b9ac7f23e7152cef9ae3e322eedb707e0482c81a760b31ff9ab21f66b488bed2706\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"7e086ec19bfcca98e40434f0c529dff0f0f924a32ca152ebeb142f7add1f92ac\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "7e086ec19bfcca98e40434f0c529dff0f0f924a32ca152ebeb142f7add1f92ac", + "path": "primary", + "counted": null, + "transferred": 1111, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "574149327a0200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e6d6574612e6864723130706c7573222c226b696e64223a226864723130706c7573222c226964223a2268222c22736861323536223a2231323138316666386430383661316132303236646163613937663264343331313835353330633266636665306338313466316531316462666333623263613730222c22726f6c65223a22636f6d70616e696f6e222c22636f6d70616e696f6e5f6f66223a227761692e766964656f2e696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d030000000000a4000000a40000000f000000b3000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb48445231302b206d65746164617461574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "6d0560148f276a6bc7108908b79141d0e1c76356a3cccdf163507ea31bf8be7c" + } + }, + { + "name": "session_roles_companion_by_id_and_refinement_accept", + "about": "the same, the companion bound by id", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"01b2a091e91493f585da383de5c9668d03a799ea156344b07d3ee4d7fe5cd323\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"01b2a091e91493f585da383de5c9668d03a799ea156344b07d3ee4d7fe5cd323\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1133,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"4de5c65baed7cca30aac42165ebeb8ec760e1c80f3bbc4dbe10a1220c3772536ff29bcc5f4f572b2e9279a033fec9717e9b01919afc82e0b4e6f9ad60117fd0a\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"01b2a091e91493f585da383de5c9668d03a799ea156344b07d3ee4d7fe5cd323\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "01b2a091e91493f585da383de5c9668d03a799ea156344b07d3ee4d7fe5cd323", + "path": "primary", + "counted": null, + "transferred": 1133, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932900200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e6d6574612e6864723130706c7573222c226b696e64223a226864723130706c7573222c226964223a2268222c22736861323536223a2231323138316666386430383661316132303236646163613937663264343331313835353330633266636665306338313466316531316462666333623263613730222c22726f6c65223a22636f6d70616e696f6e222c22636f6d70616e696f6e5f6f66223a227761692e766964656f2e696e745f6879706572222c22636f6d70616e696f6e5f6f665f6964223a2262227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d030000000000a4000000a40000000f000000b3000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb48445231302b206d65746164617461574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "63e7b665301541dce3d6d76a1e785bb8cafe102e5d813efef610a50a9c928b16" + } + }, + { + "name": "session_stray_refines_base_accept", + "about": "a WAI1 base of wai.video.int_hyper whose manifest carries a refines, presented as a base", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":498,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"cc4fdd731ba587bffa648cf2bd3ccdf78b235e64f12024613ecfdd4d79f9be3e\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":498,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"8a394c6e31c9f229c912cc596ae076f839f74954b1b713775d79e654d76650af261fe0ed9a38203b444b5b912446a3f467ea877f9721d7e28c68ff8443bdc307\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"cc4fdd731ba587bffa648cf2bd3ccdf78b235e64f12024613ecfdd4d79f9be3e\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "cc4fdd731ba587bffa648cf2bd3ccdf78b235e64f12024613ecfdd4d79f9be3e", + "path": "primary", + "counted": 498, + "transferred": 498, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931420100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a317d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "664e1b07caf491a5ba04996159d7739431b3bc40f0c1e3d7c2a26c0f9ade8bd8" + } + }, + { + "name": "session_stray_refines_layer_over_it_accept", + "about": "a layer over that base: a base, whatever refines it carries", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":1125,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"cc4fdd731ba587bffa648cf2bd3ccdf78b235e64f12024613ecfdd4d79f9be3e\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"2da1b873bf2c4a55eb39bbd2e28319020e32cee0409239c1fc71bc3889c3e3f5\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1125,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"e0ff0638722fa81ca2809c64c12190ff1dbe94bdbb30065ebc8878fc07848f91de5d3f6da0dee00173af4db7d17a0031ac73616e15af616fb7d2602d48c50500\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"cc4fdd731ba587bffa648cf2bd3ccdf78b235e64f12024613ecfdd4d79f9be3e\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "cc4fdd731ba587bffa648cf2bd3ccdf78b235e64f12024613ecfdd4d79f9be3e", + "path": "primary", + "counted": 498, + "transferred": 498, + "presented": true + }, + { + "content_hash": "2da1b873bf2c4a55eb39bbd2e28319020e32cee0409239c1fc71bc3889c3e3f5", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931420100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a317d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2263633466646437333162613538376266666136343863663262643363636466373862323335653634663132303234363133656366646434643739663962653365222c2270726576223a2263633466646437333162613538376266666136343863663262643363636466373862323335653634663132303234363133656366646434643739663962653365222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "043855bdf39c74faa375865d649ad8d49e606979a0a50631379a5b7748ea8867" + } + }, + { + "name": "session_stray_refines_wai2_rendition_accept", + "about": "a WAI2 selectable rendition carrying a refines, picked: a rendition by its capability (its envelope offers no refinement, having none)", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":438,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"8b7aa37174862ec938bef64b91aa4027b07b78baa593c7d49699f82cb8fb4d69\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":438,\"uncounted\":0,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"dca88360169467cf4dbc03beba166a257a223e750dcdae9d45d8045615ebc6cb1df955acf0c0be7e524c58c05f7a39cdc239c8c9ca1f14fd102c5ef45a5f4305\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"8b7aa37174862ec938bef64b91aa4027b07b78baa593c7d49699f82cb8fb4d69\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "8b7aa37174862ec938bef64b91aa4027b07b78baa593c7d49699f82cb8fb4d69", + "path": "primary", + "counted": 438, + "transferred": 438, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932000100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a317d7d5d2c22746172676574223a6e756c6c7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "c3fcaa28e2c7bb1b83e833ce5a57f5f8cbfbcb446ff87615cca740ee05b9bd4e" + } + }, + { + "name": "session_refines_span_past_base_alone", + "about": "a layer whose span is unit 4 alone, over a held base of units 0 to 3, its payload one unit", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":955,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"e24c4c73db474e004f174e4ab5739cbd25979e4862791453cdc7ec72285cfc50\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"6889f973e8e095b18ffb43d488aa28c8bdecd24fc3f981a0b2886e12d2d9c4a6\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":955,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b16a31422644cbad529bdc24c46dc8c8bd42959b5a520c54364b28f9b81f69c4a341a18f5c198b18a5bdfb0cfb5b531707ddadff0453367c0fcd68cab5b29c01\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 2, + "decoder": 1, + "out_digest": "b08552fad84124984d9f9dfdf77cf19bd014e953cd91dc0d0db2d1afda04dea7" + } + ], + "objects": [ + { + "content_hash": "d09526cec3961c21e36cc08f0b393323eb82dcc4203cb08df57fee36784b1113", + "path": "primary", + "counted": 328, + "transferred": 328, + "presented": true + }, + { + "content_hash": "e24c4c73db474e004f174e4ab5739cbd25979e4862791453cdc7ec72285cfc50", + "path": "primary", + "counted": 627, + "transferred": 627, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414931980000007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22746172676574223a6e756c6c7da40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + }, + { + "envelope": "574149315f0100007b22776169223a22312e30222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c226d6f64656c5f726571756972656d656e74223a7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65227d2c22636f6e646974696f6e696e67223a7b226b696e64223a226e6f6e65227d2c22726566696e6573223a7b2262617365223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c2270726576223a2264303935323663656333393631633231653336636330386630623339333332336562383264636334323033636230386466353766656533363738346231313133222c226c61796572223a312c227370616e223a7b2266726f6d223a342c22636f756e74223a317d7d2c22746172676574223a6e756c6c7d08010000574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_wai2_refines_span_past_base_alone", + "about": "a refinement component whose span is unit 4 alone, over its base of units 0 to 3, its payload one unit", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":892,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"f46ee5dc635ad08d1266b70bd61f723f6ff6171a947d9ce530e7b50cc54e52f4\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"f46ee5dc635ad08d1266b70bd61f723f6ff6171a947d9ce530e7b50cc54e52f4\",\"path\":\"primary\",\"pin\":null,\"rendition\":1,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"6889f973e8e095b18ffb43d488aa28c8bdecd24fc3f981a0b2886e12d2d9c4a6\",\"primary_units\":5,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":892,\"uncounted\":0,\"units\":5},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"b19f5c4a946db78ee11ebdf5000248ab146db6418690d58a0ca01e1e1167500bec03f4d5d58a48a402630a8af804f7ba8d05767dff2b30e843f46a7e583c8d09\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"f46ee5dc635ad08d1266b70bd61f723f6ff6171a947d9ce530e7b50cc54e52f4\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 4, + "layers": 2, + "decoder": 1, + "out_digest": "b08552fad84124984d9f9dfdf77cf19bd014e953cd91dc0d0db2d1afda04dea7" + } + ], + "objects": [ + { + "content_hash": "f46ee5dc635ad08d1266b70bd61f723f6ff6171a947d9ce530e7b50cc54e52f4", + "path": "primary", + "counted": 892, + "transferred": 892, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932b60100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a342c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d020000000000a4000000a4000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, { "name": "session_no_classical_accept", "about": "a session with no classical length, beside an envelope whose second rendition is WAI's own", diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index e14eceaad..370699581 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -1105,10 +1105,15 @@ inert envelope no decoder entry names is an object received, neither counted (it other, so the session accounts for every byte it transferred. Each rendition of a readable `WAI2` envelope is also its exploded envelope (SPEC §7.1, *Exploding a component*), the same object (staged-delivery §9): a decoder entry names it either by -that `WAI2` envelope and its `rendition`, or by the exploded envelope's content hash. A -**held layer** is a readable `WAI1` envelope that carries `refines` or is of a -refinement-only capability (SPEC §5), or a rendition of a readable `WAI2` envelope that -carries `refines`, is marked a refinement, or is of a refinement-only capability. Its +that `WAI2` envelope and its `rendition`, or by the exploded envelope's content hash. An +entry naming it by that content hash, with no `rendition`, is read as naming the +rendition, by every rule below — unless the verifier holds the exploded envelope's own +bytes, a separate delivery (staged-delivery §9, [http-delivery](http-delivery.md) +§10.4) that the rules read as the `WAI1` envelope it is. A **held layer** is a readable +`WAI1` envelope of a refinement-only capability (SPEC §5), or a rendition of a readable +`WAI2` envelope of one: dispatch and selection go by capability, so an envelope or a +rendition of any other capability is a base, a `refines` it carries ignored (SPEC §4, +staged-delivery §3). Its **base** is named by `refines.base`: in a `WAI1` layer by a content hash, of a `WAI1` envelope or of a `WAI2` rendition's exploded envelope; in a `WAI2` rendition by the `id` of a rendition of the same envelope. The base is **held** when the verifier holds a @@ -1123,7 +1128,11 @@ the others need the envelopes and the claim. In order: 2. Where it holds the objects as well, each object listed with an envelope's content hash states as `counted` that envelope's counted bytes (staged-measurement §3), and `null` exactly when it is not countable (`session_counted_mismatch`). -3. Each envelope a decoder entry names is readable (`session_envelope_unreadable`). +3. Each envelope a decoder entry names is readable, or encrypted — a well-formed + envelope whose `security` names an encryption, which a sink holding the key decrypts + and dispatches (SPEC §6.4 step 3) (`session_envelope_unreadable`). The verifier holds + no key, so what an entry naming an encrypted envelope states of it is the signer's + statement, and the rules below read nothing of it, as of an envelope not held. 4. Each decoder entry whose `object` is a readable envelope names what that envelope gives, as a sink dispatches it: of a `WAI2` envelope, a `rendition`, the capability that rendition has, a rendition selectable or a layer — never a companion, which is @@ -1132,21 +1141,22 @@ the others need the envelopes and the claim. In order: is not a layer, no `rendition` and the manifest's `capability` or its `fallback`, a capability a sink dispatches, in a manifest whose `capability` is not companion-only (SPEC §4); of a `WAI1` layer, no `rendition` and its `capability`. And each decoder - entry whose `rendition` is not `null` has its `object` among the readable envelopes, - which hold every `WAI2` envelope the session received (`session_source_mismatch`). A + entry whose `rendition` is not `null` has its `object` among the readable or encrypted + envelopes, which hold every `WAI2` envelope the session received + (`session_source_mismatch`). A signer cannot relabel a decoder entry whose envelope the verifier holds, and so cannot move a presentation through it out of the reach of the re-decode check above. 5. Each decoder entry whose `object` is a held layer names one a sink can apply (`session_layer_not_applicable`); a sink refuses any other (staged-delivery §4.1, SPEC §7.1), so no presentation through it is possible: - - its capability is refinement-only and, in a `WAI1` manifest, its `fallback` is - `null` (`capability-not-refinement`); its `refines` is present and reads as - staged-delivery §3 defines it, with component ids in a `WAI2` rendition + - in a `WAI1` manifest, its `fallback` is `null` (`capability-not-refinement`), and + its `refines` is present and reads as staged-delivery §3 defines it (`refines-malformed`); - - a `WAI2` rendition conforms as a refinement component (SPEC §7.1): it is marked a - refinement and carries `id` and `sha256`; its base is a selectable rendition - carrying both; each producer `prev` names is a selectable rendition, or a - refinement before it, carrying both; and no selectable rendition follows it; + - a `WAI2` rendition is offered only from an envelope every component of which + conforms (SPEC §7.1, *Refinement components*; the reference + `WaiMulti::check_component_roles`): a refinement component that does not, or a + companion, an `id` or another component that breaks a rule of §7.1 or §5, leaves + none of the envelope's refinements offered; - its base, where held, is a base — not a layer, and a selectable rendition where it is a `WAI2` rendition — whose own capability the layer's admits (`base-not-admitted`, step 4); @@ -1235,7 +1245,8 @@ on the sink's limits; each unit's producer, conflict, geometry and deadline (ste 7–10) and the hold bound and batches (§4.3–§4.4), which turn on the order and the times of arrival the sink alone saw, while the `stage` claims bound the stages a unit reached and a re-decode its output; a pin's resolution at the sink, its module authorisation and -its key log (SPEC §3.1, §4), which a decoder entry's `pin` and `tier` state; and a +its key log (SPEC §3.1, §4), which a decoder entry's `pin` and `tier` state; what a sink +holding an encrypted envelope's key decoded from it (SPEC §6.4); and a companion's conformance (SPEC §7.1), which does not decide whether the rendition it binds to is presented. Nothing binds a `stage` claim to a session beyond its base and its key: a `stage` claim the same key signed about the same base in @@ -2476,7 +2487,15 @@ moved, past the frames of a base decoded through its manifest's `fallback`, the where the fallback's format and not the capability's is the payload's, and past a `WAI2` base component a `WAI1` layer refines by its exploded envelope (`session_unit_outside_object`); a held inert envelope listed with counted bytes 0 -(`session_counted_mismatch`); entries a sink cannot have decoded through — a `WAI2` +(`session_counted_mismatch`); an encrypted envelope an entry names, accepted, and its +classical length not read; entries naming a `WAI2` rendition by its exploded envelope's +content hash, held as the `WAI2` alone — accepted, relabelled, past its frames, a +refinement off its base's first unit and one whose envelope does not conform — and a +refinement's exploded envelope received on its own, accepted; bases whose manifest or +rendition carries a stray `refines`, accepted, and a layer over one; a refinement of an +envelope that does not conform — a refinement before a selectable rendition, a base +rendition with no `sha256`, a layer before its producer, an unbound companion — and two +that do, beside a companion; entries a sink cannot have decoded through — a `WAI2` companion, a rendition or a refinement whose payload does not match its `sha256`, a `WAI1` envelope whose capability is companion-only, and a fallback that is (`session_source_mismatch`); held layers a sink cannot apply — layer 0, a span past or diff --git a/wai/extensions/staged-delivery.md b/wai/extensions/staged-delivery.md index 088a71132..e1c1ffd7a 100644 --- a/wai/extensions/staged-delivery.md +++ b/wai/extensions/staged-delivery.md @@ -40,7 +40,11 @@ base, by the base's publisher or by a party the sink accepts (§10.1). A `WAI1` manifest whose `model_requirement.capability` is refinement-only **MUST** carry `refines`, and its `model_requirement.fallback` **MUST** be `null`. A manifest -whose capability is not refinement-only **MUST NOT** carry it. +whose capability is not refinement-only **MUST NOT** carry it. A sink routes an +envelope by its capability: one whose capability is refinement-only is a layer, which +§4 processes; any other is a base, dispatched by SPEC §4, and a `refines` it carries is +ignored. Likewise a `WAI2` rendition is a layer only when its capability is +refinement-only (SPEC §7.1). ```json "refines": { "base": "<64 hex>", diff --git a/wai/wai-rs/src/bin/wai_cli/stage.rs b/wai/wai-rs/src/bin/wai_cli/stage.rs index 4d76f9340..e061f3632 100644 --- a/wai/wai-rs/src/bin/wai_cli/stage.rs +++ b/wai/wai-rs/src/bin/wai_cli/stage.rs @@ -314,7 +314,9 @@ fn apply(args: &[String]) -> Result<(), String> { let object = wai::jwp_hash::content_hash(&bytes); match Wai::from_bytes(&bytes) { Err(_) => ("offer", object, Err("not-wai1"), vec![]), - Ok(w) if w.manifest.refines.is_some() || wai::codecs::is_refinement_only(w.capability()) => { + // Routed by capability (SPEC §4, staged-delivery §3): a refinement-only + // capability is a layer; any other is a base, a `refines` on it ignored. + Ok(w) if wai::codecs::is_refinement_only(w.capability()) => { chain_of = w.refines().and_then(Result::ok).and_then(|r| unhex32(&r.base)); match sink.offer(&bytes, i as u64, ReceiptEvidence::None) { Ok(r) => ("offer", object, Ok(r), vec![]), @@ -646,7 +648,14 @@ fn explode(args: &[String]) -> Result<(), String> { [p, i] => (p, i.parse::().map_err(|e| e.to_string())?), _ => return Err("wai stage explode [-o out.wai]".into()), }; - let bytes = WaiMulti::explode(&read(path)?, i).map_err(|e| e.to_string())?; + let envelope = read(path)?; + // A sink offers a WAI2's refinements only when its components all conform (SPEC §7.1, + // *Refinement components*): explode gives none of a nonconforming envelope. + let w = WaiMulti::from_bytes(&envelope).map_err(|e| e.to_string())?; + if w.manifest.renditions.get(i).is_some_and(|m| m.is_refinement()) { + w.check_component_roles().map_err(|e| format!("{path}: no refinement is offered from it: {e}"))?; + } + let bytes = WaiMulti::explode(&envelope, i).map_err(|e| e.to_string())?; println!("component {i}: {} B content hash {}", bytes.len(), hex(&wai::jwp_hash::content_hash(&bytes))); if let Some(out) = opt(args, "-o") { std::fs::write(out, &bytes).map_err(|e| format!("write {out}: {e}"))?; diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index ed4e09743..184fa77e5 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -3500,7 +3500,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 527 + 545 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index b60fb7953..f8c1018fd 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -999,12 +999,22 @@ pub(super) fn vectors() -> Vec { vec![classical_envelope()], Err(Reason::SessionClassicalMismatch), )); + // An encrypted envelope an entry names: a sink holding its key decrypts and dispatches + // it (SPEC §6.4 step 3), so the verifier, holding no key, checks nothing of it further; + // nor does it read a classical length from it. + v.push(env( + "session_envelope_encrypted_named_accept", + "the WAI2 envelope encrypted, its first rendition decoded by a sink that holds the key: what the entry names of it is the signer's statement, and no classical length is read from it", + SessionClaim { classical_declared: None, classical_source: None, ..m() }, + vec![encrypted_envelope()], + Ok(()), + )); v.push(env( "session_envelope_encrypted", - "the WAI2 envelope encrypted: inert at every sink that cannot open it", + "the WAI2 envelope encrypted, with the classical length its plaintext would give stated: the verifier reads no classical rendition from an envelope it cannot open", m(), vec![encrypted_envelope()], - Err(Reason::SessionEnvelopeUnreadable), + Err(Reason::SessionClassicalMismatch), )); let unreadable_wai1 = b"WAI1\x02\x00\x00\x00{}\x00\x00\x00\x00".to_vec(); let neither = b"WAI3\x00\x00\x00\x00".to_vec(); @@ -1082,6 +1092,7 @@ pub(super) fn vectors() -> Vec { v.extend(held_vectors()); v.extend(apply_vectors()); v.extend(sweep_vectors()); + v.extend(resolve_vectors()); v.push(env( "session_no_classical_accept", "a session with no classical length, beside an envelope whose second rendition is WAI's own", @@ -2244,11 +2255,11 @@ fn sweep_vectors() -> Vec { )); v.push(one_layer( "session_refines_on_a_base_capability", - "a WAI1 envelope of wai.video.int_hyper carrying refines, applied as a layer: refines on a capability that is not refinement-only", + "a WAI1 envelope of wai.video.int_hyper carrying refines, presented at two layers: its capability makes it a base, the refines ignored, and a base gives one layer", wai1_of(HYPER, None, Some(refines(&bh, json!(bh), 1, Some((1, 1)))), wir1_payload(1)), HYPER, pres(1, 2, 1), - Some(Reason::SessionLayerNotApplicable), + Some(Reason::SessionLayersMismatch), )); v.push(one_layer( "session_layer_payload_units_short", @@ -2342,6 +2353,229 @@ fn sweep_vectors() -> Vec { v } +/// Round six of §2.4.12 against the envelopes: an entry naming a `WAI2` rendition by its +/// exploded envelope's content hash is that rendition; a `WAI2`'s refinements are offered +/// only when every component conforms (SPEC §7.1); a manifest whose capability is not +/// refinement-only is a base whatever `refines` it carries; and a span past a held base, +/// with the payload's count right. +fn resolve_vectors() -> Vec { + // `held` the envelopes the verifier holds, `listed` the objects received (presented + // where an entry names one), the first the session's entry object. + let vector = |name: &'static str, about: &'static str, held: Vec>, listed: Vec>, decoders: Vec, ps: Vec, reason: Option| { + let named: Vec<[u8; 32]> = decoders.iter().map(|d| d.object).collect(); + let objects: Vec = listed + .iter() + .map(|e| { + let h = object_content_hash(e); + ObjectSeen { content_hash: h, path: SessionPath::Primary, counted: counted_of(e), transferred: e.len() as u64, presented: named.contains(&h) } + }) + .collect(); + let s = SessionClaim { + session_nonce: crate::pin::sha256(b"claim-conformance: a session over the envelopes it holds"), + decoders, + switches: vec![], + switches_total: 0, + deadline_us: None, + missed: 0, + missed_units: vec![], + stage_sets: vec![], + receipt_bytes: 0, + classical_declared: None, + classical_source: None, + ..model() + }; + let c = sealed_about(object_content_hash(&listed[0]), counted_from(restated(s, &ps), &objects)); + let v = match reason { + None => claim(name, about, c.to_json(), Ok(())), + Some(r) => reject(name, about, c.to_json(), 6, r), + }; + with(with(with(v, "outputs", outputs_value(&ps)), "objects", objects_value(&objects)), "envelopes", envelopes_value(&held)) + }; + let h = |e: &[u8]| object_content_hash(e); + let dec = |cap: &str, rendition: Option, object: &[u8], first_unit: u64| entry_decoder(cap, SessionPath::Primary, false, rendition, h(object), first_unit, 0); + let four = |d: u16| -> Vec { (0..4).map(|u| pres(u, 1, d)).collect() }; + let and = |mut ps: Vec, more: &[Presentation]| { + ps.extend_from_slice(more); + ps + }; + let rc = |base: &str, prev: &str, layer: u64, span: Option<(u64, u64)>| { + let mut r = json!({ "base": base, "prev": prev, "layer": layer }); + if let Some((from, count)) = span { + r["span"] = json!({ "from": from, "count": count }); + } + r + }; + const HYPER: &str = "wai.video.int_hyper"; + const REFINE: &str = "wai.video.int_refine"; + let base_c = || component_of(HYPER, "b", None, None, wiv1(4), None); + let refinement = |cap: &str, id: &str, r: Value, units: usize| component_of(cap, id, Some("refinement"), Some(r), wir1_payload(units), None); + let mut v = Vec::new(); + + // An entry naming a WAI2 rendition by its exploded envelope's content hash, with only + // the WAI2 held, is that rendition: rules 4-8 read it so. + let w = wai2_of(vec![base_c()]); + let x = WaiMulti::explode(&w, 0).expect("the base's exploded envelope"); + for (name, about, cap, ps, reason) in [ + ("session_alias_entry_accept", "the base's entry names the WAI2's base rendition by its exploded envelope's content hash, with only the WAI2 held", HYPER, four(0), None), + ("session_alias_entry_relabelled", "the same entry relabelled wai.video.av1, a capability the rendition does not have", "wai.video.av1", four(0), Some(Reason::SessionSourceMismatch)), + ("session_alias_entry_unit_past_the_base", "the same entry, and unit 1000 presented through it, past the rendition's four frames", HYPER, and(four(0), &[pres(1000, 1, 0)]), Some(Reason::SessionUnitOutsideObject)), + ] { + v.push(vector(name, about, vec![w.clone()], vec![x.clone(), w.clone()], vec![dec(cap, None, &x, 0)], ps, reason)); + } + let wr = wai2_of(vec![base_c(), refinement(REFINE, "r", rc("b", "b", 1, Some((1, 1))), 1)]); + let xr = WaiMulti::explode(&wr, 1).expect("the refinement's exploded envelope"); + v.push(vector( + "session_alias_refinement_entry_first_unit", + "a refinement named by its exploded envelope's content hash at first_unit 50, while the entry naming its base rendition states 0", + vec![wr.clone()], + vec![wr.clone(), xr.clone()], + vec![dec(HYPER, Some(0), &wr, 0), dec(REFINE, None, &xr, 50)], + and(four(0), &[pres(51, 2, 1)]), + Some(Reason::SessionFirstUnitMismatch), + )); + let wn = wai2_of(vec![base_c(), refinement("wai.image.int_refine", "r", rc("b", "b", 1, Some((1, 1))), 1)]); + let xn = WaiMulti::explode(&wn, 1).expect("the refinement's exploded envelope"); + v.push(vector( + "session_alias_refinement_entry_not_admitted", + "a wai.image.int_refine refinement over the video base, named by its exploded envelope's content hash: the envelope does not conform, so no refinement of it is offered", + vec![wn.clone()], + vec![wn.clone(), xn.clone()], + vec![dec(HYPER, Some(0), &wn, 0), dec("wai.image.int_refine", None, &xn, 0)], + and(four(0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + + // SPEC §7.1: a WAI2's refinements are offered only when every component conforms. + let wp = wai2_of(vec![base_c(), refinement(REFINE, "r", rc("b", "b", 1, Some((1, 1))), 1), component_of("wai.video.int_motion", "m", None, None, wiv1(4), None)]); + let xp = WaiMulti::explode(&wp, 1).expect("the refinement's exploded envelope"); + v.push(vector( + "session_roles_refinement_before_selectable_exploded", + "a refinement placed before a selectable rendition, named by its exploded envelope's content hash with only the WAI2 held: one verdict with the rendition named by index", + vec![wp.clone()], + vec![wp.clone(), xp.clone()], + vec![dec(HYPER, Some(0), &wp, 0), dec(REFINE, None, &xp, 0)], + and(four(0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + v.push(vector( + "session_roles_exploded_layer_delivered_alone_accept", + "the same refinement's exploded envelope received on its own and held: a WAI1 layer, a separate delivery staged-delivery §4 processes alone, over the WAI2's base rendition", + vec![wp.clone(), xp.clone()], + vec![wp.clone(), xp.clone()], + vec![dec(HYPER, Some(0), &wp, 0), dec(REFINE, None, &xp, 0)], + and(four(0), &[pres(1, 2, 1)]), + None, + )); + let wf = wai2_of(vec![ + { + let mut b = base_c(); + b.meta.sha256 = None; + b + }, + refinement(REFINE, "r", rc("b", "b", 1, Some((1, 1))), 1), + ]); + v.push(vector( + "session_roles_base_without_sha256", + "a refinement whose base rendition states no sha256: the refinement does not conform, so it is not offered", + vec![wf.clone()], + vec![wf.clone()], + vec![dec(HYPER, Some(0), &wf, 0), dec(REFINE, Some(1), &wf, 0)], + and(four(0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + let wg = wai2_of(vec![base_c(), refinement(REFINE, "r2", rc("b", "r1", 2, None), 4), refinement(REFINE, "r1", rc("b", "b", 1, None), 4)]); + v.push(vector( + "session_roles_layer_before_its_prev", + "layer 2 listed before the layer 1 it names as its producer: its prev names no refinement before it", + vec![wg.clone()], + vec![wg.clone()], + vec![dec(HYPER, Some(0), &wg, 0), dec(REFINE, Some(2), &wg, 0), dec(REFINE, Some(1), &wg, 0)], + { + let mut ps = four(0); + ps.extend((0..4).map(|u| pres(u, 2, 1))); + ps.extend((0..4).map(|u| pres(u, 3, 2))); + ps + }, + Some(Reason::SessionLayerNotApplicable), + )); + let companion = |of: Option<&str>, of_id: Option<&str>| { + use crate::container::RenditionMeta; + let hdr = b"HDR10+ metadata".to_vec(); + let mut meta = RenditionMeta::new("wai.meta.hdr10plus", "hdr10plus"); + meta.id = Some("h".into()); + meta.role = Some("companion".into()); + meta.companion_of = of.map(Into::into); + meta.companion_of_id = of_id.map(Into::into); + meta.sha256 = Some(crate::pin::sha256_hex(&hdr)); + Rendition::from_meta(meta, hdr) + }; + for (name, about, comp, reason) in [ + ("session_roles_unbound_companion", "a refinement beside a companion with no companion_of: the envelope does not conform, so its refinement is not offered", companion(None, None), Some(Reason::SessionLayerNotApplicable)), + ("session_roles_companion_and_refinement_accept", "a refinement beside an HDR10+ companion bound to the base rendition by capability: every component conforms", companion(Some(HYPER), None), None), + ("session_roles_companion_by_id_and_refinement_accept", "the same, the companion bound by id", companion(Some(HYPER), Some("b")), None), + ] { + let e = wai2_of(vec![base_c(), comp, refinement(REFINE, "r", rc("b", "b", 1, Some((1, 1))), 1)]); + v.push(vector(name, about, vec![e.clone()], vec![e.clone()], vec![dec(HYPER, Some(0), &e, 0), dec(REFINE, Some(2), &e, 0)], and(four(0), &[pres(1, 2, 1)]), reason)); + } + + // A manifest whose capability is not refinement-only is a base: a refines it carries is + // ignored (SPEC §4, staged-delivery §3). + let base = base_envelope(); + let stray = wai1_of(HYPER, None, Some(rc(&hex(&h(&base)), &hex(&h(&base)), 1, None)), wiv1(4)); + v.push(vector( + "session_stray_refines_base_accept", + "a WAI1 base of wai.video.int_hyper whose manifest carries a refines, presented as a base", + vec![stray.clone()], + vec![stray.clone()], + vec![dec(HYPER, None, &stray, 0)], + four(0), + None, + )); + let over = wai1_of(REFINE, None, Some(rc(&hex(&h(&stray)), &hex(&h(&stray)), 1, Some((1, 1)))), wir1_payload(1)); + v.push(vector( + "session_stray_refines_layer_over_it_accept", + "a layer over that base: a base, whatever refines it carries", + vec![stray.clone(), over.clone()], + vec![stray.clone(), over.clone()], + vec![dec(HYPER, None, &stray, 0), dec(REFINE, None, &over, 0)], + and(four(0), &[pres(1, 2, 1)]), + None, + )); + let wx = wai2_of(vec![component_of(HYPER, "b", None, Some(rc("b", "b", 1, None)), wiv1(4), None)]); + v.push(vector( + "session_stray_refines_wai2_rendition_accept", + "a WAI2 selectable rendition carrying a refines, picked: a rendition by its capability (its envelope offers no refinement, having none)", + vec![wx.clone()], + vec![wx.clone()], + vec![dec(HYPER, Some(0), &wx, 0)], + four(0), + None, + )); + + // A span past a held base with the payload's unit count right: the span check alone. + let past = wai1_of(REFINE, None, Some(rc(&hex(&h(&base)), &hex(&h(&base)), 1, Some((4, 1)))), wir1_payload(1)); + v.push(vector( + "session_refines_span_past_base_alone", + "a layer whose span is unit 4 alone, over a held base of units 0 to 3, its payload one unit", + vec![base.clone(), past.clone()], + vec![base.clone(), past.clone()], + vec![dec(HYPER, None, &base, 0), dec(REFINE, None, &past, 0)], + and(four(0), &[pres(4, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + let wpast = wai2_of(vec![base_c(), refinement(REFINE, "r", rc("b", "b", 1, Some((4, 1))), 1)]); + v.push(vector( + "session_wai2_refines_span_past_base_alone", + "a refinement component whose span is unit 4 alone, over its base of units 0 to 3, its payload one unit", + vec![wpast.clone()], + vec![wpast.clone()], + vec![dec(HYPER, Some(0), &wpast, 0), dec(REFINE, Some(1), &wpast, 0)], + and(four(0), &[pres(4, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + v +} + /// A session of `units` units, each presented once, with `missed` presentations missed /// and `written` of them written, and `switches` switches with `switched` written. fn capped(missed: u64, written: u64, switches: u64, switched: u64, units: u64) -> SessionClaim { diff --git a/wai/wai-rs/src/claim_receipt/session.rs b/wai/wai-rs/src/claim_receipt/session.rs index 4f0fe3961..f094e3dbd 100644 --- a/wai/wai-rs/src/claim_receipt/session.rs +++ b/wai/wai-rs/src/claim_receipt/session.rs @@ -946,26 +946,31 @@ impl ClaimReceipt { /// envelope's counted bytes (staged-measurement §3), and `null` exactly when it is not /// countable (`session_counted_mismatch`); /// 3. each envelope a decoder entry names reads as a `WAI1` or `WAI2` envelope (SPEC §2, - /// §7.1) whose payloads are plaintext (`session_envelope_unreadable`); one no entry - /// names may be inert — encrypted (SPEC §6.4), or not an envelope at all — and is then - /// a received object that is neither counted nor presented; + /// §7.1) whose payloads are plaintext, or is encrypted — a sink holding its key + /// decrypts and dispatches it (SPEC §6.4 step 3), and the rules below read nothing of + /// it, as of an envelope not held (`session_envelope_unreadable`); one no entry names + /// may be inert — encrypted, or not an envelope at all — and is then a received object + /// that is neither counted nor presented. An entry naming a held `WAI2` rendition by + /// its exploded envelope's content hash, with no rendition, is read from here on as + /// naming that rendition, unless the exploded envelope's own bytes are held; /// 4. each decoder entry whose object is one of them names what it gives, as a sink /// dispatches it — a rendition of a `WAI2` envelope and that rendition's capability, /// a rendition selectable or a layer, whose payload matches its stated `sha256` /// (SPEC §7.1, *Selection algorithm*); or no rendition and a `WAI1` envelope's /// capability or fallback, dispatchable, of a manifest whose capability is not /// companion-only (SPEC §4), where the envelope is not a layer — and each entry - /// naming a rendition has its object among the readable envelopes + /// naming a rendition has its object among the readable or encrypted envelopes /// (`session_source_mismatch`); /// 5. each decoder entry whose object is a held layer — a `WAI1` envelope, or a `WAI2` - /// rendition, that carries `refines`, is a refinement, or is of a refinement-only - /// capability — names one a sink can apply (`session_layer_not_applicable`): of a - /// refinement-only capability with no fallback, its `refines` well formed - /// (staged-delivery §3, §4.1 step 1); a `WAI2` refinement conforming as SPEC §7.1 - /// states; its base, where held — a `WAI1` envelope by its content hash, or a `WAI2` - /// rendition by its component id or its exploded envelope's content hash, the same - /// object (staged-delivery §9) — a base whose capability the layer admits (§4.1 step - /// 4); where entries name the base, one decoding it through a capability the layer + /// rendition, of a refinement-only capability; any other is a base, a `refines` it + /// carries ignored — names one a sink can apply (`session_layer_not_applicable`): a + /// `WAI1` layer with no fallback and its `refines` well formed (staged-delivery §3, + /// §4.1 step 1); a `WAI2` rendition of an envelope every component of which conforms + /// (SPEC §7.1, [`crate::container::ManifestV2::check_component_roles`]); its base, + /// where held — a `WAI1` envelope by its content hash, or a `WAI2` rendition by its + /// component id or its exploded envelope's content hash, the same object + /// (staged-delivery §9) — a base whose capability the layer admits (§4.1 step 4); + /// where entries name the base, one decoding it through a capability the layer /// admits, and the base's own where it is held, not its fallback (§4.1 step 3); where /// the base's units are read, a span within them and runs that sum to those it covers /// (§4.1 step 2); and a `WIR1` payload of its unit kind with a unit for each it @@ -1016,8 +1021,19 @@ impl ClaimReceipt { _ => None, } }; + // An envelope a sink holding its key decrypts and dispatches (SPEC §6.4 step 3): well + // formed, with a `security` object naming an encryption. + let encrypted_one = |bytes: &[u8]| -> bool { + match bytes.get(..4) { + Some(b"WAI2") => WaiMulti::from_bytes(bytes) + .is_ok_and(|w| matches!(crate::container::manifest_v2_security(&w.manifest), Ok(Some(x)) if !x.is_plaintext())), + Some(b"WAI1") => Wai::from_bytes(bytes).is_ok_and(|w| w.manifest.security.as_ref().is_some_and(|x| !x.is_plaintext())), + _ => false, + } + }; let mut read: Vec<([u8; 32], Read)> = Vec::new(); let mut inert: Vec<[u8; 32]> = Vec::new(); + let mut encrypted: Vec<[u8; 32]> = Vec::new(); // Each rendition of a readable WAI2 envelope is also its exploded envelope (SPEC // §7.1), the same object (staged-delivery §9): (the exploded envelope's content // hash, the envelope's, the rendition). @@ -1037,21 +1053,41 @@ impl ClaimReceipt { } read.push((h, r)); } + None if encrypted_one(bytes) => encrypted.push(hash(bytes)), None => inert.push(hash(bytes)), } } - // 3. An envelope a decoder entry names is readable. - if s.decoders.iter().any(|d| inert.contains(&d.object) && !read.iter().any(|(h, _)| *h == d.object)) { + let held = |object: &[u8; 32]| read.iter().find(|(h, _)| h == object).map(|(_, r)| r); + // 3. An envelope a decoder entry names is readable, or encrypted: a sink holding its + // key decrypts it, and the verifier, holding no key, checks nothing further of it. + if s.decoders.iter().any(|d| inert.contains(&d.object) && held(&d.object).is_none() && !encrypted.contains(&d.object)) { return Err(Rejection::at(6, Reason::SessionEnvelopeUnreadable)); } - let held = |object: &[u8; 32]| read.iter().find(|(h, _)| h == object).map(|(_, r)| r); + // Each entry as the envelopes resolve it: an entry naming a held WAI2 rendition by + // its exploded envelope's content hash, with no rendition, names that rendition — + // unless the exploded envelope's own bytes are held, a separate delivery. + let resolved: Vec<([u8; 32], Option)> = s + .decoders + .iter() + .map(|d| { + if d.rendition.is_none() + && held(&d.object).is_none() + && let Some(&(_, w, j)) = exploded.iter().find(|(x, ..)| *x == d.object) + { + return (w, Some(j)); + } + (d.object, d.rendition) + }) + .collect(); let refinement_only = crate::codecs::is_refinement_only; - // A rendition that is a layer: it carries `refines`, is marked a refinement, or is of - // a refinement-only capability; likewise a WAI1 manifest. - let layer_entry = |m: &crate::container::RenditionMeta| m.refines.is_some() || m.is_refinement() || refinement_only(&m.capability); - let layer_one = |w: &Wai| w.manifest.refines.is_some() || refinement_only(w.capability()); + // A layer is decided by its capability (SPEC §4, staged-delivery §3): a manifest or a + // rendition of a refinement-only capability; any other is a base, a `refines` it + // carries ignored. + let layer_entry = |m: &crate::container::RenditionMeta| refinement_only(&m.capability); + let layer_one = |w: &Wai| refinement_only(w.capability()); // 4. Each entry names what its envelope gives, as a sink dispatches it. - for d in &s.decoders { + for (d, &(object, rendition)) in s.decoders.iter().zip(&resolved) { + let d = &DecoderEntry { object, rendition, ..d.clone() }; let gives = match held(&d.object) { Some(Read::Multi(w)) => usize::try_from(d.rendition.unwrap_or(u64::MAX)).ok().is_some_and(|i| { w.manifest.renditions.get(i).is_some_and(|m| { @@ -1063,7 +1099,7 @@ impl ClaimReceipt { && (w.capability() == d.capability || w.fallback() == Some(d.capability.as_str())) && (layer_one(w) || (crate::codecs::is_dispatchable(&d.capability) && !crate::codecs::is_companion_only(w.capability()))) } - None => d.rendition.is_none(), + None => d.rendition.is_none() || encrypted.contains(&d.object), }; if !gives { return Err(Rejection::at(6, Reason::SessionSourceMismatch)); @@ -1078,7 +1114,7 @@ impl ClaimReceipt { } let component = |w: &WaiMulti, j: usize| -> Base { let m = &w.manifest.renditions[j]; - Base { capability: m.capability.clone(), units: payload_units(&m.capability, &w.renditions[j]), is_base: m.is_selectable() && m.refines.is_none() } + Base { capability: m.capability.clone(), units: payload_units(&m.capability, &w.renditions[j]), is_base: m.is_selectable() } }; // The base a layer names, where held: a WAI1 envelope by its content hash, or a WAI2 // rendition, by its exploded envelope's content hash or by its envelope and index. @@ -1131,7 +1167,9 @@ impl ClaimReceipt { let naming: Vec<&DecoderEntry> = s .decoders .iter() - .filter(|e| hashes.contains(&e.object) || e.rendition.is_some_and(|j| pairs.contains(&(e.object, j)))) + .zip(&resolved) + .filter(|(e, (o, r))| hashes.contains(&e.object) || hashes.contains(o) || r.is_some_and(|j| pairs.contains(&(*o, j)))) + .map(|(e, _)| e) .collect(); let over: Vec = naming .iter() @@ -1150,56 +1188,45 @@ impl ClaimReceipt { } Gives::Layer { layers, span, first_units: over } }; - let gives = |d: &DecoderEntry| -> Option { - match held(&d.object)? { + let gives = |k: usize| -> Option { + let (object, rendition) = resolved[k]; + match held(&object)? { Read::One(w) => { if !layer_one(w) { return Some(Gives::Base(base_units(w.capability(), w.fallback(), &w.payload))); } let Some(Ok(r)) = w.refines() else { return Some(Gives::NotApplicable) }; - if !refinement_only(w.capability()) || w.fallback().is_some() { + if w.fallback().is_some() { return Some(Gives::NotApplicable); } let base = unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok())?; Some(layer_of(w.capability(), &r, base_by_hash(&base), names_of(Some(base), None), &w.payload)) } Read::Multi(w) => { - let i = usize::try_from(d.rendition?).ok()?; + let i = usize::try_from(rendition?).ok()?; let rs = &w.manifest.renditions; let m = rs.get(i)?; if !layer_entry(m) { return Some(Gives::Base(payload_units(&m.capability, &w.renditions[i]))); } - // SPEC §7.1, *Refinement components*: a refinement conforms only if its - // capability is refinement-only, it carries id and sha256, its refines is - // well formed, its base is a selectable rendition carrying both, every - // producer a selectable rendition or a refinement before it carrying - // both, and no selectable rendition follows it. - let identified = |e: &crate::container::RenditionMeta| e.id.is_some() && e.sha256.is_some(); - let Some(v) = m.refines.as_ref() else { return Some(Gives::NotApplicable) }; - let Ok(r) = Refines::from_value(v, RefForm::ComponentId) else { return Some(Gives::NotApplicable) }; - let by_id = |id: &str| rs.iter().position(|e| e.id.as_deref() == Some(id)); - let conforms = m.is_refinement() - && refinement_only(&m.capability) - && identified(m) - && by_id(&r.base).is_some_and(|j| rs[j].is_selectable() && identified(&rs[j])) - && r.producers().all(|p| by_id(p).is_some_and(|j| (rs[j].is_selectable() || (j < i && rs[j].is_refinement())) && identified(&rs[j]))) - && !rs[i + 1..].iter().any(|e| e.is_selectable()); - if !conforms { + // SPEC §7.1: a sink offers a WAI2's refinements only when every one of its + // components conforms (`check_component_roles`). + if w.check_component_roles().is_err() { return Some(Gives::NotApplicable); } - let j = by_id(&r.base)?; - Some(layer_of(&m.capability, &r, Some(component(w, j)), names_of(None, Some((d.object, j as u64))), &w.renditions[i])) + let r = Refines::from_value(m.refines.as_ref()?, RefForm::ComponentId).ok()?; + let j = rs.iter().position(|e| e.id.as_deref() == Some(r.base.as_str()))?; + Some(layer_of(&m.capability, &r, Some(component(w, j)), names_of(None, Some((object, j as u64))), &w.renditions[i])) } } }; // 5. A held layer an entry names is one a sink can apply. - if s.decoders.iter().any(|d| matches!(gives(d), Some(Gives::NotApplicable))) { + if (0..s.decoders.len()).any(|k| matches!(gives(k), Some(Gives::NotApplicable))) { return Err(Rejection::at(6, Reason::SessionLayerNotApplicable)); } // 6. A held layer's entry has the first unit of an entry it is applied over. - for d in &s.decoders { - if let Some(Gives::Layer { first_units, .. }) = gives(d) + for (k, d) in s.decoders.iter().enumerate() { + if let Some(Gives::Layer { first_units, .. }) = gives(k) && !first_units.is_empty() && !first_units.contains(&d.first_unit) { @@ -1209,8 +1236,11 @@ impl ClaimReceipt { if let Some(ps) = outputs { // 7. Each presentation through a held entry is at the layers its envelope gives. for p in ps { - let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; - let layers = match gives(d) { + let k = usize::from(p.decoder); + if k >= s.decoders.len() { + continue; + } + let layers = match gives(k) { Some(Gives::Base(_)) => 1, Some(Gives::Layer { layers, .. }) => layers, _ => continue, @@ -1221,8 +1251,9 @@ impl ClaimReceipt { } // 8. ... and of a unit it covers. for p in ps { - let Some(d) = s.decoders.get(usize::from(p.decoder)) else { continue }; - let covers = match gives(d) { + let k = usize::from(p.decoder); + let Some(d) = s.decoders.get(k) else { continue }; + let covers = match gives(k) { Some(Gives::Base(Some(n))) => (0, n), Some(Gives::Layer { span: Some(span), .. }) => span, _ => continue, diff --git a/wai/wai-rs/src/container.rs b/wai/wai-rs/src/container.rs index eb3181326..b91d2bb25 100644 --- a/wai/wai-rs/src/container.rs +++ b/wai/wai-rs/src/container.rs @@ -2107,6 +2107,185 @@ pub struct ManifestV2 { } impl ManifestV2 { + /// The index of the base a companion at `index` binds to, when it binds to one + /// entry: the entry `companion_of_id` names, or the one selectable entry of + /// capability `companion_of`. + fn bound_base(&self, index: usize) -> Option { + let metas = &self.renditions; + let m = metas.get(index)?; + if let Some(id) = m.companion_of_id.as_deref() { + return metas.iter().position(|b| b.id.as_deref() == Some(id)); + } + let target = m.companion_of.as_deref()?; + let mut it = metas.iter().enumerate().filter(|(_, b)| b.is_selectable() && b.capability == target); + match (it.next(), it.next()) { + (Some((i, _)), None) => Some(i), + _ => None, + } + } + + /// SPEC §7.1, *Refinement components*, for the entry at `index`, in this order: + /// its capability is refinement-only; it carries `id` and `sha256`; its `refines` + /// is well formed with component ids; `refines.base` names a selectable entry with + /// an `id` and a `sha256`; its capability admits that entry's (SPEC §5, *Base + /// admission*); every producer of `prev` names a selectable entry or a refinement + /// before it, with an `id` and a `sha256`; and it follows every selectable entry. + fn check_refinement(&self, index: usize) -> Result<(), RoleError> { + let metas = &self.renditions; + let m = &metas[index]; + if !crate::codecs::is_refinement_only(&m.capability) { + return Err(RoleError::RefinementNotRefinementOnly { index, capability: m.capability.clone() }); + } + if m.id.is_none() || m.sha256.is_none() { + return Err(RoleError::RefinementIdentityMissing { index }); + } + let refines = match m.refines.as_ref().map(|v| Refines::from_value(v, RefForm::ComponentId)) { + Some(Ok(r)) => r, + Some(Err(e)) => return Err(RoleError::RefinesMalformed { index: Some(index), detail: e.0 }), + None => return Err(RoleError::RefinesMalformed { index: Some(index), detail: "a refinement carries no refines" }), + }; + let by_id = |id: &str| metas.iter().position(|e| e.id.as_deref() == Some(id)); + let Some(b) = by_id(&refines.base).filter(|&b| metas[b].is_selectable()) else { + return Err(RoleError::RefinementBaseMissing { index, base: refines.base.clone() }); + }; + if metas[b].sha256.is_none() { + return Err(RoleError::RefinementIdentityMissing { index }); + } + if !crate::codecs::admits(&m.capability, &metas[b].capability) { + return Err(RoleError::RefinementBaseNotAdmitted { index, capability: m.capability.clone(), base: metas[b].capability.clone() }); + } + for p in refines.producers() { + let ok = by_id(p).filter(|&e| metas[e].is_selectable() || (e < index && metas[e].is_refinement())); + match ok { + None => return Err(RoleError::RefinementPrevMissing { index, producer: p.to_string() }), + Some(e) if metas[e].sha256.is_none() => return Err(RoleError::RefinementIdentityMissing { index }), + Some(_) => {} + } + } + if let Some(selectable) = (index + 1..metas.len()).find(|&j| metas[j].is_selectable()) { + return Err(RoleError::RefinementBeforeSelectable { index, selectable }); + } + Ok(()) + } + + /// Check the component table against SPEC §5 / §7.1, using the capability + /// registry, in component order (the first violation is returned): + /// + /// - every `id` is a component id ([`is_component_id`]) and unique + /// ([`RoleError::ComponentIdMalformed`], [`RoleError::DuplicateComponentId`]); + /// - a companion-only capability is carried with `role = "companion"` + /// ([`RoleError::CompanionOnlyAsRendition`]); + /// - a `role = "refinement"` entry obeys *Refinement components* + /// ([`Self::check_refinement`]'s rules); `refines` sits on no other entry, and a + /// refinement-only capability on no other role + /// ([`RoleError::RefinesOnNonRefinement`], [`RoleError::RefinementOnlyAsComponent`]); + /// + /// and, for each `role = "companion"` component, SPEC §7.1's three rules: + /// + /// 1. its capability is companion-only or unregistered + /// ([`RoleError::StandaloneAsCompanion`]); + /// 2. `companion_of` is present ([`RoleError::UnboundCompanion`]) and names a + /// capability it applies to ([`RoleError::IncompatibleBase`]); a + /// `companion_of_id` resolves to an entry ([`RoleError::CompanionIdUnresolved`]) + /// whose capability is `companion_of` + /// ([`RoleError::CompanionIdCapabilityMismatch`]); + /// 3. a selectable rendition of that capability is present + /// ([`RoleError::UnboundCompanion`]) — with `companion_of_id`, exactly that + /// entry; for an enhancement layer bound by capability alone, exactly one + /// ([`RoleError::EnhancementBaseNotUnique`]); and a base takes at most one + /// enhancement layer, checked by index ([`RoleError::DuplicateEnhancementLayer`]). + /// + /// A descriptor companion (HDR dynamic metadata) bound by capability may bind + /// to several renditions of one capability, and several descriptors may bind + /// to one base. A companion whose capability this revision does not register is + /// held to rule 3's presence check only. + pub fn check_component_roles(&self) -> Result<(), RoleError> { + let metas = &self.renditions; + for (index, m) in metas.iter().enumerate() { + if let Some(id) = m.id.as_deref() { + if !is_component_id(id) { + return Err(RoleError::ComponentIdMalformed { index }); + } + if let Some(first) = metas[..index].iter().position(|e| e.id.as_deref() == Some(id)) { + return Err(RoleError::DuplicateComponentId { index, first }); + } + } + } + for (index, m) in metas.iter().enumerate() { + let capability = m.capability.clone(); + if m.is_refinement() { + self.check_refinement(index)?; + continue; + } + if m.refines.is_some() { + return Err(RoleError::RefinesOnNonRefinement { index }); + } + if crate::codecs::is_refinement_only(&m.capability) { + return Err(RoleError::RefinementOnlyAsComponent { index, capability }); + } + let companion_only = crate::codecs::is_companion_only(&m.capability); + if !m.is_companion() { + if companion_only { + return Err(RoleError::CompanionOnlyAsRendition { index, capability }); + } + continue; + } + // Rule 1: only a companion-only (or unregistered) capability is a companion. + if !companion_only && crate::codecs::is_known_capability(&m.capability) { + return Err(RoleError::StandaloneAsCompanion { index, capability }); + } + let Some(target) = m.companion_of.as_deref() else { + return Err(RoleError::UnboundCompanion { index, capability }); + }; + // Rule 2: the named base is one this companion applies to. + if companion_only && !crate::codecs::companion_applies_to(&m.capability, target) { + let base = target.to_string(); + return Err(RoleError::IncompatibleBase { index, capability, base }); + } + // Rule 2, by id: the named entry exists and has the named capability. + if let Some(id) = m.companion_of_id.as_deref() { + let Some(b) = metas.iter().position(|e| e.id.as_deref() == Some(id)) else { + return Err(RoleError::CompanionIdUnresolved { index, id: id.to_string() }); + }; + if metas[b].capability != target { + return Err(RoleError::CompanionIdCapabilityMismatch { + index, id: id.to_string(), capability: metas[b].capability.clone() }); + } + // Rule 3: that entry is a selectable rendition. + if !metas[b].is_selectable() { + return Err(RoleError::UnboundCompanion { index, capability }); + } + } else { + // Rule 3: the base is present, and unique for an enhancement layer. + let bases = metas.iter() + .filter(|b| b.is_selectable() && b.capability == target) + .count(); + if crate::codecs::is_enhancement_layer(&m.capability) { + if bases != 1 { + return Err(RoleError::EnhancementBaseNotUnique { index, capability, matches: bases }); + } + } else if bases == 0 { + return Err(RoleError::UnboundCompanion { index, capability }); + } + } + // At most one enhancement layer per base, by index. + if crate::codecs::is_enhancement_layer(&m.capability) { + let base_index = self.bound_base(index); + let earlier = (0..index).find(|&e| { + metas[e].is_companion() + && crate::codecs::is_enhancement_layer(&metas[e].capability) + && self.bound_base(e).is_some() + && self.bound_base(e) == base_index + }); + if let Some(first) = earlier { + let base = target.to_string(); + return Err(RoleError::DuplicateEnhancementLayer { index, capability, base, first }); + } + } + } + Ok(()) + } + /// A `"1.1"` manifest with a `null` target. pub fn new(media: impl Into, intent: impl Into, renditions: Vec) -> Self { Self { @@ -2489,66 +2668,6 @@ impl WaiMulti { Ok(()) } - /// The index of the base a companion at `index` binds to, when it binds to one - /// entry: the entry `companion_of_id` names, or the one selectable entry of - /// capability `companion_of`. - fn bound_base(&self, index: usize) -> Option { - let metas = &self.manifest.renditions; - let m = metas.get(index)?; - if let Some(id) = m.companion_of_id.as_deref() { - return metas.iter().position(|b| b.id.as_deref() == Some(id)); - } - let target = m.companion_of.as_deref()?; - let mut it = metas.iter().enumerate().filter(|(_, b)| b.is_selectable() && b.capability == target); - match (it.next(), it.next()) { - (Some((i, _)), None) => Some(i), - _ => None, - } - } - - /// SPEC §7.1, *Refinement components*, for the entry at `index`, in this order: - /// its capability is refinement-only; it carries `id` and `sha256`; its `refines` - /// is well formed with component ids; `refines.base` names a selectable entry with - /// an `id` and a `sha256`; its capability admits that entry's (SPEC §5, *Base - /// admission*); every producer of `prev` names a selectable entry or a refinement - /// before it, with an `id` and a `sha256`; and it follows every selectable entry. - fn check_refinement(&self, index: usize) -> Result<(), RoleError> { - let metas = &self.manifest.renditions; - let m = &metas[index]; - if !crate::codecs::is_refinement_only(&m.capability) { - return Err(RoleError::RefinementNotRefinementOnly { index, capability: m.capability.clone() }); - } - if m.id.is_none() || m.sha256.is_none() { - return Err(RoleError::RefinementIdentityMissing { index }); - } - let refines = match m.refines.as_ref().map(|v| Refines::from_value(v, RefForm::ComponentId)) { - Some(Ok(r)) => r, - Some(Err(e)) => return Err(RoleError::RefinesMalformed { index: Some(index), detail: e.0 }), - None => return Err(RoleError::RefinesMalformed { index: Some(index), detail: "a refinement carries no refines" }), - }; - let by_id = |id: &str| metas.iter().position(|e| e.id.as_deref() == Some(id)); - let Some(b) = by_id(&refines.base).filter(|&b| metas[b].is_selectable()) else { - return Err(RoleError::RefinementBaseMissing { index, base: refines.base.clone() }); - }; - if metas[b].sha256.is_none() { - return Err(RoleError::RefinementIdentityMissing { index }); - } - if !crate::codecs::admits(&m.capability, &metas[b].capability) { - return Err(RoleError::RefinementBaseNotAdmitted { index, capability: m.capability.clone(), base: metas[b].capability.clone() }); - } - for p in refines.producers() { - let ok = by_id(p).filter(|&e| metas[e].is_selectable() || (e < index && metas[e].is_refinement())); - match ok { - None => return Err(RoleError::RefinementPrevMissing { index, producer: p.to_string() }), - Some(e) if metas[e].sha256.is_none() => return Err(RoleError::RefinementIdentityMissing { index }), - Some(_) => {} - } - } - if let Some(selectable) = (index + 1..metas.len()).find(|&j| metas[j].is_selectable()) { - return Err(RoleError::RefinementBeforeSelectable { index, selectable }); - } - Ok(()) - } /// The refinements of the entry at `index`, in table order: each entry with /// `role: "refinement"` whose `refines.base` names that entry's `id`, and whose @@ -2570,122 +2689,10 @@ impl WaiMulti { .collect() } - /// Check the component table against SPEC §5 / §7.1, using the capability - /// registry, in component order (the first violation is returned): - /// - /// - every `id` is a component id ([`is_component_id`]) and unique - /// ([`RoleError::ComponentIdMalformed`], [`RoleError::DuplicateComponentId`]); - /// - a companion-only capability is carried with `role = "companion"` - /// ([`RoleError::CompanionOnlyAsRendition`]); - /// - a `role = "refinement"` entry obeys *Refinement components* - /// ([`Self::check_refinement`]'s rules); `refines` sits on no other entry, and a - /// refinement-only capability on no other role - /// ([`RoleError::RefinesOnNonRefinement`], [`RoleError::RefinementOnlyAsComponent`]); - /// - /// and, for each `role = "companion"` component, SPEC §7.1's three rules: - /// - /// 1. its capability is companion-only or unregistered - /// ([`RoleError::StandaloneAsCompanion`]); - /// 2. `companion_of` is present ([`RoleError::UnboundCompanion`]) and names a - /// capability it applies to ([`RoleError::IncompatibleBase`]); a - /// `companion_of_id` resolves to an entry ([`RoleError::CompanionIdUnresolved`]) - /// whose capability is `companion_of` - /// ([`RoleError::CompanionIdCapabilityMismatch`]); - /// 3. a selectable rendition of that capability is present - /// ([`RoleError::UnboundCompanion`]) — with `companion_of_id`, exactly that - /// entry; for an enhancement layer bound by capability alone, exactly one - /// ([`RoleError::EnhancementBaseNotUnique`]); and a base takes at most one - /// enhancement layer, checked by index ([`RoleError::DuplicateEnhancementLayer`]). - /// - /// A descriptor companion (HDR dynamic metadata) bound by capability may bind - /// to several renditions of one capability, and several descriptors may bind - /// to one base. A companion whose capability this revision does not register is - /// held to rule 3's presence check only. + /// Check the component table against SPEC §5 / §7.1 ([`ManifestV2::check_component_roles`]). + /// A sink offers the envelope's refinements to staged-delivery §4 only when it passes. pub fn check_component_roles(&self) -> Result<(), RoleError> { - let metas = &self.manifest.renditions; - for (index, m) in metas.iter().enumerate() { - if let Some(id) = m.id.as_deref() { - if !is_component_id(id) { - return Err(RoleError::ComponentIdMalformed { index }); - } - if let Some(first) = metas[..index].iter().position(|e| e.id.as_deref() == Some(id)) { - return Err(RoleError::DuplicateComponentId { index, first }); - } - } - } - for (index, m) in metas.iter().enumerate() { - let capability = m.capability.clone(); - if m.is_refinement() { - self.check_refinement(index)?; - continue; - } - if m.refines.is_some() { - return Err(RoleError::RefinesOnNonRefinement { index }); - } - if crate::codecs::is_refinement_only(&m.capability) { - return Err(RoleError::RefinementOnlyAsComponent { index, capability }); - } - let companion_only = crate::codecs::is_companion_only(&m.capability); - if !m.is_companion() { - if companion_only { - return Err(RoleError::CompanionOnlyAsRendition { index, capability }); - } - continue; - } - // Rule 1: only a companion-only (or unregistered) capability is a companion. - if !companion_only && crate::codecs::is_known_capability(&m.capability) { - return Err(RoleError::StandaloneAsCompanion { index, capability }); - } - let Some(target) = m.companion_of.as_deref() else { - return Err(RoleError::UnboundCompanion { index, capability }); - }; - // Rule 2: the named base is one this companion applies to. - if companion_only && !crate::codecs::companion_applies_to(&m.capability, target) { - let base = target.to_string(); - return Err(RoleError::IncompatibleBase { index, capability, base }); - } - // Rule 2, by id: the named entry exists and has the named capability. - if let Some(id) = m.companion_of_id.as_deref() { - let Some(b) = metas.iter().position(|e| e.id.as_deref() == Some(id)) else { - return Err(RoleError::CompanionIdUnresolved { index, id: id.to_string() }); - }; - if metas[b].capability != target { - return Err(RoleError::CompanionIdCapabilityMismatch { - index, id: id.to_string(), capability: metas[b].capability.clone() }); - } - // Rule 3: that entry is a selectable rendition. - if !metas[b].is_selectable() { - return Err(RoleError::UnboundCompanion { index, capability }); - } - } else { - // Rule 3: the base is present, and unique for an enhancement layer. - let bases = metas.iter() - .filter(|b| b.is_selectable() && b.capability == target) - .count(); - if crate::codecs::is_enhancement_layer(&m.capability) { - if bases != 1 { - return Err(RoleError::EnhancementBaseNotUnique { index, capability, matches: bases }); - } - } else if bases == 0 { - return Err(RoleError::UnboundCompanion { index, capability }); - } - } - // At most one enhancement layer per base, by index. - if crate::codecs::is_enhancement_layer(&m.capability) { - let base_index = self.bound_base(index); - let earlier = (0..index).find(|&e| { - metas[e].is_companion() - && crate::codecs::is_enhancement_layer(&metas[e].capability) - && self.bound_base(e).is_some() - && self.bound_base(e) == base_index - }); - if let Some(first) = earlier { - let base = target.to_string(); - return Err(RoleError::DuplicateEnhancementLayer { index, capability, base, first }); - } - } - } - Ok(()) + self.manifest.check_component_roles() } /// All companions (HDR dynamic metadata, enhancement layers) carried in diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs index 10758f5be..a6eecbfc2 100644 --- a/wai/wai-rs/src/http_binding/session.rs +++ b/wai/wai-rs/src/http_binding/session.rs @@ -184,7 +184,9 @@ impl Selector { } /// The companions and refinements of entry `index` the sink applies, with their - /// classes: an enhancement layer or a refinement is a refinement (§10.1). + /// classes: an enhancement layer or a refinement is a refinement (§10.1). The + /// refinements are offered only from an envelope whose components all conform (SPEC + /// §7.1, *Refinement components*: `ManifestV2::check_component_roles`). fn applied(&self, m: &ManifestV2, index: usize) -> Vec<(usize, Class)> { let e = &m.renditions; let mut out: Vec<(usize, Class)> = companion_indices(e, index) @@ -192,7 +194,9 @@ impl Selector { .filter(|&i| (self.applies)(&e[i])) .map(|i| (i, if crate::codecs::is_enhancement_layer(&e[i].capability) { Class::Refinement } else { Class::Base })) .collect(); - out.extend(refinement_indices(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); + if m.check_component_roles().is_ok() { + out.extend(refinement_indices(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); + } out } } -- 2.54.0 (Apple Git-157) From 183eabda165f4122f63a29a73bc3840baae1e0fd Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 00:24:32 -0400 Subject: [PATCH 12/21] wai: the HTTP fetch plan keeps its own drop reporting; the CLI replay knows the tool routes by capability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts the HTTP binding's gate from the previous commit: http-delivery's fetch plan reports a refinement with no digest among the components it drops, and the whole-envelope gate hid it (http-conformance's fetch_ORN cases). Bringing the HTTP plan under SPEC §7.1's offer rule needs http-delivery's text, http_verify.py and its corpus together; it is left as an open item. tests/cli_stage.rs: the corpus case capability_not_refinement offers an envelope of a capability that is not refinement-only to §4 directly; the tool routes it as a base by its capability, and the test checks that it does. staged-delivery §4.1 says where such an envelope reaches step 1. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 8 +++++--- wai/extensions/staged-delivery.md | 4 +++- wai/wai-rs/src/http_binding/session.rs | 8 ++------ wai/wai-rs/tests/cli_stage.rs | 23 +++++++++++++++++++++-- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index df48dc820..e604c758c 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -100,9 +100,11 @@ wire format may change and such changes are recorded here. - **A WAI2 offers its refinements only when every component conforms** (SPEC §7.1, *Selection*). The text now states the reference sink's rule: an envelope one of whose components breaks a rule of §7.1 or §5 (`check_component_roles`, now on `ManifestV2`) - offers none of its refinements, and may still present the rendition it picked. The - HTTP session's applied components and `wai stage explode` follow it; rule 5 matches it - for the whole envelope. + offers none of its refinements, and may still present the rendition it picked. `wai + stage explode` follows it, refusing a refinement of such an envelope; rule 5 matches it + for the whole envelope. The HTTP binding's fetch plan does not follow it yet: + http-delivery reports such a refinement among the components it drops or fetches by + its own rules. - **Every refusal accounted for.** The claim-conformance README's table lists each refusal a sink makes that decides whether a presentation can happen — staged-delivery §3, §4.1, §4.3–§4.5, §9; SPEC §4, §5, §7.1 — with the §2.4.12 rule and vector that diff --git a/wai/extensions/staged-delivery.md b/wai/extensions/staged-delivery.md index e1c1ffd7a..1b6597124 100644 --- a/wai/extensions/staged-delivery.md +++ b/wai/extensions/staged-delivery.md @@ -83,7 +83,9 @@ revision does not define is ignored (SPEC §8). ### 4.1 Algorithm A sink that implements this extension **MUST** process each received envelope *R* -whose capability is refinement-only as follows. Steps 1–6 decide for the whole +whose capability is refinement-only as follows. A sink routes by capability (§3), so an +envelope of any other capability reaches step 1 only where a caller offers it to this +algorithm as a layer, which refuses it (`capability-not-refinement`). Steps 1–6 decide for the whole envelope; steps 7–10 decide for each unit *u* the layer covers. The first step that fails is the reason for the envelope (1–6) or for the unit (7–10). diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs index a6eecbfc2..10758f5be 100644 --- a/wai/wai-rs/src/http_binding/session.rs +++ b/wai/wai-rs/src/http_binding/session.rs @@ -184,9 +184,7 @@ impl Selector { } /// The companions and refinements of entry `index` the sink applies, with their - /// classes: an enhancement layer or a refinement is a refinement (§10.1). The - /// refinements are offered only from an envelope whose components all conform (SPEC - /// §7.1, *Refinement components*: `ManifestV2::check_component_roles`). + /// classes: an enhancement layer or a refinement is a refinement (§10.1). fn applied(&self, m: &ManifestV2, index: usize) -> Vec<(usize, Class)> { let e = &m.renditions; let mut out: Vec<(usize, Class)> = companion_indices(e, index) @@ -194,9 +192,7 @@ impl Selector { .filter(|&i| (self.applies)(&e[i])) .map(|i| (i, if crate::codecs::is_enhancement_layer(&e[i].capability) { Class::Refinement } else { Class::Base })) .collect(); - if m.check_component_roles().is_ok() { - out.extend(refinement_indices(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); - } + out.extend(refinement_indices(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); out } } diff --git a/wai/wai-rs/tests/cli_stage.rs b/wai/wai-rs/tests/cli_stage.rs index 94b260561..d2d4d8892 100644 --- a/wai/wai-rs/tests/cli_stage.rs +++ b/wai/wai-rs/tests/cli_stage.rs @@ -302,7 +302,7 @@ fn apply_json_replays_the_corpus() { let mut names: Vec = std::fs::read_dir(&root).unwrap().flatten().map(|e| e.file_name().to_string_lossy().into_owned()).collect(); names.sort(); let default_cfg = serde_json::json!({"bound": {"max_envelopes": 16, "max_age_ms": 1000}, "cost_limit": null, "budget": 1u64 << 30, "record_budget": 1u64 << 20, "live": null}); - let (mut same, mut skipped, mut extra) = (0, 0, 0); + let (mut same, mut skipped, mut extra, mut routed_as_base) = (0, 0, 0, 0); let mut differ: Vec = Vec::new(); for name in names { let d = root.join(&name); @@ -329,6 +329,24 @@ fn apply_json_replays_the_corpus() { skipped += 1; continue; } + // An envelope the case offers to §4 whose capability is not refinement-only: the + // tool routes by capability (staged-delivery §3, SPEC §4), so it reads it as a base, + // a `refines` it carries ignored, and reports a base step; the case offers it to §4 + // directly, which refuses it (`capability-not-refinement`). + let routed = steps.iter().position(|s| { + s["op"] == "offer" + && wai::container::Wai::from_bytes(&std::fs::read(d.join(s["file"].as_str().unwrap())).unwrap()) + .is_ok_and(|w| !wai::codecs::is_refinement_only(w.capability())) + }); + if let Some(i) = routed { + let o = wai(&[os("stage"), os("apply"), os("--json"), d.join("base.wai").as_os_str(), d.join(steps[i]["file"].as_str().unwrap()).as_os_str()]); + let got: serde_json::Value = serde_json::from_slice(&o.stdout).unwrap_or_default(); + if got["steps"][1]["op"] != "base" { + differ.push(format!("{name}: the tool does not route the envelope offered at step {i} as a base: {}", text(&o))); + } + routed_as_base += 1; + continue; + } if stage0_base || name == "budget_partly_applied" { extra += 1; } @@ -403,7 +421,8 @@ fn apply_json_replays_the_corpus() { } same += 1; } - println!("apply --json against the corpus: {same} cases agree ({extra} through --stage0 or a budget that never binds), {} differ, {skipped} need what the tool's sink does not do", differ.len()); + println!("apply --json against the corpus: {same} cases agree ({extra} through --stage0 or a budget that never binds), {} differ, {skipped} need what the tool's sink does not do, {routed_as_base} offer an envelope the tool routes as a base", differ.len()); + assert!(routed_as_base > 0, "the corpus offers no envelope the tool routes as a base by its capability"); assert!(differ.is_empty(), "{}", differ.join("\n")); assert!(same >= 30, "only {same} cases compared"); assert_eq!(extra, 5, "the four PNG and FLAC cases and budget_partly_applied replay"); -- 2.54.0 (Apple Git-157) From 91514d6cb564cbd8abbe7404535a7532301b9b4b Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 00:45:55 -0400 Subject: [PATCH 13/21] wai: a record or a derivation is no companion; the HTTP plan's limitation stated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SPEC §7.1 companion rule 1 now says it outright: a capability registered in a kind other than companion — a payload, a record or a derivation (§5, Kinds of registered string) — is not a companion. The reference read rule 1 from codecs::is_known_capability, which leaves records and derivations out, so it admitted them as if unregistered; check_component_roles now reads the registry (capability_kind) and refuses them as standalone-as-companion. claim_verify.py reads the registry the same way. Vectors: session_roles_record_companion and session_roles_derivation_companion (rule 5's whole-envelope check; 547 vectors), and pin-conformance/selection.json's record_as_companion and derivation_as_companion (check_component_roles alone). http-delivery's status block and the CHANGELOG state the limitation of this revision: the HTTP binding's plan does not yet withhold refinements of a nonconforming envelope. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 11 +- wai/SPEC.md | 7 +- wai/claim-conformance/README.md | 2 +- wai/claim-conformance/claim_verify.py | 2 +- wai/claim-conformance/vectors.json | 118 ++++++++++++++++++ wai/extensions/http-delivery.md | 6 +- wai/pin-conformance/selection.json | 66 ++++++++++ wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 7 +- wai/wai-rs/src/container.rs | 17 +-- 10 files changed, 218 insertions(+), 20 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index e604c758c..b390662c1 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -102,9 +102,14 @@ wire format may change and such changes are recorded here. components breaks a rule of §7.1 or §5 (`check_component_roles`, now on `ManifestV2`) offers none of its refinements, and may still present the rendition it picked. `wai stage explode` follows it, refusing a refinement of such an envelope; rule 5 matches it - for the whole envelope. The HTTP binding's fetch plan does not follow it yet: - http-delivery reports such a refinement among the components it drops or fetches by - its own rules. + for the whole envelope. A limitation of this revision, stated in http-delivery's + status: the HTTP binding's plan does not yet withhold refinements of a nonconforming + envelope. +- **A record or a derivation is no companion** (SPEC §7.1, rule 1). A companion's + capability is companion-only or unregistered; a capability registered in another + kind — a payload, a record or a derivation — is refused + (`standalone-as-companion`), which the reference now reads from the registry rather + than from its list of media capabilities, which left records and derivations out. - **Every refusal accounted for.** The claim-conformance README's table lists each refusal a sink makes that decides whether a presentation can happen — staged-delivery §3, §4.1, §4.3–§4.5, §9; SPEC §4, §5, §7.1 — with the §2.4.12 rule and vector that diff --git a/wai/SPEC.md b/wai/SPEC.md index 7e0ebff11..9a89931a2 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -1811,9 +1811,10 @@ video bitstream / a manifest color field and need no companion. A component with `role = "companion"` conforms only if: 1. its capability is companion-only, or is not registered in this revision. A - registered capability that is not companion-only is standalone media — its - payload decodes on its own — and MUST be carried as a rendition, not as a - companion; + capability registered in any other kind (§5, *Kinds of registered string*) is + not a companion: a payload capability is standalone media — its payload decodes + on its own — and MUST be carried as a rendition, and a record or a derivation + names no payload format, so it is carried as neither; 2. `companion_of` is present and names a capability the companion applies to. An HDR dynamic-metadata descriptor, registered as a companion to a video payload, applies to a registered capability whose payload is video — the diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 845aff5b4..e99176cc6 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -320,7 +320,7 @@ with neither is a hole; there is none. | SPEC §7.1, *Selection algorithm* | a companion, or a capability that is not dispatchable, is never picked | rule 4 | `session_wai2_entry_names_a_companion` | | SPEC §7.1, *Component identity* | `component_digest_mismatch`: a rendition whose payload does not match its `sha256` is skipped, a refinement is not offered | rule 4 | `session_wai2_rendition_digest_mismatch`, `session_wai2_refinement_digest_mismatch` | | SPEC §7.1, *Component identity* | an `id`, `sha256` or `companion_of_id` that is not a string: the reader rejects the envelope | rule 3 | `session_wai2_component_id_not_a_string` | -| SPEC §7.1, *Refinement components*, *Selection* (every `WaiMulti::check_component_roles` code: the refinement codes, `refines-on-non-refinement`, `refinement-only-as-component`, the companion codes, `component-id-malformed`, `duplicate-component-id`) | a sink offers a `WAI2`'s refinements only when every component conforms | rule 5, the whole envelope | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_roles_refinement_before_selectable_exploded`, `session_wai2_refines_on_a_rendition`, `session_roles_base_without_sha256`, `session_roles_layer_before_its_prev`, `session_roles_unbound_companion`; accepted: `session_roles_companion_and_refinement_accept`, `session_roles_companion_by_id_and_refinement_accept` | +| SPEC §7.1, *Refinement components*, *Selection* (every `WaiMulti::check_component_roles` code: the refinement codes, `refines-on-non-refinement`, `refinement-only-as-component`, the companion codes, `component-id-malformed`, `duplicate-component-id`) | a sink offers a `WAI2`'s refinements only when every component conforms | rule 5, the whole envelope | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_roles_refinement_before_selectable_exploded`, `session_wai2_refines_on_a_rendition`, `session_roles_base_without_sha256`, `session_roles_layer_before_its_prev`, `session_roles_unbound_companion`, `session_roles_record_companion`, `session_roles_derivation_companion` (a companion whose capability is a record or a derivation, registered and so no companion; `pin-conformance/selection.json`'s `record_as_companion` and `derivation_as_companion` pin the same finding for the envelope alone); accepted: `session_roles_companion_and_refinement_accept`, `session_roles_companion_by_id_and_refinement_accept` | | SPEC §7.1, *Companion components* | a companion that breaks rules 1–3 or its `companion_of_id`; an enhancement layer whose base is not unique | for the rendition picked, no bearing: a sink does not apply the companion and may still present the rendition, the output's digest holding whatever was applied; for the envelope's refinements, the row above | `session_roles_unbound_companion` | ## Steps 1 and 2: types, and the order a body is read in diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 090adfd80..7a4e6e885 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -1086,7 +1086,7 @@ def component_roles(rs): if co: return "companion-only-as-rendition" continue - if not co and known(cap): + if not co and cap in REGISTRY: # a payload, a record or a derivation: registered, none a companion return "standalone-as-companion" target = m.get("companion_of") if target is None: diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index d62507920..d863f580f 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -12590,6 +12590,124 @@ "reason": "session_layer_not_applicable" } }, + { + "name": "session_roles_record_companion", + "about": "a refinement beside a companion whose capability is a record (wai.video.manifest), registered and not companion-only: no companion, so the envelope offers no refinement", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"fb78abdaa8a5ba6ad3635329a5e7effeba294c1dc8977fee8a21240c6f018b41\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"fb78abdaa8a5ba6ad3635329a5e7effeba294c1dc8977fee8a21240c6f018b41\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1111,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"528f418fcc56164a98054779f1b87120a48ee7fea350bc31afbb4ae24edd3ff8384cd7ace8ff98868081f406484f95678288df4b27fd56e0543f4593339d1303\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"fb78abdaa8a5ba6ad3635329a5e7effeba294c1dc8977fee8a21240c6f018b41\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "fb78abdaa8a5ba6ad3635329a5e7effeba294c1dc8977fee8a21240c6f018b41", + "path": "primary", + "counted": null, + "transferred": 1111, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "574149327a0200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e766964656f2e6d616e6966657374222c226b696e64223a226864723130706c7573222c226964223a2268222c22736861323536223a2231323138316666386430383661316132303236646163613937663264343331313835353330633266636665306338313466316531316462666333623263613730222c22726f6c65223a22636f6d70616e696f6e222c22636f6d70616e696f6e5f6f66223a227761692e766964656f2e696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d030000000000a4000000a40000000f000000b3000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb48445231302b206d65746164617461574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, + { + "name": "session_roles_derivation_companion", + "about": "a refinement beside a companion whose capability is a derivation (wai.derive.crop), registered and not companion-only: no companion, so the envelope offers no refinement", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"27e12cd4aac4e90e9e2fbd864b4d0cedc05954680226371ad0ada253369a2411\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null},{\"capability\":\"wai.video.int_refine\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":1,\"module_status\":null,\"object\":\"27e12cd4aac4e90e9e2fbd864b4d0cedc05954680226371ad0ada253369a2411\",\"path\":\"primary\",\"pin\":null,\"rendition\":2,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":5,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"325c94922c5c4f4e5c6914b071be3cc7016efececa8c3d01d5e45b691e64e9cd\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":1108,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fbaf7eb33ddc21e919e8adbeefcdf8550a3ff61cff862d15f17f9ad3e34d8702a72d64c24542561d23e2e888726b9cd09a69b2470db28a083756e407619c3200\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"27e12cd4aac4e90e9e2fbd864b4d0cedc05954680226371ad0ada253369a2411\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + }, + { + "unit": 1, + "layers": 2, + "decoder": 1, + "out_digest": "f0348794b5be95fd5c4e8f268957b6d188c35f76146f4479c960124a4392841d" + } + ], + "objects": [ + { + "content_hash": "27e12cd4aac4e90e9e2fbd864b4d0cedc05954680226371ad0ada253369a2411", + "path": "primary", + "counted": null, + "transferred": 1108, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932770200007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d2c7b226361706162696c697479223a227761692e6465726976652e63726f70222c226b696e64223a226864723130706c7573222c226964223a2268222c22736861323536223a2231323138316666386430383661316132303236646163613937663264343331313835353330633266636665306338313466316531316462666333623263613730222c22726f6c65223a22636f6d70616e696f6e222c22636f6d70616e696f6e5f6f66223a227761692e766964656f2e696e745f6879706572227d2c7b226361706162696c697479223a227761692e766964656f2e696e745f726566696e65222c226b696e64223a2263222c226964223a2272222c22736861323536223a2231633534363466613066323065333533346235623835326532393334643331313830396665323966653063633964393466336262613361646365313031343331222c22726f6c65223a22726566696e656d656e74222c22726566696e6573223a7b2262617365223a2262222c2270726576223a2262222c226c61796572223a312c227370616e223a7b2266726f6d223a312c22636f756e74223a317d7d7d5d2c22746172676574223a6e756c6c7d030000000000a4000000a40000000f000000b3000000080100005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb48445231302b206d65746164617461574952310101000001000000100000001000000003000000000000000000000002000000000000000600000000000000ab240000006e000055b70000ffff000000000100c00000007d20413d764b1402801b12132938af1ff6ae79eb770b01f72056784e7ded19ccbb0eccc13845d0c3ccc4b780db55b534de76abf345ba95fba5382b45c7781000a6fcbc59c32db31bce81d08151d08523d254dabd9792e061dad64674c640ed67ce7a41afc5f30befec3f3ab637a5273882cd45d8806dcc2f58a2bbfa6f230e00d768b64010985c1f071219b0185cfc3437e24a1c8605c4f3d84143790fd25c31d0118dc7c6554abe98bf8aa5e5577f1100a4a30543e8befe6536f30857a44941" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_layer_not_applicable" + } + }, { "name": "session_roles_unbound_companion", "about": "a refinement beside a companion with no companion_of: the envelope does not conform, so its refinement is not offered", diff --git a/wai/extensions/http-delivery.md b/wai/extensions/http-delivery.md index 1b907d1e0..1ef47167a 100644 --- a/wai/extensions/http-delivery.md +++ b/wai/extensions/http-delivery.md @@ -8,8 +8,10 @@ > is in `wai-rs`: `http_binding` (feature `http`) for §3–§7, the origin side of §5 > and §9, the playlists of §10.4 and §11 and the adaptation policies of Appendix F; > `wai_video_manifest` (feature `video_manifest`) for the playlist receipts of §8.6; -> and the `wai http` commands of the `wai` tool. Keywords **MUST**, **MUST NOT**, -> **SHOULD**, **MAY** are RFC 2119 / RFC 8174. +> and the `wai http` commands of the `wai` tool. A limitation of this revision: the +> HTTP binding's plan does not yet withhold refinements of a nonconforming envelope +> ([SPEC](../SPEC.md) §7.1, *Refinement components*). Keywords **MUST**, **MUST +> NOT**, **SHOULD**, **MAY** are RFC 2119 / RFC 8174. ## 1. Scope diff --git a/wai/pin-conformance/selection.json b/wai/pin-conformance/selection.json index 402b36ac5..87db05601 100644 --- a/wai/pin-conformance/selection.json +++ b/wai/pin-conformance/selection.json @@ -526,6 +526,72 @@ ], "roles": "CompanionOnlyAsRendition" } + }, + { + "name": "record_as_companion", + "manifest": { + "wai": "1.1", + "media": "video", + "intent": "replicate", + "renditions": [ + { + "capability": "wai.video.av1", + "kind": "av1", + "id": "a" + }, + { + "capability": "wai.video.manifest", + "kind": "k", + "role": "companion", + "companion_of": "wai.video.av1" + } + ], + "target": null + }, + "payloads": [ + "AV1", + "REC" + ], + "advertised": "all", + "held": [], + "expect": { + "picked": 0, + "skipped": [], + "roles": "StandaloneAsCompanion" + } + }, + { + "name": "derivation_as_companion", + "manifest": { + "wai": "1.1", + "media": "video", + "intent": "replicate", + "renditions": [ + { + "capability": "wai.video.av1", + "kind": "av1", + "id": "a" + }, + { + "capability": "wai.derive.crop", + "kind": "k", + "role": "companion", + "companion_of": "wai.video.av1" + } + ], + "target": null + }, + "payloads": [ + "AV1", + "REC" + ], + "advertised": "all", + "held": [], + "expect": { + "picked": 0, + "skipped": [], + "roles": "StandaloneAsCompanion" + } } ] } diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index 184fa77e5..ee59d2a92 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -3500,7 +3500,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 545 + 547 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index f8c1018fd..f12898a21 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -2498,10 +2498,10 @@ fn resolve_vectors() -> Vec { }, Some(Reason::SessionLayerNotApplicable), )); - let companion = |of: Option<&str>, of_id: Option<&str>| { + let companion_of = |cap: &str, of: Option<&str>, of_id: Option<&str>| { use crate::container::RenditionMeta; let hdr = b"HDR10+ metadata".to_vec(); - let mut meta = RenditionMeta::new("wai.meta.hdr10plus", "hdr10plus"); + let mut meta = RenditionMeta::new(cap, "hdr10plus"); meta.id = Some("h".into()); meta.role = Some("companion".into()); meta.companion_of = of.map(Into::into); @@ -2509,7 +2509,10 @@ fn resolve_vectors() -> Vec { meta.sha256 = Some(crate::pin::sha256_hex(&hdr)); Rendition::from_meta(meta, hdr) }; + let companion = |of: Option<&str>, of_id: Option<&str>| companion_of("wai.meta.hdr10plus", of, of_id); for (name, about, comp, reason) in [ + ("session_roles_record_companion", "a refinement beside a companion whose capability is a record (wai.video.manifest), registered and not companion-only: no companion, so the envelope offers no refinement", companion_of("wai.video.manifest", Some(HYPER), None), Some(Reason::SessionLayerNotApplicable)), + ("session_roles_derivation_companion", "a refinement beside a companion whose capability is a derivation (wai.derive.crop), registered and not companion-only: no companion, so the envelope offers no refinement", companion_of("wai.derive.crop", Some(HYPER), None), Some(Reason::SessionLayerNotApplicable)), ("session_roles_unbound_companion", "a refinement beside a companion with no companion_of: the envelope does not conform, so its refinement is not offered", companion(None, None), Some(Reason::SessionLayerNotApplicable)), ("session_roles_companion_and_refinement_accept", "a refinement beside an HDR10+ companion bound to the base rendition by capability: every component conforms", companion(Some(HYPER), None), None), ("session_roles_companion_by_id_and_refinement_accept", "the same, the companion bound by id", companion(Some(HYPER), Some("b")), None), diff --git a/wai/wai-rs/src/container.rs b/wai/wai-rs/src/container.rs index b91d2bb25..541c9684d 100644 --- a/wai/wai-rs/src/container.rs +++ b/wai/wai-rs/src/container.rs @@ -1695,8 +1695,10 @@ pub enum RoleError { /// A companion-only capability (HDR dynamic metadata, an enhancement /// layer) listed as a selectable rendition instead of as a companion. CompanionOnlyAsRendition { index: usize, capability: String }, - /// A registered standalone capability (one that is not companion-only, such - /// as `wai.audio.iamf` or `wai.video.hevc`) marked `role = "companion"`. + /// A registered capability that is not companion-only marked `role = "companion"`: + /// a payload capability, standalone media (such as `wai.audio.iamf` or + /// `wai.video.hevc`), or a record or a derivation, which is no payload at all + /// (SPEC §5, *Kinds of registered string*). StandaloneAsCompanion { index: usize, capability: String }, /// A companion without `companion_of`, or whose `companion_of` (or /// `companion_of_id`) names no selectable rendition in this envelope. @@ -1799,7 +1801,7 @@ impl std::fmt::Display for RoleError { RoleError::CompanionOnlyAsRendition { index, capability } => write!( f, "component {index} ({capability}) is companion-only but is not marked role=\"companion\""), RoleError::StandaloneAsCompanion { index, capability } => write!( - f, "component {index} ({capability}) is standalone media, not a companion; carry it as a rendition"), + f, "component {index} ({capability}) is registered and not companion-only, so not a companion: a payload is carried as a rendition, and a record or a derivation is no payload"), RoleError::UnboundCompanion { index, capability } => write!( f, "companion {index} ({capability}) names no selectable rendition in companion_of"), RoleError::IncompatibleBase { index, capability, base } => { @@ -2182,8 +2184,8 @@ impl ManifestV2 { /// /// and, for each `role = "companion"` component, SPEC §7.1's three rules: /// - /// 1. its capability is companion-only or unregistered - /// ([`RoleError::StandaloneAsCompanion`]); + /// 1. its capability is companion-only or registered in no kind — a payload, a + /// record or a derivation is none ([`RoleError::StandaloneAsCompanion`]); /// 2. `companion_of` is present ([`RoleError::UnboundCompanion`]) and names a /// capability it applies to ([`RoleError::IncompatibleBase`]); a /// `companion_of_id` resolves to an entry ([`RoleError::CompanionIdUnresolved`]) @@ -2230,8 +2232,9 @@ impl ManifestV2 { } continue; } - // Rule 1: only a companion-only (or unregistered) capability is a companion. - if !companion_only && crate::codecs::is_known_capability(&m.capability) { + // Rule 1: only a companion-only (or unregistered) capability is a companion. A + // payload, a record or a derivation is registered, and none is one. + if !companion_only && crate::codecs::capability_kind(&m.capability).is_some() { return Err(RoleError::StandaloneAsCompanion { index, capability }); } let Some(target) = m.companion_of.as_deref() else { -- 2.54.0 (Apple Git-157) From 1601d3549628feb3d7333d63b103f55b46331ff9 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 01:24:50 -0400 Subject: [PATCH 14/21] wai: an encrypted envelope's clear parts checked; a record or derivation is no component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §2.4.12, against the envelopes: - An encrypted envelope (SPEC §6.4) is held: its manifest and rendition table are in the clear, so rules 4-9 read them as any held envelope's — the rendition an entry names, its capability, the component rules, a base's layer count, a companion-only capability, a fallback, a layer's refines and span — and leave to the signer only what needs a payload: its digests, a base's units and a layer's WIR1 payload. Rule 9 reads the classical length every well-formed WAI2's table declares, encrypted or not. Vectors: the review's three probes (rendition 9 of two, a relabelled rendition, the WAI2 named with no rendition), a base at two layers, a companion-only capability, a nonconforming refinement, an encrypted layer over an encrypted base (accepted). Re-derived, outside the pinned prefix: session_envelope_encrypted (390) now accepts; the classical-null case is session_envelope_encrypted_classical_unstated (389); session_envelope_inert_ unnamed_accept (397) states the classical length the encrypted table adds. - §2.4.12's signer's statements name whether a refinement's exploded envelope held as its own bytes was received on its own. SPEC §7.1: a component whose capability is a record or a derivation does not conform, in any role (record-or-derivation-as-component), in check_component_ roles and claim_verify.py; pin-conformance/selection.json gains a record and a derivation rendition, and its two companion cases take the new finding. session_roles_record_rendition pins it in the claim corpus. 555 vectors. staged-measurement's countability is cited by its heading (§3), so the section-refs check passes. differential.py adds an encrypted-envelope family. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 8 + wai/SPEC.md | 9 +- wai/claim-conformance/README.md | 20 +- wai/claim-conformance/claim_verify.py | 74 +++- wai/claim-conformance/differential.py | 31 ++ wai/claim-conformance/vectors.json | 396 +++++++++++++++++- wai/extensions/jwp-receipts.md | 68 +-- wai/pin-conformance/selection.json | 66 ++- wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 104 ++++- wai/wai-rs/src/claim_receipt/session.rs | 90 ++-- wai/wai-rs/src/codecs/mod.rs | 6 +- wai/wai-rs/src/container.rs | 28 +- 13 files changed, 757 insertions(+), 145 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index b390662c1..5793c9ee0 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -105,6 +105,14 @@ wire format may change and such changes are recorded here. for the whole envelope. A limitation of this revision, stated in http-delivery's status: the HTTP binding's plan does not yet withhold refinements of a nonconforming envelope. +- **An encrypted envelope's clear parts are checked** (§2.4.12). SPEC §6.4 encrypts + payloads only: rules 4–9 now read an encrypted envelope's manifest and rendition table + as any held envelope's — the rendition an entry names, its capability, the component + rules, a base's layer count, a companion-only capability, a fallback, and the classical + length its table declares — and leave to the signer only what needs a payload: its + digests, a base's units and a layer's `WIR1` payload. +- **A record or a derivation is no component in any role** (SPEC §7.1, *Component + identity*; `record-or-derivation-as-component`). - **A record or a derivation is no companion** (SPEC §7.1, rule 1). A companion's capability is companion-only or unregistered; a capability registered in another kind — a payload, a record or a derivation — is refused diff --git a/wai/SPEC.md b/wai/SPEC.md index 9a89931a2..a864cf150 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -1699,7 +1699,10 @@ by which capability happens to be installed. companion that does not match is not applied. An entry whose `id`, `sha256` or `companion_of_id` is not a string (`null` is the same as absent) makes the manifest malformed, as a mistyped pin member does (§3.1), and the reader rejects - the envelope. + the envelope. An entry's `capability` names a payload format: a capability §5 + registers as a record or a derivation (*Kinds of registered string*) names none, + so an entry of one, in any role, does not conform + (`record-or-derivation-as-component`). - **Exploding a component.** The exploded envelope of entry *i* is the `WAI1` envelope (§2) whose payload is entry *i*'s rendition bytes. Its manifest is the entry's `envelope_manifest` when it carries one, written exactly as it is in the @@ -1813,8 +1816,8 @@ A component with `role = "companion"` conforms only if: 1. its capability is companion-only, or is not registered in this revision. A capability registered in any other kind (§5, *Kinds of registered string*) is not a companion: a payload capability is standalone media — its payload decodes - on its own — and MUST be carried as a rendition, and a record or a derivation - names no payload format, so it is carried as neither; + on its own — and MUST be carried as a rendition, and a record or a derivation is + no component in any role (*Component identity*, above); 2. `companion_of` is present and names a capability the companion applies to. An HDR dynamic-metadata descriptor, registered as a companion to a video payload, applies to a registered capability whose payload is video — the diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index e99176cc6..29e5e6684 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -250,9 +250,11 @@ The vectors cover: (`session_object_duplicate`); an object a decoder entry names marked not presented, and one no entry names marked presented, the sums restated to agree (`session_presented_mismatch`); a `WAI1` envelope with no manifest members and bytes - of neither magic, each named by an entry (`session_envelope_unreadable`), and an - encrypted envelope named by one, whose plaintext's classical length the verifier - cannot read (`session_classical_mismatch`); a held inert envelope listed with counted bytes 0 + of neither magic, each named by an entry (`session_envelope_unreadable`); an + encrypted envelope named by one, checked against its manifest and rendition table in + the clear, refused for a classical length unstated, a rendition out of its table, + another capability, no rendition, a base at two layers, a companion-only capability + and a nonconforming refinement; a held inert envelope listed with counted bytes 0 (`session_counted_mismatch`); entries a sink cannot have decoded through — a `WAI2` companion, a rendition or refinement whose payload does not match its `sha256`, a `WAI1` whose capability is companion-only, a fallback that is @@ -310,17 +312,18 @@ with neither is a hole; there is none. | §4.1 steps 7–10 | `layer-conflict`, `prev-mismatch`, `layer-gap`, `geometry-mismatch`, `deadline-missed` | the signer's statement; rules 7 and 8 bound a layer's presentations to its count and units, and the `stage` claims the stages a unit reached | `session_layers_past_the_object`, `session_unit_outside_span`, `session_stage_beyond_applied` | | §4.1, after step 10 | a unit presented from a layer that failed for it | rules 7 and 8 | as above | | §4.3–§4.5 | the hold bound, batches, the chain budget for a base | the signer's statement | — | -| staged-delivery §9 | a `WAI2` component and its exploded envelope are one object | rules 5, 6 and 8 read a base in either form, and rules 4–8 read an entry naming a rendition by its exploded envelope's content hash, with only the `WAI2` held, as naming the rendition; the exploded envelope's own bytes, held, are a separate delivery | `session_alias_layer_on_component_accept`, `session_alias_layer_first_unit_not_its_base`, `session_alias_layer_unit_past_the_base`, `session_alias_exploded_held_first_unit`, `session_alias_component_layer_named_as_exploded`, `session_alias_entry_accept`, `session_alias_entry_relabelled`, `session_alias_entry_unit_past_the_base`, `session_alias_refinement_entry_first_unit`, `session_alias_refinement_entry_not_admitted`; a separate delivery: `session_roles_exploded_layer_delivered_alone_accept` | +| staged-delivery §9 | a `WAI2` component and its exploded envelope are one object | rules 5, 6 and 8 read a base in either form, and rules 4–8 read an entry naming a rendition by its exploded envelope's content hash, with only the `WAI2` held, as naming the rendition; the exploded envelope's own bytes, held, are a separate delivery, and whether they were received on their own is the signer's statement | `session_alias_layer_on_component_accept`, `session_alias_layer_first_unit_not_its_base`, `session_alias_layer_unit_past_the_base`, `session_alias_exploded_held_first_unit`, `session_alias_component_layer_named_as_exploded`, `session_alias_entry_accept`, `session_alias_entry_relabelled`, `session_alias_entry_unit_past_the_base`, `session_alias_refinement_entry_first_unit`, `session_alias_refinement_entry_not_admitted`; a separate delivery: `session_roles_exploded_layer_delivered_alone_accept` | | SPEC §4 steps 3, 5 | a `WAI1` decoded through its `capability`, else its `fallback`, and nothing else | rule 4, `session_source_mismatch` | `session_relabel_wai1_base`, `session_relabel_av1` | | SPEC §4 | a capability that is not dispatchable never taken; a `WAI1` whose capability is companion-only inert, its fallback never taken | rule 4 | `session_wai1_fallback_not_dispatchable`, `session_wai1_companion_only_capability` | | SPEC §4 step 5 | the fallback decodes the same payload | rule 8 reads the units in the payload's own format | `session_unit_fallback_past_the_title`, `session_unit_fallback_format_past_the_title`, `session_unit_fallback_format_audio`; accepted: `session_unit_fallback_accept`, `session_unit_fallback_format_accept` | | SPEC §3.1, §4 | a pin that does not resolve, a module not held, a key log's revocation | the signer's statement, which a decoder entry's `pin` and `tier` state | — | -| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3) | rule 3 admits an entry naming it; what the entry states of it is the signer's statement, and no classical length is read from it | `session_envelope_encrypted_named_accept`, `session_envelope_encrypted` (`session_classical_mismatch`) | +| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3), its manifest and rendition table in the clear | rule 3 admits an entry naming it; rules 4–9 read its manifest and table as any held envelope's, and what needs a payload — its digests, a base's units, a layer's `WIR1` payload — is the signer's statement | `session_envelope_encrypted`, `session_envelope_encrypted_layer_accept`; refused: `session_envelope_encrypted_classical_unstated`, `session_envelope_encrypted_rendition_out_of_range`, `session_envelope_encrypted_relabelled`, `session_envelope_encrypted_no_rendition`, `session_envelope_encrypted_base_layers`, `session_envelope_encrypted_companion_only`, `session_envelope_encrypted_roles` | | SPEC §5 | a refinement-only capability is never a `capability` or `fallback` a sink dispatches, a selectable rendition or a companion | rules 4 and 5 | `session_layer_with_fallback`, `session_wai2_refines_on_a_rendition` | | SPEC §7.1, *Selection algorithm* | a companion, or a capability that is not dispatchable, is never picked | rule 4 | `session_wai2_entry_names_a_companion` | | SPEC §7.1, *Component identity* | `component_digest_mismatch`: a rendition whose payload does not match its `sha256` is skipped, a refinement is not offered | rule 4 | `session_wai2_rendition_digest_mismatch`, `session_wai2_refinement_digest_mismatch` | | SPEC §7.1, *Component identity* | an `id`, `sha256` or `companion_of_id` that is not a string: the reader rejects the envelope | rule 3 | `session_wai2_component_id_not_a_string` | -| SPEC §7.1, *Refinement components*, *Selection* (every `WaiMulti::check_component_roles` code: the refinement codes, `refines-on-non-refinement`, `refinement-only-as-component`, the companion codes, `component-id-malformed`, `duplicate-component-id`) | a sink offers a `WAI2`'s refinements only when every component conforms | rule 5, the whole envelope | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_roles_refinement_before_selectable_exploded`, `session_wai2_refines_on_a_rendition`, `session_roles_base_without_sha256`, `session_roles_layer_before_its_prev`, `session_roles_unbound_companion`, `session_roles_record_companion`, `session_roles_derivation_companion` (a companion whose capability is a record or a derivation, registered and so no companion; `pin-conformance/selection.json`'s `record_as_companion` and `derivation_as_companion` pin the same finding for the envelope alone); accepted: `session_roles_companion_and_refinement_accept`, `session_roles_companion_by_id_and_refinement_accept` | +| SPEC §7.1, *Component identity* | a component, in any role, whose capability is a record or a derivation (`record-or-derivation-as-component`): the envelope does not conform | rule 5, the whole envelope | `session_roles_record_rendition`, `session_roles_record_companion`, `session_roles_derivation_companion`; `pin-conformance/selection.json`: `record_as_rendition`, `derivation_as_rendition`, `record_as_companion`, `derivation_as_companion` | +| SPEC §7.1, *Refinement components*, *Selection* (every `WaiMulti::check_component_roles` code: the refinement codes, `refines-on-non-refinement`, `refinement-only-as-component`, the companion codes, `component-id-malformed`, `duplicate-component-id`) | a sink offers a `WAI2`'s refinements only when every component conforms | rule 5, the whole envelope | `session_wai2_refinement_identity_missing`, `session_wai2_refines_base_missing`, `session_wai2_refines_base_companion`, `session_wai2_layer_base_not_admitted`, `session_wai2_refinement_prev_missing`, `session_wai2_refinement_before_selectable`, `session_roles_refinement_before_selectable_exploded`, `session_wai2_refines_on_a_rendition`, `session_roles_base_without_sha256`, `session_roles_layer_before_its_prev`, `session_roles_unbound_companion`, `session_roles_record_companion`, `session_roles_derivation_companion`, `session_roles_record_rendition`; accepted: `session_roles_companion_and_refinement_accept`, `session_roles_companion_by_id_and_refinement_accept` | | SPEC §7.1, *Companion components* | a companion that breaks rules 1–3 or its `companion_of_id`; an enhancement layer whose base is not unique | for the rendition picked, no bearing: a sink does not apply the companion and may still present the rendition, the output's digest holding whatever was applied; for the envelope's refinements, the row above | `session_roles_unbound_companion` | ## Steps 1 and 2: types, and the order a body is read in @@ -460,7 +463,10 @@ exploded envelope's content hash, its own bytes held or not; and, over every reg capability and an unregistered string, a refinement beside a companion of that capability bound to the base, and beside an HDR10+ descriptor and an enhancement layer bound to a rendition of it (SPEC §7.1's component rules, which decide whether the -envelope offers its refinements). Further session families: +envelope offers its refinements); and the model session with its `WAI2` envelope +encrypted, its `security` well formed or not, the entry decoding it naming a rendition +in its table, out of it or none, its capability or another, and the classical length +stated as the table gives it or not. Further session families: sessions that pass steps 1–5 against a `stage` claim whose first layer applied to some units and arrived late for others, presented at one to three layers, with objects that hold or lack the set's base and layers (both bounds of §2.4.12's check), the base's or diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 7a4e6e885..a775500d2 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -932,6 +932,27 @@ def read_envelope(data): return None +def read_any(data): + """A held envelope, read: (read_envelope's form, sealed). An encrypted one (SPEC §6.4) + is read too — its manifest and rendition table are in the clear — with sealed true, + since its payloads are not; None for any other bytes.""" + r = read_envelope(data) + if r is not None: + return r, False + if not encrypted_envelope(data): + return None + if data[:4] == b"WAI2": + m, lengths = wai2_read(data) + o = 8 + struct.unpack_from(" bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 547 + 555 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index f12898a21..1e63174fe 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -1000,22 +1000,35 @@ pub(super) fn vectors() -> Vec { Err(Reason::SessionClassicalMismatch), )); // An encrypted envelope an entry names: a sink holding its key decrypts and dispatches - // it (SPEC §6.4 step 3), so the verifier, holding no key, checks nothing of it further; - // nor does it read a classical length from it. + // it (SPEC §6.4 step 3). Its manifest and rendition table are in the clear, so the + // verifier checks every entry against them, and reads the classical length the table + // declares; only what needs a payload — its digests, its units — is the signer's. v.push(env( - "session_envelope_encrypted_named_accept", - "the WAI2 envelope encrypted, its first rendition decoded by a sink that holds the key: what the entry names of it is the signer's statement, and no classical length is read from it", + "session_envelope_encrypted_classical_unstated", + "the WAI2 envelope encrypted, its first rendition decoded by a sink that holds the key, and no classical length stated: the rendition table, in the clear, declares the classical rendition the session did not need", SessionClaim { classical_declared: None, classical_source: None, ..m() }, vec![encrypted_envelope()], - Ok(()), - )); - v.push(env( - "session_envelope_encrypted", - "the WAI2 envelope encrypted, with the classical length its plaintext would give stated: the verifier reads no classical rendition from an envelope it cannot open", - m(), - vec![encrypted_envelope()], Err(Reason::SessionClassicalMismatch), )); + v.push(env( + "session_envelope_encrypted", + "the WAI2 envelope encrypted, its first rendition decoded by a sink that holds the key: the entry checked against the manifest in the clear, and the classical length read from the table", + m(), + vec![encrypted_envelope()], + Ok(()), + )); + for (name, about, edit) in [ + ("session_envelope_encrypted_rendition_out_of_range", "an entry naming rendition 9 of the encrypted WAI2 envelope, whose table, in the clear, has two", (|d: &mut DecoderEntry| d.rendition = Some(9)) as fn(&mut DecoderEntry)), + ("session_envelope_encrypted_relabelled", "an entry naming the encrypted envelope's second rendition, wai.video.avc in the manifest, as wai.audio.opus", |d: &mut DecoderEntry| { + d.rendition = Some(1); + d.capability = "wai.audio.opus".into(); + d.pin = None; + d.tier = None; + }), + ("session_envelope_encrypted_no_rendition", "an entry naming the encrypted WAI2 envelope with no rendition", |d: &mut DecoderEntry| d.rendition = None), + ] { + v.push(env(name, about, { let mut s = m(); edit(&mut s.decoders[1]); s }, vec![encrypted_envelope()], Err(Reason::SessionSourceMismatch))); + } let unreadable_wai1 = b"WAI1\x02\x00\x00\x00{}\x00\x00\x00\x00".to_vec(); let neither = b"WAI3\x00\x00\x00\x00".to_vec(); v.push(env( @@ -1047,8 +1060,8 @@ pub(super) fn vectors() -> Vec { v.push(all_held( claim( "session_envelope_inert_unnamed_accept", - "an encrypted WAI2 envelope the session received and could not open, named by no entry: listed uncounted and not presented, and held; every context held", - sealed(counted_from(m(), &with_encrypted)).to_json(), + "an encrypted WAI2 envelope the session received and could not open, named by no entry: listed uncounted and not presented, and held, its classical rendition's length, which its table declares in the clear, in the classical length; every context held", + sealed(SessionClaim { classical_declared: Some(1_400), ..counted_from(m(), &with_encrypted) }).to_json(), Ok(()), ), &ps, @@ -2521,6 +2534,71 @@ fn resolve_vectors() -> Vec { v.push(vector(name, about, vec![e.clone()], vec![e.clone()], vec![dec(HYPER, Some(0), &e, 0), dec(REFINE, Some(2), &e, 0)], and(four(0), &[pres(1, 2, 1)]), reason)); } + // An encrypted envelope's manifest and table are in the clear: the rules read them. + let encrypt1 = |e: &[u8]| { + let mut w = crate::container::Wai::from_bytes(e).expect("a WAI1 envelope"); + w.manifest.security = Some(crate::container::Security::new("mls-sframe", 1)); + w.to_bytes().expect("a WAI1 envelope") + }; + let encrypt2 = |e: &[u8]| { + let mut w = WaiMulti::from_bytes(e).expect("a WAI2 envelope"); + w.manifest.extra.insert("security".into(), json!({ "encryption": "mls-sframe", "kid": 1 })); + w.to_bytes().expect("a WAI2 envelope") + }; + { + let eb = encrypt1(&base_envelope()); + let el = encrypt1(&wai1_of(REFINE, None, Some(rc(&hex(&h(&eb)), &hex(&h(&eb)), 1, Some((1, 1)))), wir1_payload(1))); + v.push(vector( + "session_envelope_encrypted_layer_accept", + "an encrypted base and an encrypted layer over it, decoded by a sink holding the key: every check the manifests allow passes; the payloads' units are the signer's statement", + vec![eb.clone(), el.clone()], + vec![eb.clone(), el.clone()], + vec![dec(HYPER, None, &eb, 0), dec(REFINE, None, &el, 0)], + and(four(0), &[pres(1, 2, 1)]), + None, + )); + v.push(vector( + "session_envelope_encrypted_base_layers", + "unit 0 of the encrypted base presented at two layers through its own entry: a base gives one, as its manifest in the clear says", + vec![eb.clone()], + vec![eb.clone()], + vec![dec(HYPER, None, &eb, 0)], + and(four(0), &[pres(0, 2, 0)]), + Some(Reason::SessionLayersMismatch), + )); + let hdr = encrypt1(&wai1_of("wai.meta.hdr10plus", Some(HYPER), None, wiv1(4))); + v.push(vector( + "session_envelope_encrypted_companion_only", + "an encrypted WAI1 whose capability, in the clear, is companion-only, decoded through its fallback: inert, its fallback never taken", + vec![hdr.clone()], + vec![hdr.clone()], + vec![dec(HYPER, None, &hdr, 0)], + four(0), + Some(Reason::SessionSourceMismatch), + )); + let ewp = encrypt2(&wp); + v.push(vector( + "session_envelope_encrypted_roles", + "an encrypted WAI2 whose refinement, in the clear, comes before a selectable rendition: the envelope does not conform, so no refinement of it is offered", + vec![ewp.clone()], + vec![ewp.clone()], + vec![dec(HYPER, Some(0), &ewp, 0), dec(REFINE, Some(1), &ewp, 0)], + and(four(0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + } + { + let rec = wai2_of(vec![base_c(), component_of("wai.video.manifest", "m", None, None, b"a manifest record".to_vec(), None), refinement(REFINE, "r", rc("b", "b", 1, Some((1, 1))), 1)]); + v.push(vector( + "session_roles_record_rendition", + "a refinement beside a component of wai.video.manifest, a record, with no role: a record is no component in any role, so the envelope offers no refinement", + vec![rec.clone()], + vec![rec.clone()], + vec![dec(HYPER, Some(0), &rec, 0), dec(REFINE, Some(2), &rec, 0)], + and(four(0), &[pres(1, 2, 1)]), + Some(Reason::SessionLayerNotApplicable), + )); + } // A manifest whose capability is not refinement-only is a base: a refines it carries is // ignored (SPEC §4, staged-delivery §3). let base = base_envelope(); diff --git a/wai/wai-rs/src/claim_receipt/session.rs b/wai/wai-rs/src/claim_receipt/session.rs index f094e3dbd..f146bd415 100644 --- a/wai/wai-rs/src/claim_receipt/session.rs +++ b/wai/wai-rs/src/claim_receipt/session.rs @@ -992,7 +992,7 @@ impl ClaimReceipt { /// `classical_declared`, which is `null` exactly when there is none /// (`session_classical_mismatch`). pub fn check_session_envelopes(&self, envelopes: &[&[u8]], objects: Option<&[ObjectSeen]>, outputs: Option<&[Presentation]>) -> Result<(), Rejection> { - use crate::container::{manifest_v2_plaintext, RefForm, Refines, Wai, WaiMulti}; + use crate::container::{RefForm, Refines, Wai, WaiMulti}; let s = self.session()?; let hash = crate::jwp_hash::content_hash; // 1. Each envelope was received. @@ -1014,23 +1014,28 @@ impl ClaimReceipt { One(Wai), Multi(WaiMulti), } - let read_one = |bytes: &[u8]| -> Option { + // A held envelope: one that reads as a WAI1 or WAI2 envelope whose payloads are + // plaintext, or encrypted — well formed, its `security` a security object naming an + // encryption, which a sink holding the key decrypts and dispatches (SPEC §6.4 step + // 3). An encrypted envelope's manifest and rendition table are in the clear (§6.1): + // the rules below read them, and nothing that needs a payload. `true` for encrypted. + let read_one = |bytes: &[u8]| -> Option<(Read, bool)> { match bytes.get(..4) { - Some(b"WAI2") => WaiMulti::from_bytes(bytes).ok().filter(|w| manifest_v2_plaintext(&w.manifest)).map(Read::Multi), - Some(b"WAI1") => Wai::from_bytes(bytes).ok().filter(|w| w.manifest.security.as_ref().is_none_or(|x| x.is_plaintext())).map(Read::One), + Some(b"WAI2") => { + let w = WaiMulti::from_bytes(bytes).ok()?; + match crate::container::manifest_v2_security(&w.manifest) { + Ok(s) => Some((Read::Multi(w), s.as_ref().is_some_and(|x| !x.is_plaintext()))), + Err(_) => None, + } + } + Some(b"WAI1") => { + let w = Wai::from_bytes(bytes).ok()?; + let sealed = w.manifest.security.as_ref().is_some_and(|x| !x.is_plaintext()); + Some((Read::One(w), sealed)) + } _ => None, } }; - // An envelope a sink holding its key decrypts and dispatches (SPEC §6.4 step 3): well - // formed, with a `security` object naming an encryption. - let encrypted_one = |bytes: &[u8]| -> bool { - match bytes.get(..4) { - Some(b"WAI2") => WaiMulti::from_bytes(bytes) - .is_ok_and(|w| matches!(crate::container::manifest_v2_security(&w.manifest), Ok(Some(x)) if !x.is_plaintext())), - Some(b"WAI1") => Wai::from_bytes(bytes).is_ok_and(|w| w.manifest.security.as_ref().is_some_and(|x| !x.is_plaintext())), - _ => false, - } - }; let mut read: Vec<([u8; 32], Read)> = Vec::new(); let mut inert: Vec<[u8; 32]> = Vec::new(); let mut encrypted: Vec<[u8; 32]> = Vec::new(); @@ -1040,8 +1045,11 @@ impl ClaimReceipt { let mut exploded: Vec<([u8; 32], [u8; 32], u64)> = Vec::new(); for bytes in envelopes { match read_one(bytes) { - Some(r) => { + Some((r, sealed)) => { let h = hash(bytes); + if sealed { + encrypted.push(h); + } if matches!(r, Read::Multi(_)) && let Ok(each) = WaiMulti::explode_each(bytes) { @@ -1053,14 +1061,15 @@ impl ClaimReceipt { } read.push((h, r)); } - None if encrypted_one(bytes) => encrypted.push(hash(bytes)), None => inert.push(hash(bytes)), } } let held = |object: &[u8; 32]| read.iter().find(|(h, _)| h == object).map(|(_, r)| r); - // 3. An envelope a decoder entry names is readable, or encrypted: a sink holding its - // key decrypts it, and the verifier, holding no key, checks nothing further of it. - if s.decoders.iter().any(|d| inert.contains(&d.object) && held(&d.object).is_none() && !encrypted.contains(&d.object)) { + // An encrypted envelope's payloads are not read: its digests, its units and a + // layer's WIR1 payload are its signer's statement. + let sealed = |object: &[u8; 32]| encrypted.contains(object); + // 3. An envelope a decoder entry names is readable or encrypted. + if s.decoders.iter().any(|d| inert.contains(&d.object) && held(&d.object).is_none()) { return Err(Rejection::at(6, Reason::SessionEnvelopeUnreadable)); } // Each entry as the envelopes resolve it: an entry naming a held WAI2 rendition by @@ -1091,7 +1100,9 @@ impl ClaimReceipt { let gives = match held(&d.object) { Some(Read::Multi(w)) => usize::try_from(d.rendition.unwrap_or(u64::MAX)).ok().is_some_and(|i| { w.manifest.renditions.get(i).is_some_and(|m| { - m.capability == d.capability && (m.is_selectable() || layer_entry(m)) && m.payload_digest_matches(&w.renditions[i]) + m.capability == d.capability + && (m.is_selectable() || layer_entry(m)) + && (sealed(&d.object) || m.payload_digest_matches(&w.renditions[i])) }) }), Some(Read::One(w)) => { @@ -1099,7 +1110,7 @@ impl ClaimReceipt { && (w.capability() == d.capability || w.fallback() == Some(d.capability.as_str())) && (layer_one(w) || (crate::codecs::is_dispatchable(&d.capability) && !crate::codecs::is_companion_only(w.capability()))) } - None => d.rendition.is_none() || encrypted.contains(&d.object), + None => d.rendition.is_none(), }; if !gives { return Err(Rejection::at(6, Reason::SessionSourceMismatch)); @@ -1112,23 +1123,21 @@ impl ClaimReceipt { units: Option, is_base: bool, } - let component = |w: &WaiMulti, j: usize| -> Base { + let component = |w: &WaiMulti, j: usize, sealed: bool| -> Base { let m = &w.manifest.renditions[j]; - Base { capability: m.capability.clone(), units: payload_units(&m.capability, &w.renditions[j]), is_base: m.is_selectable() } + let units = if sealed { None } else { payload_units(&m.capability, &w.renditions[j]) }; + Base { capability: m.capability.clone(), units, is_base: m.is_selectable() } }; // The base a layer names, where held: a WAI1 envelope by its content hash, or a WAI2 // rendition, by its exploded envelope's content hash or by its envelope and index. let base_by_hash = |h: &[u8; 32]| -> Option { if let Some(Read::One(b)) = held(h) { - return Some(Base { - capability: b.capability().to_string(), - units: base_units(b.capability(), b.fallback(), &b.payload), - is_base: !layer_one(b), - }); + let units = if sealed(h) { None } else { base_units(b.capability(), b.fallback(), &b.payload) }; + return Some(Base { capability: b.capability().to_string(), units, is_base: !layer_one(b) }); } let &(_, w, j) = exploded.iter().find(|(x, ..)| x == h)?; match held(&w)? { - Read::Multi(m) => Some(component(m, j as usize)), + Read::Multi(m) => Some(component(m, j as usize, sealed(&w))), Read::One(_) => None, } }; @@ -1155,7 +1164,7 @@ impl ClaimReceipt { } // A layer of capability `cap` over the base `b` (where held) named by `names`, with // `r` its refines and `payload` its WIR1 payload: what a sink applies, or nothing. - let layer_of = |cap: &str, r: &Refines, b: Option, names: (Vec<[u8; 32]>, Vec<([u8; 32], u64)>), payload: &[u8]| -> Gives { + let layer_of = |cap: &str, r: &Refines, b: Option, names: (Vec<[u8; 32]>, Vec<([u8; 32], u64)>), payload: Option<&[u8]>| -> Gives { let n = match &b { Some(b) if !b.is_base || !crate::codecs::admits(cap, &b.capability) => return Gives::NotApplicable, Some(b) => b.units, @@ -1180,11 +1189,14 @@ impl ClaimReceipt { return Gives::NotApplicable; } let Ok((layers, span)) = layer_of_refines(r, n) else { return Gives::NotApplicable }; - // Its payload parses as WIR1 for its unit kind, with a unit for each it covers. + // Its payload, where it is read, parses as WIR1 for its unit kind, with a unit for + // each it covers. let Some(kind) = crate::staged::unit_kind(cap) else { return Gives::NotApplicable }; - let Ok(p) = crate::staged::wir1::parse(payload, kind) else { return Gives::NotApplicable }; - if span.is_some_and(|(_, count)| u64::from(p.n_units) != count) { - return Gives::NotApplicable; + if let Some(payload) = payload { + let Ok(p) = crate::staged::wir1::parse(payload, kind) else { return Gives::NotApplicable }; + if span.is_some_and(|(_, count)| u64::from(p.n_units) != count) { + return Gives::NotApplicable; + } } Gives::Layer { layers, span, first_units: over } }; @@ -1193,21 +1205,22 @@ impl ClaimReceipt { match held(&object)? { Read::One(w) => { if !layer_one(w) { - return Some(Gives::Base(base_units(w.capability(), w.fallback(), &w.payload))); + return Some(Gives::Base(if sealed(&object) { None } else { base_units(w.capability(), w.fallback(), &w.payload) })); } let Some(Ok(r)) = w.refines() else { return Some(Gives::NotApplicable) }; if w.fallback().is_some() { return Some(Gives::NotApplicable); } let base = unhex(&r.base).and_then(|v| <[u8; 32]>::try_from(v).ok())?; - Some(layer_of(w.capability(), &r, base_by_hash(&base), names_of(Some(base), None), &w.payload)) + let payload = (!sealed(&object)).then_some(w.payload.as_slice()); + Some(layer_of(w.capability(), &r, base_by_hash(&base), names_of(Some(base), None), payload)) } Read::Multi(w) => { let i = usize::try_from(rendition?).ok()?; let rs = &w.manifest.renditions; let m = rs.get(i)?; if !layer_entry(m) { - return Some(Gives::Base(payload_units(&m.capability, &w.renditions[i]))); + return Some(Gives::Base(if sealed(&object) { None } else { payload_units(&m.capability, &w.renditions[i]) })); } // SPEC §7.1: a sink offers a WAI2's refinements only when every one of its // components conforms (`check_component_roles`). @@ -1216,7 +1229,8 @@ impl ClaimReceipt { } let r = Refines::from_value(m.refines.as_ref()?, RefForm::ComponentId).ok()?; let j = rs.iter().position(|e| e.id.as_deref() == Some(r.base.as_str()))?; - Some(layer_of(&m.capability, &r, Some(component(w, j)), names_of(None, Some((object, j as u64))), &w.renditions[i])) + let payload = (!sealed(&object)).then_some(w.renditions[i].as_slice()); + Some(layer_of(&m.capability, &r, Some(component(w, j, sealed(&object))), names_of(None, Some((object, j as u64))), payload)) } } }; diff --git a/wai/wai-rs/src/codecs/mod.rs b/wai/wai-rs/src/codecs/mod.rs index b08984917..e1c0f0c8f 100644 --- a/wai/wai-rs/src/codecs/mod.rs +++ b/wai/wai-rs/src/codecs/mod.rs @@ -637,8 +637,10 @@ pub fn is_known_capability(cap: &str) -> bool { /// payload; an LCEVC enhancement adds residuals to one. Such a capability is /// never dispatched standalone — not as a v1.0 `capability` or `fallback`, not /// as a v1.1 selectable rendition — only as a v1.1 companion. The converse -/// holds too: every other registered capability is standalone media, and is -/// never a companion (SPEC §7.1, rule 1). +/// holds too: no other registered capability is ever a companion (SPEC §7.1, rule +/// 1). Every other payload capability is standalone media; a refinement-only +/// capability is a layer; and a record or a derivation names no payload format, so +/// it is no `WAI2` component in any role. pub fn is_companion_only(cap: &str) -> bool { matches!(cap, CAP_META_HDR10PLUS | CAP_META_DOVI | CAP_VIDEO_LCEVC) } diff --git a/wai/wai-rs/src/container.rs b/wai/wai-rs/src/container.rs index 541c9684d..2fca83f3d 100644 --- a/wai/wai-rs/src/container.rs +++ b/wai/wai-rs/src/container.rs @@ -1695,11 +1695,13 @@ pub enum RoleError { /// A companion-only capability (HDR dynamic metadata, an enhancement /// layer) listed as a selectable rendition instead of as a companion. CompanionOnlyAsRendition { index: usize, capability: String }, - /// A registered capability that is not companion-only marked `role = "companion"`: - /// a payload capability, standalone media (such as `wai.audio.iamf` or - /// `wai.video.hevc`), or a record or a derivation, which is no payload at all - /// (SPEC §5, *Kinds of registered string*). + /// A registered payload capability, standalone media (one that is not + /// companion-only, such as `wai.audio.iamf` or `wai.video.hevc`), marked + /// `role = "companion"`. StandaloneAsCompanion { index: usize, capability: String }, + /// A component, in any role, whose capability is a record or a derivation (SPEC §5, + /// *Kinds of registered string*), which names no payload format. + RecordOrDerivationAsComponent { index: usize, capability: String }, /// A companion without `companion_of`, or whose `companion_of` (or /// `companion_of_id`) names no selectable rendition in this envelope. UnboundCompanion { index: usize, capability: String }, @@ -1764,6 +1766,7 @@ impl RoleError { RoleError::CompanionOnlyAsFallback { .. } => "companion-only-as-fallback", RoleError::CompanionOnlyAsRendition { .. } => "companion-only-as-rendition", RoleError::StandaloneAsCompanion { .. } => "standalone-as-companion", + RoleError::RecordOrDerivationAsComponent { .. } => "record-or-derivation-as-component", RoleError::UnboundCompanion { .. } => "unbound-companion", RoleError::IncompatibleBase { .. } => "incompatible-base", RoleError::EnhancementBaseNotUnique { .. } => "enhancement-base-not-unique", @@ -1801,7 +1804,9 @@ impl std::fmt::Display for RoleError { RoleError::CompanionOnlyAsRendition { index, capability } => write!( f, "component {index} ({capability}) is companion-only but is not marked role=\"companion\""), RoleError::StandaloneAsCompanion { index, capability } => write!( - f, "component {index} ({capability}) is registered and not companion-only, so not a companion: a payload is carried as a rendition, and a record or a derivation is no payload"), + f, "component {index} ({capability}) is standalone media, not a companion; carry it as a rendition"), + RoleError::RecordOrDerivationAsComponent { index, capability } => write!( + f, "component {index} ({capability}) is a record or a derivation, which names no payload format: no component of a WAI2"), RoleError::UnboundCompanion { index, capability } => write!( f, "companion {index} ({capability}) names no selectable rendition in companion_of"), RoleError::IncompatibleBase { index, capability, base } => { @@ -2184,8 +2189,9 @@ impl ManifestV2 { /// /// and, for each `role = "companion"` component, SPEC §7.1's three rules: /// - /// 1. its capability is companion-only or registered in no kind — a payload, a - /// record or a derivation is none ([`RoleError::StandaloneAsCompanion`]); + /// 1. its capability is companion-only or unregistered: not a payload + /// ([`RoleError::StandaloneAsCompanion`]); a record or a derivation is no component + /// in any role ([`RoleError::RecordOrDerivationAsComponent`], checked first); /// 2. `companion_of` is present ([`RoleError::UnboundCompanion`]) and names a /// capability it applies to ([`RoleError::IncompatibleBase`]); a /// `companion_of_id` resolves to an entry ([`RoleError::CompanionIdUnresolved`]) @@ -2215,6 +2221,10 @@ impl ManifestV2 { } for (index, m) in metas.iter().enumerate() { let capability = m.capability.clone(); + // A record or a derivation names no payload format: no component in any role. + if matches!(crate::codecs::capability_kind(&m.capability), Some(crate::codecs::Kind::Record | crate::codecs::Kind::Derivation)) { + return Err(RoleError::RecordOrDerivationAsComponent { index, capability }); + } if m.is_refinement() { self.check_refinement(index)?; continue; @@ -2232,8 +2242,8 @@ impl ManifestV2 { } continue; } - // Rule 1: only a companion-only (or unregistered) capability is a companion. A - // payload, a record or a derivation is registered, and none is one. + // Rule 1: only a companion-only (or unregistered) capability is a companion; a + // payload is standalone media (a record or a derivation was refused above). if !companion_only && crate::codecs::capability_kind(&m.capability).is_some() { return Err(RoleError::StandaloneAsCompanion { index, capability }); } -- 2.54.0 (Apple Git-157) From d73564c48a2498b99dccacb2b2c415dd140db034 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 01:27:23 -0400 Subject: [PATCH 15/21] =?UTF-8?q?wai:=20stage=20explode=20gates=20on=20cap?= =?UTF-8?q?ability;=20the=20=C2=A74.1=20sentence=20scoped;=20the=20caller-?= =?UTF-8?q?offers=20case=20named?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - wai stage explode refuses a component of a nonconforming WAI2 that is of a refinement-only capability or marked a refinement, not only one marked a refinement: a role-less wai.video.int_refine component, with refines or without, no longer explodes into a layer stage apply would route as one. tests/cli_stage.rs: explode_gives_no_layer_of_a_nonconforming_envelope, over refinement_before_selectable.wai, refinement_only_as_component.wai and ok_explode.wai with its refinement's role taken away; bases and conforming layers still explode. - staged-delivery §4.1: an envelope whose capability is not refinement-only reaches step 1 only through a caller's offer, and step 1 refuses it as it refuses a refinement-only envelope with a fallback. - staged-conformance: capability_not_refinement's about and the README say the case tests the caller-offers path. - codecs::is_companion_only's comment no longer calls every other registered capability standalone media. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 3 ++- wai/extensions/staged-delivery.md | 5 ++-- wai/staged-conformance/README.md | 5 ++++ .../cases/capability_not_refinement/case.json | 2 +- wai/staged-conformance/index.json | 2 +- wai/wai-rs/src/bin/wai_cli/stage.rs | 5 ++-- wai/wai-rs/src/bin/wai_staged_vectors.rs | 2 +- wai/wai-rs/tests/cli_stage.rs | 27 +++++++++++++++++++ 8 files changed, 43 insertions(+), 8 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 5793c9ee0..40765679b 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -101,7 +101,8 @@ wire format may change and such changes are recorded here. *Selection*). The text now states the reference sink's rule: an envelope one of whose components breaks a rule of §7.1 or §5 (`check_component_roles`, now on `ManifestV2`) offers none of its refinements, and may still present the rendition it picked. `wai - stage explode` follows it, refusing a refinement of such an envelope; rule 5 matches it + stage explode` follows it, refusing to explode a component of such an envelope that is + of a refinement-only capability or marked a refinement; rule 5 matches it for the whole envelope. A limitation of this revision, stated in http-delivery's status: the HTTP binding's plan does not yet withhold refinements of a nonconforming envelope. diff --git a/wai/extensions/staged-delivery.md b/wai/extensions/staged-delivery.md index 1b6597124..21fcfd21f 100644 --- a/wai/extensions/staged-delivery.md +++ b/wai/extensions/staged-delivery.md @@ -84,8 +84,9 @@ revision does not define is ignored (SPEC §8). A sink that implements this extension **MUST** process each received envelope *R* whose capability is refinement-only as follows. A sink routes by capability (§3), so an -envelope of any other capability reaches step 1 only where a caller offers it to this -algorithm as a layer, which refuses it (`capability-not-refinement`). Steps 1–6 decide for the whole +envelope whose capability is not refinement-only reaches step 1 only where a caller +offers it to this algorithm as a layer; step 1 refuses it, as it refuses a +refinement-only envelope whose fallback is not `null` (`capability-not-refinement`). Steps 1–6 decide for the whole envelope; steps 7–10 decide for each unit *u* the layer covers. The first step that fails is the reason for the envelope (1–6) or for the unit (7–10). diff --git a/wai/staged-conformance/README.md b/wai/staged-conformance/README.md index 89c4b5386..fe8a212d7 100644 --- a/wai/staged-conformance/README.md +++ b/wai/staged-conformance/README.md @@ -16,6 +16,11 @@ applied, held and refused (a unit held and decided within the same step is repor its decision); `held_for_base` marks an envelope held for a base the sink has not decoded. The order of a step's reports is not part of the outcome. +**Offers.** A case's `offer` step hands its envelope to §4 as a layer, as a caller of a +sink's offer does. A sink routes an envelope by its capability (§3), so it never offers +one whose capability is not refinement-only: the case `capability_not_refinement` tests +that caller-offers path, which §4.1 step 1 refuses (`capability-not-refinement`). + **Evidence.** Each offer states what the sink verified of the layer's delivery receipt (§10.1), as a token: `delivered-verified`, a receipt verified through jwp-receipts §3 step 6 over the envelope's bytes as received; `inclusion-verified`, a receipt verified diff --git a/wai/staged-conformance/cases/capability_not_refinement/case.json b/wai/staged-conformance/cases/capability_not_refinement/case.json index 89a0b794c..a3427fddc 100644 --- a/wai/staged-conformance/cases/capability_not_refinement/case.json +++ b/wai/staged-conformance/cases/capability_not_refinement/case.json @@ -1,7 +1,7 @@ { "format": "wai-staged-case/1", "name": "capability_not_refinement", - "about": "refines on a wai.video.int_motion envelope: capability-not-refinement", + "about": "refines on a wai.video.int_motion envelope, offered to §4 as a layer by a caller (a sink routes it by its capability, as a base, and never offers it): capability-not-refinement", "bases": [ { "file": "base.wai", diff --git a/wai/staged-conformance/index.json b/wai/staged-conformance/index.json index 10829dd2a..1c8064809 100644 --- a/wai/staged-conformance/index.json +++ b/wai/staged-conformance/index.json @@ -216,7 +216,7 @@ }, { "name": "capability_not_refinement", - "about": "refines on a wai.video.int_motion envelope: capability-not-refinement", + "about": "refines on a wai.video.int_motion envelope, offered to §4 as a layer by a caller (a sink routes it by its capability, as a base, and never offers it): capability-not-refinement", "clip_sha256": [ "39d743f21b782cc4ea1d1bacb50e0244af72459a21746ef19e6571a9a712c3ad" ] diff --git a/wai/wai-rs/src/bin/wai_cli/stage.rs b/wai/wai-rs/src/bin/wai_cli/stage.rs index e061f3632..46bb4ea23 100644 --- a/wai/wai-rs/src/bin/wai_cli/stage.rs +++ b/wai/wai-rs/src/bin/wai_cli/stage.rs @@ -650,9 +650,10 @@ fn explode(args: &[String]) -> Result<(), String> { }; let envelope = read(path)?; // A sink offers a WAI2's refinements only when its components all conform (SPEC §7.1, - // *Refinement components*): explode gives none of a nonconforming envelope. + // *Refinement components*): explode gives no layer of a nonconforming envelope — a + // component of a refinement-only capability, or one marked a refinement. let w = WaiMulti::from_bytes(&envelope).map_err(|e| e.to_string())?; - if w.manifest.renditions.get(i).is_some_and(|m| m.is_refinement()) { + if w.manifest.renditions.get(i).is_some_and(|m| wai::codecs::is_refinement_only(&m.capability) || m.is_refinement()) { w.check_component_roles().map_err(|e| format!("{path}: no refinement is offered from it: {e}"))?; } let bytes = WaiMulti::explode(&envelope, i).map_err(|e| e.to_string())?; diff --git a/wai/wai-rs/src/bin/wai_staged_vectors.rs b/wai/wai-rs/src/bin/wai_staged_vectors.rs index 9e76e5781..0a64918eb 100644 --- a/wai/wai-rs/src/bin/wai_staged_vectors.rs +++ b/wai/wai-rs/src/bin/wai_staged_vectors.rs @@ -931,7 +931,7 @@ fn cases(ctx: &Ctx) -> Vec { let a = small(59); let (l1, _) = l1_of(&a, 60, 4); let bad = edit(&l1, |w| w.manifest.model_requirement.capability = CAP_VIDEO_INT_MOTION.into()); - out.push(simple("capability_not_refinement", "refines on a wai.video.int_motion envelope: capability-not-refinement", a, vec![("L1.wai".into(), bad)], vec![base_at(0, 0), offer("L1.wai", 1)])); + out.push(simple("capability_not_refinement", "refines on a wai.video.int_motion envelope, offered to §4 as a layer by a caller (a sink routes it by its capability, as a base, and never offers it): capability-not-refinement", a, vec![("L1.wai".into(), bad)], vec![base_at(0, 0), offer("L1.wai", 1)])); } { let a = small(61); diff --git a/wai/wai-rs/tests/cli_stage.rs b/wai/wai-rs/tests/cli_stage.rs index d2d4d8892..ae14fb4ed 100644 --- a/wai/wai-rs/tests/cli_stage.rs +++ b/wai/wai-rs/tests/cli_stage.rs @@ -127,6 +127,33 @@ fn pack_then_explode_is_the_identity() { } } +/// `wai stage explode` gives no layer of a `WAI2` that does not conform (SPEC §7.1): not a +/// refinement placed before a selectable rendition, not a component of a refinement-only +/// capability that is not marked a refinement (with `refines` or without); a base of +/// such an envelope, and a layer of one that conforms, explode as before. +#[test] +fn explode_gives_no_layer_of_a_nonconforming_envelope() { + let refused = |path: &Path, i: usize, why: &str| { + let out = scratch("refused_layer.wai"); + let o = wai(&[os("stage"), os("explode"), path.as_os_str(), os(&i.to_string()), os("-o"), out.as_os_str()]); + assert!(!o.status.success() && text(&o).contains("no refinement is offered"), "{why}: {}", text(&o)); + assert!(!out.exists(), "{why}: nothing written"); + }; + refused(&corpus("wai2/refinement_before_selectable.wai"), 1, "a refinement before a selectable rendition"); + refused(&corpus("wai2/refinement_only_as_component.wai"), 1, "a refinement-only capability with no role and no refines"); + // The conforming envelope's refinement with its role taken away, its refines kept. + let mut w = wai::container::WaiMulti::from_bytes(&std::fs::read(corpus("wai2/ok_explode.wai")).unwrap()).unwrap(); + w.manifest.renditions[1].role = None; + let roleless = scratch("roleless_with_refines.wai"); + std::fs::write(&roleless, w.to_bytes().unwrap()).unwrap(); + refused(&roleless, 1, "a refinement-only capability with refines and no role"); + for (path, i) in [(corpus("wai2/refinement_before_selectable.wai"), 0), (corpus("wai2/ok_explode.wai"), 1)] { + let out = scratch("exploded_ok.wai"); + let o = wai(&[os("stage"), os("explode"), path.as_os_str(), os(&i.to_string()), os("-o"), out.as_os_str()]); + assert!(o.status.success() && out.exists(), "{} {i}: {}", path.display(), text(&o)); + } +} + /// `wai wrap` writes no `refines`, so it refuses a refinement capability and writes /// nothing. #[test] -- 2.54.0 (Apple Git-157) From ebe0b3dca314a67b03a966301c49a12b67a2be26 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 01:38:05 -0400 Subject: [PATCH 16/21] =?UTF-8?q?wai:=20the=20HTTP=20plan=20follows=20SPEC?= =?UTF-8?q?=20=C2=A77.1's=20offer=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit http-delivery §7 step 4: an envelope offers its refinements only when every component conforms, which the verified head's manifest decides. Where one does not, each refinement component of the picked entry is dropped (components_nonconforming) and never requested, one stating no sha256 dropped for that too (step 5); the base's path does not change. §10.3 and §13 say so, and the status block no longer states a limitation. http_binding: plan.rs gains WhyWhole::ComponentsNonconforming; session.rs gates the range path and the whole-object path alike, so the dropped report stays complete on both: digest-absent drops first, then the nonconforming ones. http_verify.py does the same with staged_verify.component_roles, which now holds the Python port of check_component_roles that claim_verify.py and http_verify.py both read (registry-based; wai-http.yml's paths add the registry). Corpus: object ONC (a base, a companion bound to nothing, a refinement with its sha256) and fetch_ONC_whole / fetch_ONC_ranged; fetch_ORN_* now report the refinement dropped for both reasons. Falsify: nonconforming-offered.patch and http_verify.py --mutate nonconforming-offered; whole-applies-no-digest.patch re-targeted at the moved digest-absent drop. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-http.yml | 7 +- wai/CHANGELOG.md | 7 +- wai/claim-conformance/claim_verify.py | 128 +-------------- wai/extensions/http-delivery.md | 16 +- wai/http-conformance/cases.json | 7 +- .../falsify/nonconforming-offered.patch | 15 ++ wai/http-conformance/falsify/run.sh | 2 +- .../falsify/whole-applies-no-digest.patch | 20 +-- wai/http-conformance/http_verify.py | 25 ++- wai/http-conformance/objects.json | 8 + ...f5e193e0796d61e870ccc7abf8af92334c98a2.wai | Bin 0 -> 32978 bytes ...3e0796d61e870ccc7abf8af92334c98a2.wai.etag | 1 + ...193e0796d61e870ccc7abf8af92334c98a2.wai.hp | Bin 0 -> 245 bytes wai/staged-conformance/staged_verify.py | 155 ++++++++++++++++++ wai/wai-rs/src/bin/wai_cli/http_vectors.rs | 28 +++- wai/wai-rs/src/http_binding/plan.rs | 6 +- wai/wai-rs/src/http_binding/session.rs | 34 +++- 17 files changed, 305 insertions(+), 154 deletions(-) create mode 100644 wai/http-conformance/falsify/nonconforming-offered.patch create mode 100644 wai/http-conformance/objects/2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2.wai create mode 100644 wai/http-conformance/objects/2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2.wai.etag create mode 100644 wai/http-conformance/objects/2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2.wai.hp diff --git a/.github/workflows/wai-http.yml b/.github/workflows/wai-http.yml index 45f658044..cdba2937a 100644 --- a/.github/workflows/wai-http.yml +++ b/.github/workflows/wai-http.yml @@ -9,7 +9,8 @@ name: WAI HTTP delivery # union, layers' place in it and their dispatch, the wai prefix's case, duplicate # capabilities, a record beside a fallback, the trailing-byte rule, the missing-digest # plan, the class merge, the base-only threshold, refused refinement responses, stale -# bytes after a mismatch, an unanswered base, the selection digest test; and on the +# bytes after a mismatch, an unanswered base, the selection digest test, the component +# conformance that withholds an envelope's refinements; and on the # playlist side adjacency, rendering, bandwidths, durations, the classical master, the # playlist receipt and its chain, listed cids, and the adaptation policies); it # is applied to a fresh worktree, the build must succeed, and `wai_http_vectors verify` @@ -57,6 +58,8 @@ on: # http_verify.py reads staged_verify.py (and through it int_payload_verify.py), and # the corpus carries the staged ladder's base and layers. - 'wai/staged-conformance/staged_verify.py' + # staged_verify.py's component rules (SPEC §7.1) read the capability registry. + - 'wai/registry/capabilities.json' - 'wai/staged-conformance/cases/audio_flac_rate_ladder/**' - 'wai/int-payload-conformance/int_payload_verify.py' - 'wai/registry/**' @@ -84,6 +87,8 @@ on: # http_verify.py reads staged_verify.py (and through it int_payload_verify.py), and # the corpus carries the staged ladder's base and layers. - 'wai/staged-conformance/staged_verify.py' + # staged_verify.py's component rules (SPEC §7.1) read the capability registry. + - 'wai/registry/capabilities.json' - 'wai/staged-conformance/cases/audio_flac_rate_ladder/**' - 'wai/int-payload-conformance/int_payload_verify.py' - 'wai/registry/**' diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 40765679b..3565a9398 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -103,9 +103,10 @@ wire format may change and such changes are recorded here. offers none of its refinements, and may still present the rendition it picked. `wai stage explode` follows it, refusing to explode a component of such an envelope that is of a refinement-only capability or marked a refinement; rule 5 matches it - for the whole envelope. A limitation of this revision, stated in http-delivery's - status: the HTTP binding's plan does not yet withhold refinements of a nonconforming - envelope. + for the whole envelope; and http-delivery §7 step 4 states it for a client planning + from a verified head: each refinement of a nonconforming envelope is dropped + (`components_nonconforming`), never requested, one stating no `sha256` dropped for that + too, on the range path and the whole-object path alike. - **An encrypted envelope's clear parts are checked** (§2.4.12). SPEC §6.4 encrypts payloads only: rules 4–9 now read an encrypted envelope's manifest and rendition table as any held envelope's — the rendition an entry names, its capability, the component diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index a775500d2..df78a2655 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -1013,131 +1013,11 @@ def encrypted_envelope(data): return False -VIDEO_OUTSIDE_NAMESPACE = {"wai.neural.video_bmshj2018", "wai.neural.dcvc_rt", "wai.neural.dcvc_fm", "wai.film.linear", "wai.film.reel"} -ENHANCEMENT = {"wai.video.lcevc": {"wai.video.avc", "wai.video.hevc", "wai.video.vvc", "wai.video.evc", "wai.video.evc.baseline", - "wai.video.vp9", "wai.video.av1", "wai.video.av1.lossless"}} - - -def known(cap): - """A capability the reference's component rules know (`codecs::is_known_capability`): - a registered payload, companion or refinement; a record or a derivation is not one.""" - c = REGISTRY.get(cap) - return c is not None and c["kind"] in ("payload", "companion", "refinement") - - -def video_class(cap): - return known(cap) and ((cap.startswith("wai.video.") and not companion_only(cap) and cap not in SV.UNIT_KIND) - or cap in VIDEO_OUTSIDE_NAMESPACE) - - -def companion_applies_to(companion, base): - if companion_only(base) or base in SV.UNIT_KIND: - return False - if companion in ("wai.meta.hdr10plus", "wai.meta.dovi"): - return not known(base) or video_class(base) - return base in ENHANCEMENT.get(companion, ()) - - def component_roles(rs): - """SPEC §5 / §7.1's component rules over a WAI2 table, in the order - `WaiMulti::check_component_roles` reads them: None where every component conforms, - else the first break's code. A sink offers the envelope's refinements only when it - conforms.""" - by_id = lambda x: next((j for j, y in enumerate(rs) if y.get("id") == x), None) # noqa: E731 - role = lambda e: e.get("role") # noqa: E731 - for i, m in enumerate(rs): - if m.get("id") is not None: - if not SV.is_component_id(m["id"]): - return "component-id-malformed" - if any(e.get("id") == m["id"] for e in rs[:i]): - return "duplicate-component-id" - - def refinement(i): - m = rs[i] - if m["capability"] not in SV.UNIT_KIND: - return "refinement-not-refinement-only" - if m.get("id") is None or m.get("sha256") is None: - return "refinement-identity-missing" - if m.get("refines") is None: - return "refines-malformed" - try: - ref = SV.parse_refines_ids(m["refines"]) - except SV.Malformed: - return "refines-malformed" - b = by_id(ref["base"]) - if b is None or not selectable(rs[b]): - return "refinement-base-missing" - if rs[b].get("sha256") is None: - return "refinement-identity-missing" - if rs[b]["capability"] not in SV.ADMIT.get(m["capability"], ()): - return "refinement-base-not-admitted" - for p, _ in ref["runs"]: - e = by_id(p) - if e is None or not (selectable(rs[e]) or (e < i and role(rs[e]) == "refinement")): - return "refinement-prev-missing" - if rs[e].get("sha256") is None: - return "refinement-identity-missing" - if any(selectable(rs[j]) for j in range(i + 1, len(rs))): - return "refinement-before-selectable" - return None - - def bound_base(i): - m = rs[i] - if m.get("companion_of_id") is not None: - return by_id(m["companion_of_id"]) - t = m.get("companion_of") - if t is None: - return None - hits = [j for j, b in enumerate(rs) if selectable(b) and b["capability"] == t] - return hits[0] if len(hits) == 1 else None - - for i, m in enumerate(rs): - cap = m["capability"] - # A record or a derivation names no payload format: no component in any role. - if REGISTRY.get(cap, {}).get("kind") in ("record", "derivation"): - return "record-or-derivation-as-component" - if role(m) == "refinement": - why = refinement(i) - if why: - return why - continue - if m.get("refines") is not None: - return "refines-on-non-refinement" - if cap in SV.UNIT_KIND: - return "refinement-only-as-component" - co = companion_only(cap) - if role(m) != "companion": - if co: - return "companion-only-as-rendition" - continue - if not co and cap in REGISTRY: # a payload: standalone media (a record or a derivation was refused above) - return "standalone-as-companion" - target = m.get("companion_of") - if target is None: - return "unbound-companion" - if co and not companion_applies_to(cap, target): - return "incompatible-base" - if m.get("companion_of_id") is not None: - b = by_id(m["companion_of_id"]) - if b is None: - return "companion-id-unresolved" - if rs[b]["capability"] != target: - return "companion-id-capability-mismatch" - if not selectable(rs[b]): - return "unbound-companion" - else: - n = sum(1 for e in rs if selectable(e) and e["capability"] == target) - if cap in ENHANCEMENT: - if n != 1: - return "enhancement-base-not-unique" - elif n == 0: - return "unbound-companion" - if cap in ENHANCEMENT: - bi = bound_base(i) - if any(role(rs[e]) == "companion" and rs[e]["capability"] in ENHANCEMENT and bound_base(e) is not None - and bound_base(e) == bi for e in range(i)): - return "duplicate-enhancement-layer" - return None + """SPEC §5 / §7.1's component rules over a WAI2 table (staged_verify.component_roles, + which http_verify.py reads too): None where every component conforms, else the first + break's code. A sink offers the envelope's refinements only when it conforms.""" + return SV.component_roles(rs) def check_session_envelopes(c, envs, objs, ps): diff --git a/wai/extensions/http-delivery.md b/wai/extensions/http-delivery.md index 1ef47167a..b3309e813 100644 --- a/wai/extensions/http-delivery.md +++ b/wai/extensions/http-delivery.md @@ -8,10 +8,8 @@ > is in `wai-rs`: `http_binding` (feature `http`) for §3–§7, the origin side of §5 > and §9, the playlists of §10.4 and §11 and the adaptation policies of Appendix F; > `wai_video_manifest` (feature `video_manifest`) for the playlist receipts of §8.6; -> and the `wai http` commands of the `wai` tool. A limitation of this revision: the -> HTTP binding's plan does not yet withhold refinements of a nonconforming envelope -> ([SPEC](../SPEC.md) §7.1, *Refinement components*). Keywords **MUST**, **MUST -> NOT**, **SHOULD**, **MAY** are RFC 2119 / RFC 8174. +> and the `wai http` commands of the `wai` tool. Keywords **MUST**, **MUST NOT**, +> **SHOULD**, **MAY** are RFC 2119 / RFC 8174. ## 1. Scope @@ -325,7 +323,11 @@ The procedure: the component-digest test to the bytes. A deployer policy MAY reorder and restrict the entries considered, as SPEC §7.1 allows. The result is the picked entry, the companions SPEC §7.1 binds to it, and the refinement components whose - `refines.base` is its `id`. + `refines.base` is its `id`. SPEC §7.1 offers an envelope's refinements only when every + one of its components conforms, which the verified head's manifest decides: where one + does not, each of those refinement components is dropped + (`components_nonconforming`) and never requested, one that states no `sha256` being + dropped for that too (step 5), and the base's path does not change. 5. If the picked entry, or a bound companion the sink will apply that is not a refinement (§2), states no `sha256`, go to step 7 (`component_digest_absent`). A refinement that states none is dropped: the client does not request it, and the @@ -597,7 +599,8 @@ or beside the base component's. A client that abandons an enhancement companion presents the base, as [SPEC](../SPEC.md) §7.1 lets a sink that does not apply a companion present the rendition; one that abandons a refinement component presents the stage it has ([staged-delivery](staged-delivery.md) §7). A refinement that states no -`sha256`, or does not match it, is dropped (§7 steps 5 and 6), and its base is +`sha256`, or does not match it, is dropped (§7 steps 5 and 6), as is every refinement +of an envelope whose components do not all conform (§7 step 4), and its base is unaffected. ### 10.4 Layer objects @@ -889,6 +892,7 @@ is a share of sessions, not of devices or people. | `head_proof_malformed`, `head_proof_mismatch` | §6.3 | | `http_status_unexpected`, `content_coding_present`, `content_range_mismatch`, `complete_length_mismatch` | §7.1 | | `component_digest_absent` | §7 step 5 (a reason to fetch whole, never a skip) | +| `components_nonconforming` | §7 step 4 (a refinement dropped, never a skip) | | `component_digest_mismatch` | §7 step 6 ([SPEC](../SPEC.md) §7.1's reason) | | `object_digest_mismatch` | §7 step 7, or any whole fetch | | `receipt_name_mismatch`, `receipt_not_about_object` | §8.1, §8.2, §8.6 | diff --git a/wai/http-conformance/cases.json b/wai/http-conformance/cases.json index 1765cf331..4be8e80b8 100644 --- a/wai/http-conformance/cases.json +++ b/wai/http-conformance/cases.json @@ -64,6 +64,7 @@ {"name":"head_proof_ok_OF","op":"head_proof","input":{"object":"OF"},"expect":{"covered_len":283,"n_cv":0,"envelope_len":283}}, {"name":"head_proof_ok_OH","op":"head_proof","input":{"object":"OH"},"expect":{"covered_len":6129,"n_cv":3,"envelope_len":23519}}, {"name":"head_proof_ok_ON","op":"head_proof","input":{"object":"ON"},"expect":{"covered_len":1009,"n_cv":6,"envelope_len":38384}}, +{"name":"head_proof_ok_ONC","op":"head_proof","input":{"object":"ONC"},"expect":{"covered_len":1009,"n_cv":6,"envelope_len":32978}}, {"name":"head_proof_ok_OPe","op":"head_proof","input":{"object":"OPe"},"expect":{"covered_len":264,"n_cv":0,"envelope_len":264}}, {"name":"head_proof_ok_OPf","op":"head_proof","input":{"object":"OPf"},"expect":{"covered_len":267,"n_cv":0,"envelope_len":267}}, {"name":"head_proof_ok_OPw","op":"head_proof","input":{"object":"OPw"},"expect":{"covered_len":421,"n_cv":0,"envelope_len":421}}, @@ -304,8 +305,10 @@ {"name":"fetch_OPw_listed_not_layer","op":"fetch","input":{"object":"OPw","listed_as_layer":true,"advertises":["wai.text.zstd"]},"expect":{"error":"not_a_layer"}}, {"name":"union_OPw","op":"union_floor","input":{"objects":["OPw"]},"expect":{"union":"wai1.text.zstd","floor":"wai1.text.zstd"}}, {"name":"fetch_OPw_declared","op":"fetch","input":{"object":"OPw","advertises":["wai.text.zstd"],"declared":"wai1.text.zstd"},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"single_component","body_bytes":474,"requests":2,"companions":[],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"591f780863bd571c1b868efabdf64a30ff0734b22582dad3f89486d0a97663c1"}}, -{"name":"fetch_ORN_whole","op":"fetch","input":{"object":"ORN","fragment":"#n=32659&h=1009","advertises":["wai.video.av1"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":32872,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"component_digest_absent"]],"skipped":[],"component_sha256":"7898322c774e80346b83405764069cbf1d06484da8824fab90e18e2ce0188f8c"}}, -{"name":"fetch_ORN_ranged","op":"fetch","input":{"object":"ORN","fragment":"#n=32659&h=1009","advertises":["wai.video.av1"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30572,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"component_digest_absent"]],"skipped":[],"component_sha256":"7898322c774e80346b83405764069cbf1d06484da8824fab90e18e2ce0188f8c"}}, +{"name":"fetch_ORN_whole","op":"fetch","input":{"object":"ORN","fragment":"#n=32659&h=1009","advertises":["wai.video.av1"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":32872,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"component_digest_absent"],[1,"components_nonconforming"]],"skipped":[],"component_sha256":"7898322c774e80346b83405764069cbf1d06484da8824fab90e18e2ce0188f8c"}}, +{"name":"fetch_ORN_ranged","op":"fetch","input":{"object":"ORN","fragment":"#n=32659&h=1009","advertises":["wai.video.av1"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30572,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"component_digest_absent"],[1,"components_nonconforming"]],"skipped":[],"component_sha256":"7898322c774e80346b83405764069cbf1d06484da8824fab90e18e2ce0188f8c"}}, +{"name":"fetch_ONC_whole","op":"fetch","input":{"object":"ONC","fragment":"#n=32978&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":33223,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[2,"components_nonconforming"]],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_ONC_ranged","op":"fetch","input":{"object":"ONC","fragment":"#n=32978&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30859,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[2,"components_nonconforming"]],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, {"name":"fetch_OS_threshold_stall","op":"fetch","input":{"advertises":["wai.video.avc"],"applies":["wai.video.lcevc"],"fragment":"#n=38460&h=1009","object":"OS","tamper":{"kind":"no_refinement"}},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":8705,"requests":4,"companions":[],"refinements":[],"abandoned":[1],"dropped":[],"skipped":[],"component_sha256":"e93f5c55dc5938a8cadd00477e4110d567d4a725b647a3cddf0c70c5e59dcd18"}}, {"name":"fetch_OS_threshold_stall_1001","op":"fetch","input":{"advertises":["wai.video.avc"],"applies":["wai.video.lcevc"],"fragment":"#n=38460&h=1009","object":"OS","tamper":{"kind":"no_refinement"},"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":8705,"requests":4,"companions":[],"refinements":[],"abandoned":[1],"dropped":[],"skipped":[],"component_sha256":"e93f5c55dc5938a8cadd00477e4110d567d4a725b647a3cddf0c70c5e59dcd18"}}, {"name":"fetch_OS_full","op":"fetch","input":{"advertises":["wai.video.avc"],"applies":["wai.video.lcevc"],"fragment":"#n=38460&h=1009","object":"OS"},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":38705,"requests":4,"companions":[1],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"e93f5c55dc5938a8cadd00477e4110d567d4a725b647a3cddf0c70c5e59dcd18"}}, diff --git a/wai/http-conformance/falsify/nonconforming-offered.patch b/wai/http-conformance/falsify/nonconforming-offered.patch new file mode 100644 index 000000000..bbb66a51b --- /dev/null +++ b/wai/http-conformance/falsify/nonconforming-offered.patch @@ -0,0 +1,15 @@ +# must fail: fetch_ONC_whole fetch_ONC_ranged fetch_ORN_whole fetch_ORN_ranged +# the plan offers the refinements of an envelope whose components do not all conform (session::nonconforming_refinements) +diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs +index 32c85293..2f462787 100644 +--- a/wai/wai-rs/src/http_binding/session.rs ++++ b/wai/wai-rs/src/http_binding/session.rs +@@ -201,7 +201,7 @@ impl Selector { + /// conform (SPEC §7.1, `ManifestV2::check_component_roles` over the head's manifest) does + /// not offer: every one of them where it does not conform, none where it does. + fn nonconforming_refinements(m: &ManifestV2, wanted: &[(usize, Class)]) -> Vec { +- if m.check_component_roles().is_ok() { ++ if true || m.check_component_roles().is_ok() { + return Vec::new(); + } + wanted.iter().map(|&(i, _)| i).filter(|&i| m.renditions.get(i).is_some_and(|e| e.is_refinement())).collect() diff --git a/wai/http-conformance/falsify/run.sh b/wai/http-conformance/falsify/run.sh index fd0b18100..754ceb709 100755 --- a/wai/http-conformance/falsify/run.sh +++ b/wai/http-conformance/falsify/run.sh @@ -53,7 +53,7 @@ for m in left-half no-root counter-zero floor-as-codecs blake3-iv base-at-done t unlabelled-escapes abr-unbounded gap-carries receipt-duplicates receipt-surrogates session-data-anywhere \ dash-r-expanded xml-attributes-scanned dash-timelines-unbounded budget-raises \ uri-unresolved gap-withdraws reanchor-backwards walk-exceeded-wedges walk-name-unchecked walk-verify-unchecked bindings-unbounded \ - file-numbers-unbounded; do + file-numbers-unbounded nonconforming-offered; do if python3 http_verify.py . --mutate "$m" > "$WORK/py-$m.log" 2>&1; then echo "::error::http_verify.py --mutate $m passed"; fail=1 else diff --git a/wai/http-conformance/falsify/whole-applies-no-digest.patch b/wai/http-conformance/falsify/whole-applies-no-digest.patch index 634639e54..b5da1d264 100644 --- a/wai/http-conformance/falsify/whole-applies-no-digest.patch +++ b/wai/http-conformance/falsify/whole-applies-no-digest.patch @@ -1,15 +1,15 @@ # must fail: fetch_ORN_whole -# the whole path applies a refinement that states no digest (session::FetchSession::advance_rest) +# the whole path drops a refinement that states no digest without its own reason (session::FetchSession::advance_rest) diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs -index 47a906ec..c65b2871 100644 +index 32c85293..bc971a72 100644 --- a/wai/wai-rs/src/http_binding/session.rs +++ b/wai/wai-rs/src/http_binding/session.rs -@@ -816,7 +816,7 @@ impl FetchSession { - for (i, class) in self.sel.applied(&w.manifest, index) { - // A refinement that states no digest is dropped on this path as on the - // range path (§7 step 5, §10.3). -- if class == Class::Refinement && w.manifest.renditions[i].sha256.is_none() { -+ if false && class == Class::Refinement && w.manifest.renditions[i].sha256.is_none() { - dropped.push((i, WhyWhole::DigestAbsent { index: i })); +@@ -871,7 +871,7 @@ impl FetchSession { + // §7 step 4: not offered from an envelope that does not conform; one stating + // no digest is dropped for that too, as on the range path. + if nonconforming.contains(&i) { +- if w.manifest.renditions[i].sha256.is_none() { ++ if false && w.manifest.renditions[i].sha256.is_none() { + dropped.push((i, WhyWhole::DigestAbsent { index: i })); + } continue; - } diff --git a/wai/http-conformance/http_verify.py b/wai/http-conformance/http_verify.py index 0ed418ed1..5447c5a0a 100644 --- a/wai/http-conformance/http_verify.py +++ b/wai/http-conformance/http_verify.py @@ -909,6 +909,14 @@ class Session: if cov < n and self.have(cov, n) is None: self.queue(("rest", (cov, n - 1), cl)) + def nonconforming(self, entries, wanted): + """§7 step 4: the refinement components among `wanted` of an envelope whose + components do not all conform (SPEC §7.1) — every one of them where it does not, + none where it does.""" + if SV.component_roles(entries) is None or MUTATE == "nonconforming-offered": + return [] + return [i for i, _ in wanted if entries[i].get("role") == "refinement"] + def applied(self, entries, pick): adv, applies = self.sink[0], self.sink[1] out = [(j, "refinement" if enhancement(entries[j]["capability"]) else "base") @@ -945,13 +953,15 @@ class Session: ordr = order(head) if callable(order) else (order if order is not None else list(range(len(entries)))) pick, skipped = select(head["manifest"], ordr, adv, held_sets, lambda i, e: True) wanted = [(pick, "base")] + self.applied(entries, pick) - pl = plan(head, wanted, [(a, b) for a, b, _ in self.held], self.permille) + nc = self.nonconforming(entries, wanted) + planned = [(i, c) for i, c in wanted if i not in nc or entries[i].get("sha256") is None] + pl = plan(head, planned, [(a, b) for a, b, _ in self.held], self.permille) if pl[0] == "rest": self.to_rest(pl[2], "base") else: for (a, b, cl) in pl[1]: self.queue(("range", (a, b), cl)) - self.dropped = pl[2] + self.dropped = pl[2] + [[i, "components_nonconforming"] for i in nc] gone = [i for i, _ in pl[2]] self.stage = ("components", pick, skipped, [(i, c) for i, c in wanted if i not in gone]) if self.stage[0] == "components": @@ -1040,7 +1050,15 @@ class Session: ordr = order(head) if callable(order) else (order if order is not None else list(range(len(entries)))) pick, skipped = select(m, ordr, adv, held_sets, lambda i, e: payload_ok(e, pay[i])) comps, refs, dropped = [], [], [] - for j, cl in self.applied(entries, pick): + applied = self.applied(entries, pick) + nc = self.nonconforming(entries, applied) + for j, cl in applied: + # §7 step 4: not offered from an envelope that does not conform; one stating no + # digest is dropped for that too, as on the range path. + if j in nc: + if entries[j].get("sha256") is None: + dropped.append([j, "component_digest_absent"]) + continue # A refinement stating no digest is dropped here as on the range path (§7 step 5). if cl == "refinement" and entries[j].get("sha256") is None: dropped.append([j, "component_digest_absent"]) @@ -1050,6 +1068,7 @@ class Session: dropped.append([j, "component_digest_mismatch"]) continue (comps if entries[j].get("role") == "companion" else refs).append(j) + dropped += [[j, "components_nonconforming"] for j in nc] self.finish(self.fetched("base", pick, pay[pick], comps, refs, [], dropped, skipped, "whole-object", why)) diff --git a/wai/http-conformance/objects.json b/wai/http-conformance/objects.json index da93febb9..8eb83cde5 100644 --- a/wai/http-conformance/objects.json +++ b/wai/http-conformance/objects.json @@ -223,6 +223,14 @@ "codecs": "wai2.video.av1+video.int_refine", "what": "WAI2: an AV1 base and a refinement stating no sha256" }, + "ONC": { + "cid": "2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2", + "path": "objects/2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2.wai", + "n": 32978, + "h": 1009, + "codecs": "wai2.video.int_hyper+video.int_refine", + "what": "WAI2: a base, a companion bound to nothing, and a refinement with its sha256" + }, "O11a": { "cid": "8f3a701e2f904ad90663466c2c12cafed3410eeb84ad41db82acdc8f9a10adf7", "path": "objects/8f3a701e2f904ad90663466c2c12cafed3410eeb84ad41db82acdc8f9a10adf7.wai", diff --git a/wai/http-conformance/objects/2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2.wai b/wai/http-conformance/objects/2c15a9ca86337508733305f81ef5e193e0796d61e870ccc7abf8af92334c98a2.wai new file mode 100644 index 0000000000000000000000000000000000000000..4efa9e6c9b0eab748ab67ffabae92d9e60f15752 GIT binary patch literal 32978 zcmeHQWq8wC7%szY!yN{}VT>eg(sbxxxZ8%qiEV+dD_yrS#&CCccXxMpcXx*kcQ)?n z;JNGvKkvW$_Idg==cGx#d?z{b$@_)`HsFK2Or|&{h8Ro$!})WJ9}}*r2BD>BL)9W^ z*>JcuhnrToG^gEAh+CtTF3q7DZX?1G$pmzWV-(^fvSByevGjlRWd11!`_n_agvB~F z7d@i8;ZW($)K!M3LZBHtWQ!vpn4)vbtuKRb7=i zqDnF^%NANxZHh!xQL(9tnK1Ewe-S2Ja})nC)y1(+dsO5fSyES}$P$)X7Rjp6%UdOt zwXwP=+7w;Yt!AFEnq=k$MHD%S{^+70%ABG}M6v3U&YH~%v1pt{;pw?t5q6EC&Qq zZ`w&LZOi~JKE9J5<0h_9jXoHTD7!sAt;zFYqkesB(rqW*{*lRKO6y&)RONs=%{%Bl zdJmm2d)dZ4$1mM|@zInuUkN{JttM?1N9>@nGZwGgdF1@9r|*(7i zkD9t*^|pg&u0MMHEq#u{Ww@&KT6PMH>@$4Q+!dSmoxF1Y)n~8l1xotcf||A0oN+_O z&sw@+_pyt2o`3k6C2#SHVqoJCIlSk-V>Maz5J9WTYjdJRJ&>sfI!2SjMAMBs7 z|HA$a`#=02@c+R71^*xXpYZ>}{|)~?;vW$If%q51{~-Pe@n494L;N4&9})kF_*caL zBK{fi--v%l{6F#^kpF@F7v%pS{|WhD$bUorAMziO|B3up^bou_Um{>)K= zuiaXU9y)FLj+3_%l6{JEwOXlBL#8g^ye)!RsHH^Oa<)H4IUE^cgvA@rJ#pu0MHi%3i3fC9r9S zu&4oJXD#1y@Z9YepVQ?mR#B?cvWq=-$i#W8cO1QRKk<8}yiDb)4T2SC{D`TG*6%ra z?eV*x*$S31*KE>0)ZKr~%w?MooW1q@Q`#IwD_DbCbnf1B@PxUmwja58FX3CpJSF_A z)Ndn4^d3HC;kw-?u0DF3oV7q{zDDDAdSt)RGnQ`Jf9B@1k6u1S%8Rv|cj^{1X#AX& z+YVp2`|4|k+{G&e)N4%~al6{*UGGj#}aGX?k__2HA?d2M0naLmW6_^*;POqin5fB*mh0002- z0{{R300006tiglKT`M1!8ET{kU_sW`o}6z`c~fLTWh;j^1CAAO|l(vy}3?{J+^QG7~f}PUdWDM)BE)E1|7zn}b0<@>jj?MjQw=e!`Uc{1y53R^TscOma$T+5M8s%uV v(wD%*^suM80`!xb6H(_oM#9Af4m9*f>KwoTxf*`3Sd+mrAINZy+{F{+@u+Zx literal 0 HcmV?d00001 diff --git a/wai/staged-conformance/staged_verify.py b/wai/staged-conformance/staged_verify.py index baf8c312b..921d71366 100644 --- a/wai/staged-conformance/staged_verify.py +++ b/wai/staged-conformance/staged_verify.py @@ -2163,5 +2163,160 @@ def main(d): return 1 if fails else 0 +# ------------------------------------------------- SPEC §5 / §7.1's component rules + +_REGISTRY = None + + +def _registry(): + """The capability registry (../registry/capabilities.json), by capability.""" + global _REGISTRY + if _REGISTRY is None: + with open(os.path.join(HERE, "..", "registry", "capabilities.json"), encoding="utf-8") as f: + _REGISTRY = {c["capability"]: c for c in json.load(f)["capabilities"]} + return _REGISTRY + + +def _reg_selectable(entry): + """SPEC §7.1: not a companion or a refinement, and a capability a sink may dispatch — + one the registry does not list, or a payload that is not a candidate.""" + if entry.get("role") in ("companion", "refinement"): + return False + c = _registry().get(entry["capability"]) + return c is None or (c["kind"] == "payload" and c["status"] != "candidate") + + +def _companion_only(cap): + c = _registry().get(cap) + return c is not None and c["kind"] == "companion" + + +_VIDEO_OUTSIDE_NAMESPACE = {"wai.neural.video_bmshj2018", "wai.neural.dcvc_rt", "wai.neural.dcvc_fm", "wai.film.linear", "wai.film.reel"} +_ENHANCEMENT = {"wai.video.lcevc": {"wai.video.avc", "wai.video.hevc", "wai.video.vvc", "wai.video.evc", "wai.video.evc.baseline", + "wai.video.vp9", "wai.video.av1", "wai.video.av1.lossless"}} + + +def _known(cap): + """A capability the reference's component rules know (`codecs::is_known_capability`): + a registered payload, companion or refinement; a record or a derivation is not one.""" + c = _registry().get(cap) + return c is not None and c["kind"] in ("payload", "companion", "refinement") + + +def _video_class(cap): + return _known(cap) and ((cap.startswith("wai.video.") and not _companion_only(cap) and cap not in UNIT_KIND) + or cap in _VIDEO_OUTSIDE_NAMESPACE) + + +def _companion_applies_to(companion, base): + if _companion_only(base) or base in UNIT_KIND: + return False + if companion in ("wai.meta.hdr10plus", "wai.meta.dovi"): + return not _known(base) or _video_class(base) + return base in _ENHANCEMENT.get(companion, ()) + + +def component_roles(rs): + """SPEC §5 / §7.1's component rules over a WAI2 table, in the order + `WaiMulti::check_component_roles` reads them: None where every component conforms, + else the first break's code. A sink offers the envelope's refinements only when it + conforms.""" + by_id = lambda x: next((j for j, y in enumerate(rs) if y.get("id") == x), None) # noqa: E731 + role = lambda e: e.get("role") # noqa: E731 + for i, m in enumerate(rs): + if m.get("id") is not None: + if not is_component_id(m["id"]): + return "component-id-malformed" + if any(e.get("id") == m["id"] for e in rs[:i]): + return "duplicate-component-id" + + def refinement(i): + m = rs[i] + if m["capability"] not in UNIT_KIND: + return "refinement-not-refinement-only" + if m.get("id") is None or m.get("sha256") is None: + return "refinement-identity-missing" + if m.get("refines") is None: + return "refines-malformed" + try: + ref = parse_refines_ids(m["refines"]) + except Malformed: + return "refines-malformed" + b = by_id(ref["base"]) + if b is None or not _reg_selectable(rs[b]): + return "refinement-base-missing" + if rs[b].get("sha256") is None: + return "refinement-identity-missing" + if rs[b]["capability"] not in ADMIT.get(m["capability"], ()): + return "refinement-base-not-admitted" + for p, _ in ref["runs"]: + e = by_id(p) + if e is None or not (_reg_selectable(rs[e]) or (e < i and role(rs[e]) == "refinement")): + return "refinement-prev-missing" + if rs[e].get("sha256") is None: + return "refinement-identity-missing" + if any(_reg_selectable(rs[j]) for j in range(i + 1, len(rs))): + return "refinement-before-selectable" + return None + + def bound_base(i): + m = rs[i] + if m.get("companion_of_id") is not None: + return by_id(m["companion_of_id"]) + t = m.get("companion_of") + if t is None: + return None + hits = [j for j, b in enumerate(rs) if _reg_selectable(b) and b["capability"] == t] + return hits[0] if len(hits) == 1 else None + + for i, m in enumerate(rs): + cap = m["capability"] + # A record or a derivation names no payload format: no component in any role. + if _registry().get(cap, {}).get("kind") in ("record", "derivation"): + return "record-or-derivation-as-component" + if role(m) == "refinement": + why = refinement(i) + if why: + return why + continue + if m.get("refines") is not None: + return "refines-on-non-refinement" + if cap in UNIT_KIND: + return "refinement-only-as-component" + co = _companion_only(cap) + if role(m) != "companion": + if co: + return "companion-only-as-rendition" + continue + if not co and cap in _registry(): # a payload: standalone media (a record or a derivation was refused above) + return "standalone-as-companion" + target = m.get("companion_of") + if target is None: + return "unbound-companion" + if co and not _companion_applies_to(cap, target): + return "incompatible-base" + if m.get("companion_of_id") is not None: + b = by_id(m["companion_of_id"]) + if b is None: + return "companion-id-unresolved" + if rs[b]["capability"] != target: + return "companion-id-capability-mismatch" + if not _reg_selectable(rs[b]): + return "unbound-companion" + else: + n = sum(1 for e in rs if _reg_selectable(e) and e["capability"] == target) + if cap in _ENHANCEMENT: + if n != 1: + return "enhancement-base-not-unique" + elif n == 0: + return "unbound-companion" + if cap in _ENHANCEMENT: + bi = bound_base(i) + if any(role(rs[e]) == "companion" and rs[e]["capability"] in _ENHANCEMENT and bound_base(e) is not None + and bound_base(e) == bi for e in range(i)): + return "duplicate-enhancement-layer" + return None + + if __name__ == "__main__": sys.exit(main(sys.argv[1] if len(sys.argv) > 1 else HERE)) diff --git a/wai/wai-rs/src/bin/wai_cli/http_vectors.rs b/wai/wai-rs/src/bin/wai_cli/http_vectors.rs index ad5b200b3..000c6713e 100644 --- a/wai/wai-rs/src/bin/wai_cli/http_vectors.rs +++ b/wai/wai-rs/src/bin/wai_cli/http_vectors.rs @@ -244,6 +244,17 @@ fn objects(dir: &Path) -> Result, &'static str)>, Str wai::container::ManifestV2::new("video", "replicate", vec![RenditionMeta::new("wai.video.av1", "av1").with_id("b").with_sha256(sha(&bn)), rnm]), vec![bn, rn], ).map_err(|e| e.to_string())?.to_bytes().map_err(|e| e.to_string())?; + // A refinement with its digest, beside a companion bound to nothing (SPEC §7.1, rule 2): + // the envelope does not conform, so its refinement is dropped on either path (§7 step 4). + let (bc, rc, hc) = (pattern(30_000, 11, 3), pattern(2300, 13, 1), pattern(64, 17, 1)); + let mut rcm = RenditionMeta::new("wai.video.int_refine", "wir1").with_role("refinement").with_id("r").with_sha256(sha(&rc)); + rcm.refines = Some(json!({ "base": "b", "prev": "b", "layer": 1 })); + let mut hcm = RenditionMeta::new("wai.meta.hdr10plus", "hdr10plus").with_role("companion").with_id("h").with_sha256(sha(&hc)); + hcm.companion_of = None; + let onc = WaiMulti::from_parts( + wai::container::ManifestV2::new("video", "replicate", vec![RenditionMeta::new("wai.video.int_hyper", "int_hyper").with_id("b").with_sha256(sha(&bc)), hcm, rcm]), + vec![bc, hc, rc], + ).map_err(|e| e.to_string())?.to_bytes().map_err(|e| e.to_string())?; Ok(vec![ ("O1", o1, "WAI1, pinned, below one chunk is not reached: the head proof covers it whole"), ("O2", o2, "WAI2 image: a pinned integer learned rendition, AVIF, JPEG XL and PNG of one picture"), @@ -273,6 +284,7 @@ fn objects(dir: &Path) -> Result, &'static str)>, Str ("OPe", with_refines(json!({}))?, "WAI1 text whose refines is {}: an ordinary object"), ("OPw", with_refines(json!({ "base": o5_cid, "prev": o5_cid, "layer": 1 }))?, "WAI1 text with a well-formed refines: an ordinary object"), ("ORN", orn, "WAI2: an AV1 base and a refinement stating no sha256"), + ("ONC", onc, "WAI2: a base, a companion bound to nothing, and a refinement with its sha256"), ]) } @@ -1037,6 +1049,12 @@ fn cases(objs: &BTreeMap>, extra: &mut BTreeMap> v.push(case(name, "fetch", json!({ "object": "ORN", "fragment": frag("ORN", Some(1009)), "advertises": ["wai.video.av1"], "applies": ["wai.video.int_refine"], "threshold_permille": permille }))); } + // A refinement of an envelope that does not conform is dropped whichever path fetches + // its base (§7 step 4). + for (name, permille) in [("fetch_ONC_whole", 900), ("fetch_ONC_ranged", 1001)] { + v.push(case(name, "fetch", json!({ "object": "ONC", "fragment": frag("ONC", Some(1009)), "advertises": ["wai.video.int_hyper"], + "applies": ["wai.video.int_refine"], "threshold_permille": permille }))); + } // Item 3: a refinement never moves its base. let os_frag = frag("OS", Some(1009)); let lcevc_sink = |extra: Value| -> Value { @@ -1270,10 +1288,18 @@ fn generate(dir: &Path) -> Result>, String> { } for (name, why) in [("fetch_ORN_whole", json!("range_threshold")), ("fetch_ORN_ranged", Value::Null)] { let f = outcome_of(name)?; - if f["dropped"] != json!([[1, "component_digest_absent"]]) || f["why_whole"] != why || f["refinements"] != json!([]) { + // ORN's refinement states no digest, and the envelope does not conform for it: it is + // dropped for both. + if f["dropped"] != json!([[1, "component_digest_absent"], [1, "components_nonconforming"]]) || f["why_whole"] != why || f["refinements"] != json!([]) { return Err(format!("{name} does not drop the refinement with no digest: {f}")); } } + for (name, why) in [("fetch_ONC_whole", json!("range_threshold")), ("fetch_ONC_ranged", Value::Null)] { + let f = outcome_of(name)?; + if f["dropped"] != json!([[2, "components_nonconforming"]]) || f["why_whole"] != why || f["refinements"] != json!([]) || f["pick"] != 0 { + return Err(format!("{name} does not drop the refinement of a nonconforming envelope: {f}")); + } + } for (k, b) in extra { if k.starts_with("cases/") { files.insert(k, b); diff --git a/wai/wai-rs/src/http_binding/plan.rs b/wai/wai-rs/src/http_binding/plan.rs index e0d149cfc..cb7592c37 100644 --- a/wai/wai-rs/src/http_binding/plan.rs +++ b/wai/wai-rs/src/http_binding/plan.rs @@ -61,11 +61,14 @@ pub enum WhyWhole { DigestMismatch { index: usize }, /// §7: the planned base ranges reach the policy's share of the rest. Threshold, + /// §7 step 4: a refinement of an envelope whose components do not all conform (SPEC + /// §7.1): dropped, never requested. + ComponentsNonconforming { index: usize }, } impl WhyWhole { /// `below_one_chunk`, `single_component`, `layer`, `component_digest_absent`, - /// `component_digest_mismatch` or `range_threshold`. + /// `component_digest_mismatch`, `range_threshold` or `components_nonconforming`. pub fn code(self) -> &'static str { match self { WhyWhole::BelowOneChunk => "below_one_chunk", @@ -74,6 +77,7 @@ impl WhyWhole { WhyWhole::DigestAbsent { .. } => "component_digest_absent", WhyWhole::DigestMismatch { .. } => "component_digest_mismatch", WhyWhole::Threshold => "range_threshold", + WhyWhole::ComponentsNonconforming { .. } => "components_nonconforming", } } } diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs index 10758f5be..32c852938 100644 --- a/wai/wai-rs/src/http_binding/session.rs +++ b/wai/wai-rs/src/http_binding/session.rs @@ -197,6 +197,16 @@ impl Selector { } } +/// The refinement components among `wanted` that an envelope whose components do not all +/// conform (SPEC §7.1, `ManifestV2::check_component_roles` over the head's manifest) does +/// not offer: every one of them where it does not conform, none where it does. +fn nonconforming_refinements(m: &ManifestV2, wanted: &[(usize, Class)]) -> Vec { + if m.check_component_roles().is_ok() { + return Vec::new(); + } + wanted.iter().map(|&(i, _)| i).filter(|&i| m.renditions.get(i).is_some_and(|e| e.is_refinement())).collect() +} + /// Whether `s` is one or more ASCII digits: the `1*DIGIT` of RFC 9110 §14.4. No sign, /// separator, space or other script's digit. fn digits(s: &str) -> Option { @@ -659,9 +669,18 @@ impl FetchSession { let (index, skipped) = self.sel.select(&head, &m, |_, _| true).map_err(RangeRefusal::Selection)?; let mut wanted = vec![(index, Class::Base)]; wanted.extend(self.sel.applied(&m, index)); + // §7 step 4: an envelope whose components do not all conform offers none of + // its refinements (SPEC §7.1); each is dropped, and one stating no digest is + // dropped for that too (step 5). + let nonconforming = nonconforming_refinements(&m, &wanted); let present: Vec = m.renditions.iter().map(|e| e.sha256.is_some()).collect(); let held: Vec = self.held.iter().map(|(r, _)| *r).collect(); - let plan: Plan = plan_components(&head, &wanted, &present, &held, &self.policy); + let planned: Vec<(usize, Class)> = + wanted.iter().copied().filter(|(i, _)| !nonconforming.contains(i) || !present[*i]).collect(); + let mut plan: Plan = plan_components(&head, &planned, &present, &held, &self.policy); + if plan.whole_rest.is_none() { + plan.dropped.extend(nonconforming.iter().map(|&i| (i, WhyWhole::ComponentsNonconforming { index: i }))); + } self.manifest = Some(m); match plan.whole_rest { Some((_, why)) => self.to_rest(&head, why, Class::Base), @@ -846,7 +865,17 @@ impl FetchSession { let digest_ok = |i: usize, e: &RenditionMeta| payloads.get(i).is_some_and(|p| e.payload_digest_matches(p)); let (index, skipped) = self.sel.select(&head, &w.manifest, digest_ok).map_err(RangeRefusal::Selection)?; let (mut companions, mut refinements, mut dropped) = (Vec::new(), Vec::new(), Vec::new()); - for (i, class) in self.sel.applied(&w.manifest, index) { + let applied = self.sel.applied(&w.manifest, index); + let nonconforming = nonconforming_refinements(&w.manifest, &applied); + for (i, class) in applied { + // §7 step 4: not offered from an envelope that does not conform; one stating + // no digest is dropped for that too, as on the range path. + if nonconforming.contains(&i) { + if w.manifest.renditions[i].sha256.is_none() { + dropped.push((i, WhyWhole::DigestAbsent { index: i })); + } + continue; + } // A refinement that states no digest is dropped on this path as on the // range path (§7 step 5, §10.3). if class == Class::Refinement && w.manifest.renditions[i].sha256.is_none() { @@ -866,6 +895,7 @@ impl FetchSession { refinements.push((i, w.renditions[i].clone())); } } + dropped.extend(nonconforming.iter().map(|&i| (i, WhyWhole::ComponentsNonconforming { index: i }))); base(index, w.renditions[index].clone(), companions, refinements, skipped, dropped, head, why) } }; -- 2.54.0 (Apple Git-157) From 969e18e8ad0cce34ef4049b8052095457d5fe63a Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 01:44:16 -0400 Subject: [PATCH 17/21] wai: the HTTP unit test expects a digest-less refinement dropped for both reasons Co-Authored-By: Claude Opus 5.5 --- wai/wai-rs/src/http_binding/tests.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/wai/wai-rs/src/http_binding/tests.rs b/wai/wai-rs/src/http_binding/tests.rs index 38b78a4a7..a6560cfe9 100644 --- a/wai/wai-rs/src/http_binding/tests.rs +++ b/wai/wai-rs/src/http_binding/tests.rs @@ -1116,7 +1116,9 @@ fn base_ready_before_refinements() { assert_eq!(s.done().unwrap().companions.len(), 1); } -/// N4: a refinement with no `sha256` is dropped on the whole path as on the range path. +/// N4: a refinement with no `sha256` is dropped on the whole path as on the range path — +/// for that (§7 step 5) and, since it leaves its envelope nonconforming (SPEC §7.1), for +/// that too (§7 step 4). #[test] fn refinement_without_digest_dropped_on_every_path() { let (b, r) = (pattern(20_000, 7, 3), pattern(2000, 5, 1)); @@ -1133,7 +1135,11 @@ fn refinement_without_digest_dropped_on_every_path() { sink(&["wai.video.int_motion"], &["wai.video.int_refine"], None)); let f = drive(&mut s, |w| served.answer(w)).unwrap(); assert_eq!(f.why_whole, why, "{permille}"); - assert_eq!(f.dropped.iter().map(|(i, w)| (*i, w.code())).collect::>(), vec![(1, "component_digest_absent")], "{permille}"); + assert_eq!( + f.dropped.iter().map(|(i, w)| (*i, w.code())).collect::>(), + vec![(1, "component_digest_absent"), (1, "components_nonconforming")], + "{permille}" + ); assert!(f.refinements.is_empty()); } } -- 2.54.0 (Apple Git-157) From d0b4108305419c5bfc5df2d15da52870ed4136bd Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 03:02:27 -0400 Subject: [PATCH 18/21] wai: the recorder derives the classical length; a malformed sha256 refused behind encryption - SessionRecorder states classical_declared from the WAI2 envelopes it holds, readable or encrypted, as rule 9 counts them (claim_receipt::session::classical_length, which rule 9 now calls); SessionRecorder::classical is removed. A page that receives a WAI2 it does not decode seals its session. counting/ gains wai2-classical.wai and its encrypted twin; verify_measure seals a session over each in wasm32 and checks the length against the table, and the native and Python verifiers agree. - Rule 4: of an encrypted envelope, a rendition's sha256 is still required absent or well formed (RenditionMeta::digest_well_formed, digest_well_formed in Python): a malformed one matches no payload. jwp-receipts rule 3 narrowed to whether a payload matches a well-formed sha256. Twelve vectors, by rendition and by exploded hash; the differential's encrypted family mutates the named rendition's sha256. - Stale docs: rule 3 and rule 9 in session.rs, the Python docstring, the received doc, the corpus comments. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 27 +- wai/claim-conformance/README.md | 12 +- wai/claim-conformance/claim_verify.py | 34 +- wai/claim-conformance/differential.py | 14 +- wai/claim-conformance/vectors.json | 674 ++++++++++++++++++ wai/extensions/jwp-receipts.md | 22 +- wai/staged-measure-conformance/README.md | 5 +- wai/staged-measure-conformance/counting.json | 12 + .../counting/wai2-classical-encrypted.wai | Bin 0 -> 1345 bytes .../counting/wai2-classical.wai | Bin 0 -> 1298 bytes wai/wai-rs/src/bin/wai_stage_measure.rs | 18 + wai/wai-rs/src/claim_receipt.rs | 2 +- .../src/claim_receipt/corpus/session.rs | 41 +- wai/wai-rs/src/claim_receipt/session.rs | 121 ++-- wai/wai-rs/src/container.rs | 9 + wai/wai-rs/src/session_recorder.rs | 106 ++- wai/wai-web/demo/verify_measure_wasm.mjs | 49 +- wai/wai-web/src/measure.rs | 45 +- 18 files changed, 1068 insertions(+), 123 deletions(-) create mode 100644 wai/staged-measure-conformance/counting/wai2-classical-encrypted.wai create mode 100644 wai/staged-measure-conformance/counting/wai2-classical.wai diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 03e90db74..672c4e253 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -53,12 +53,12 @@ wire format may change and such changes are recorded here. entry names it (`session_presented_mismatch`). With the envelopes, an object listed with a held envelope's content hash states that envelope's counted bytes, `null` exactly when it is not countable (`session_counted_mismatch`). -- **Inert envelopes are received, not refused.** An encrypted envelope, or bytes of - neither magic, is refused as unreadable only where a decoder entry names it - (`session_envelope_unreadable`); one no entry names is a received object, uncounted and - not presented, and a held one listed with counted bytes, even 0, is refused - (`session_counted_mismatch`). A page that receives such bytes lists them and seals its - session. +- **Envelopes no entry names are received, not refused.** Inert bytes — of neither + magic, or whose `security` member is not a security object — are refused as unreadable + only where a decoder entry names them (`session_envelope_unreadable`); those, and an + encrypted envelope, no entry names are a received object, uncounted and not presented, + and one listed with counted bytes, even 0, is refused (`session_counted_mismatch`). A + page that receives such bytes lists them and seals its session. - **The layers and units an envelope gives.** A decoder entry states `first_unit`, the unit at which its object's first unit is presented. With the outputs and the envelopes, each presentation through an entry whose envelope is held is at the layer @@ -111,8 +111,19 @@ wire format may change and such changes are recorded here. payloads only: rules 4–9 now read an encrypted envelope's manifest and rendition table as any held envelope's — the rendition an entry names, its capability, the component rules, a base's layer count, a companion-only capability, a fallback, and the classical - length its table declares — and leave to the signer only what needs a payload: its - digests, a base's units and a layer's `WIR1` payload. + length its table declares — and leave to the signer only what needs a payload: whether + a payload matches its `sha256`, a base's units and a layer's `WIR1` payload. A `sha256` + that is not 64 lowercase hex digits matches no payload, so an entry naming its rendition + is refused, encrypted or not (rule 4, `session_source_mismatch`). +- **The recorder states the classical length.** `SessionRecorder` derives + `classical_declared` at the tally from the `WAI2` envelopes it holds, readable or + encrypted, exactly as rule 9 counts them (`claim_receipt::session::classical_length`, + which rule 9 calls too); `SessionRecorder::classical`, which a sink called by hand and + the browser binding never could, is removed. A page that receives a `WAI2` it does not + decode now seals its session. `verify_measure` seals two such sessions in wasm32 — over + `counting/wai2-classical.wai`, whose second rendition is PNG, and its encrypted twin, + both new in the counting set — checks the length against the rendition table, and the + native and Python verifiers give the same verdicts. - **A record or a derivation is no component in any role** (SPEC §7.1, *Component identity*; `record-or-derivation-as-component`). - **A record or a derivation is no companion** (SPEC §7.1, rule 1). A companion's diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index cc8c6a5a6..05032b7f0 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -253,8 +253,11 @@ The vectors cover: of neither magic, each named by an entry (`session_envelope_unreadable`); an encrypted envelope named by one, checked against its manifest and rendition table in the clear, refused for a classical length unstated, a rendition out of its table, - another capability, no rendition, a base at two layers, a companion-only capability - and a nonconforming refinement; a held inert envelope listed with counted bytes 0 + another capability, no rendition, a base at two layers, a companion-only capability, + a nonconforming refinement and a rendition whose `sha256` is malformed (uppercase, 63 + digits, not hex) named by its rendition and by its exploded envelope's content hash, + and accepted with a well-formed `sha256` its payload does not match; a held inert + envelope listed with counted bytes 0 (`session_counted_mismatch`); entries a sink cannot have decoded through — a `WAI2` companion, a rendition or refinement whose payload does not match its `sha256`, a `WAI1` whose capability is companion-only, a fallback that is @@ -317,7 +320,7 @@ with neither is a hole; there is none. | SPEC §4 | a capability that is not dispatchable never taken; a `WAI1` whose capability is companion-only inert, its fallback never taken | rule 4 | `session_wai1_fallback_not_dispatchable`, `session_wai1_companion_only_capability` | | SPEC §4 step 5 | the fallback decodes the same payload | rule 8 reads the units in the payload's own format | `session_unit_fallback_past_the_title`, `session_unit_fallback_format_past_the_title`, `session_unit_fallback_format_audio`; accepted: `session_unit_fallback_accept`, `session_unit_fallback_format_accept` | | SPEC §3.1, §4 | a pin that does not resolve, a module not held, a key log's revocation | the signer's statement, which a decoder entry's `pin` and `tier` state | — | -| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3), its manifest and rendition table in the clear | rule 3 admits an entry naming it; rules 4–9 read its manifest and table as any held envelope's, and what needs a payload — its digests, a base's units, a layer's `WIR1` payload — is the signer's statement | `session_envelope_encrypted`, `session_envelope_encrypted_layer_accept`; refused: `session_envelope_encrypted_classical_unstated`, `session_envelope_encrypted_rendition_out_of_range`, `session_envelope_encrypted_relabelled`, `session_envelope_encrypted_no_rendition`, `session_envelope_encrypted_base_layers`, `session_envelope_encrypted_companion_only`, `session_envelope_encrypted_roles` | +| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3), its manifest and rendition table in the clear | rule 3 admits an entry naming it; rules 4–9 read its manifest and table as any held envelope's, a `sha256` that is not well formed included, and what needs a payload — whether a payload matches a well-formed `sha256`, a base's units, a layer's `WIR1` payload — is the signer's statement | `session_envelope_encrypted`, `session_envelope_encrypted_layer_accept`, `session_envelope_encrypted_sha256_unmatched_accept`; refused: `session_envelope_encrypted_sha256_uppercase`, `session_envelope_encrypted_sha256_63_digits`, `session_envelope_encrypted_sha256_not_hex` (each `_exploded` too), `session_envelope_encrypted_classical_unstated`, `session_envelope_encrypted_rendition_out_of_range`, `session_envelope_encrypted_relabelled`, `session_envelope_encrypted_no_rendition`, `session_envelope_encrypted_base_layers`, `session_envelope_encrypted_companion_only`, `session_envelope_encrypted_roles` | | SPEC §5 | a refinement-only capability is never a `capability` or `fallback` a sink dispatches, a selectable rendition or a companion | rules 4 and 5 | `session_layer_with_fallback`, `session_wai2_refines_on_a_rendition` | | SPEC §7.1, *Selection algorithm* | a companion, or a capability that is not dispatchable, is never picked | rule 4 | `session_wai2_entry_names_a_companion` | | SPEC §7.1, *Component identity* | `component_digest_mismatch`: a rendition whose payload does not match its `sha256` is skipped, a refinement is not offered | rule 4 | `session_wai2_rendition_digest_mismatch`, `session_wai2_refinement_digest_mismatch` | @@ -467,7 +470,8 @@ capability bound to the base, and beside an HDR10+ descriptor and an enhancement bound to a rendition of it (SPEC §7.1's component rules, which decide whether the envelope offers its refinements); and the model session with its `WAI2` envelope encrypted, its `security` well formed or not, the entry decoding it naming a rendition -in its table, out of it or none, its capability or another, and the classical length +in its table, out of it or none, its capability or another, the named rendition's +`sha256` kept, absent, well formed and unmatched, or malformed, and the classical length stated as the table gives it or not. Further session families: sessions that pass steps 1–5 against a `stage` claim whose first layer applied to some units and arrived late for others, presented at one to three layers, with objects that diff --git a/wai/claim-conformance/claim_verify.py b/wai/claim-conformance/claim_verify.py index 4984e43cc..138ffdf47 100644 --- a/wai/claim-conformance/claim_verify.py +++ b/wai/claim-conformance/claim_verify.py @@ -943,6 +943,15 @@ def digest_matches(e, payload): return h is None or (SV.is_hash(h) and hashlib.sha256(payload).hexdigest() == h) +def digest_well_formed(e): + """A rendition's sha256 absent or well formed (64 lowercase hex digits), read from the + entry alone: a malformed one matches no payload, so no sink decodes the rendition. Of an + encrypted envelope, whose payloads are not read, this is what an entry gives of its + digest (§2.4.12 rule 4).""" + h = e.get("sha256") + return h is None or SV.is_hash(h) + + def encrypted_envelope(data): """SPEC §6.4: an envelope a sink holding its key decrypts and dispatches — well formed, with a security object naming an encryption.""" @@ -973,11 +982,16 @@ def check_session_envelopes(c, envs, objs, ps): """§2.4.12 against the envelopes the session received: every WAI2 one, and any WAI1 one the verifier holds, with the objects and the presentations where those are held. In order: each among the objects received; each object listed with an envelope's - content hash states its counted bytes; each envelope a decoder entry names readable; - each entry naming what its envelope gives; each held layer an entry names one a sink - can apply; each held layer's entry at the first unit of an entry naming its base; each - presentation through a held entry at the layer count its envelope gives, and of a unit - it covers; then the classical length over the readable WAI2 envelopes.""" + content hash states its counted bytes; each envelope a decoder entry names held, + readable or encrypted; each entry naming what its envelope gives, of an encrypted one a + rendition whose sha256 is absent or well formed; each held layer an entry names one a + sink can apply; each held layer's entry at the first unit of an entry naming its base; + each presentation through a held entry at the layer count its envelope gives, and of a + unit it covers; then the classical length over the held WAI2 envelopes, readable or + encrypted, whose rendition tables are in the clear. Of an encrypted envelope the rules + read the manifest and the table, and nothing that needs a payload: whether a payload + matches a well-formed sha256, a base's units and a layer's WIR1 payload are the + signer's statement.""" b = c["body"] need(c["class"] == "reconstruct-session", 6, "context_mismatch") if objs is not None: @@ -986,7 +1000,7 @@ def check_session_envelopes(c, envs, objs, ps): for e in envs: h, n = SV.content_hash(e), counted_of(e) need(all(o["counted"] == n for o in objs if o["content_hash"] == h), 6, "session_counted_mismatch") - by_hash, inert, encrypted, readable, exploded = {}, set(), set(), [], [] + by_hash, inert, encrypted, held_envs, exploded = {}, set(), set(), [], [] for data in envs: got = read_any(data) if got is None: @@ -1005,7 +1019,7 @@ def check_session_envelopes(c, envs, objs, ps): each = [] exploded += [(SV.content_hash(x), h, j) for j, x in enumerate(each) if x is not None] by_hash.setdefault(h, r) - readable.append(r) + held_envs.append(r) need(not any(d["object"] in inert and d["object"] not in by_hash for d in b["decoders"]), 6, "session_envelope_unreadable") # An encrypted envelope's payloads are not read: its digests, its units and a layer's # WIR1 payload are its signer's statement. @@ -1030,7 +1044,8 @@ def check_session_envelopes(c, envs, objs, ps): if r is not None and r[0] == "multi": rs, i = r[1]["renditions"], d["rendition"] gives = (i is not None and i < len(rs) and rs[i]["capability"] == d["capability"] - and (selectable(rs[i]) or layer_entry(rs[i])) and (sealed(d["object"]) or digest_matches(rs[i], r[2][i]))) + and (selectable(rs[i]) or layer_entry(rs[i])) + and (digest_well_formed(rs[i]) if sealed(d["object"]) else digest_matches(rs[i], r[2][i]))) elif r is not None: mr = r[1]["model_requirement"] gives = (d["rendition"] is None and d["capability"] in (mr["capability"], mr.get("fallback")) @@ -1153,9 +1168,10 @@ def check_session_envelopes(c, envs, objs, ps): if covers is not None: f = ds[p["decoder"]]["first_unit"] + covers[0] need(f <= p["unit"] < f + covers[1], 6, "session_unit_outside_object") + # 9. The classical length, over the held WAI2 envelopes, readable or encrypted. decoded = {d["capability"] for d in b["decoders"]} total = None - for r in readable: + for r in held_envs: if r[0] != "multi": continue m = r[1] diff --git a/wai/claim-conformance/differential.py b/wai/claim-conformance/differential.py index d16ae49ab..09effb21f 100644 --- a/wai/claim-conformance/differential.py +++ b/wai/claim-conformance/differential.py @@ -1274,8 +1274,10 @@ def session_encrypted(ins, rng, n): """§2.4.12 against an encrypted envelope, whose manifest and rendition table are in the clear (SPEC §6.4): the model session with its WAI2 envelope encrypted — its security well formed or not — and the entry decoding it naming a rendition in the table, out - of it or none, its capability or another; the classical length stated as the table - gives it, or not; the plaintext envelope held beside it or not.""" + of it or none, its capability or another; the named rendition's sha256 kept, absent, + well formed and unmatched, or malformed (uppercase, 63 digits, not hex), which matches + no payload whether or not the envelope is encrypted; the classical length stated as + the table gives it, or not; the plaintext envelope held beside it or not.""" model = ins.by_name["session_envelope_encrypted"] base = json.loads(model["receipt"]) enc = bytes.fromhex(model["context"]["envelopes"][0]["envelope"]) @@ -1285,6 +1287,14 @@ def session_encrypted(ins, rng, n): for i in range(n): m = copy.deepcopy(m0) m["security"] = rng.choice([m0["security"], m0["security"], {"encryption": "mls-sframe", "kid": -1}, {"encryption": 5}, {"encryption": "none"}]) + r0 = m["renditions"][0] + good = r0.get("sha256") or hashlib.sha256(b"a payload").hexdigest() + form = rng.choice(["keep", "keep", "keep", "absent", "unmatched", "upper", "short", "not_hex"]) + if form == "absent": + r0.pop("sha256", None) + elif form != "keep": + r0["sha256"] = {"unmatched": hashlib.sha256(b"another payload").hexdigest(), "upper": good.upper(), + "short": good[:63], "not_hex": "z" * 64}[form] e = wai2_with(json.dumps(m, separators=(",", ":")), rest) body = copy.deepcopy(base["body"]) d = body["decoders"][1] diff --git a/wai/claim-conformance/vectors.json b/wai/claim-conformance/vectors.json index 8962cd9c5..23f5a1233 100644 --- a/wai/claim-conformance/vectors.json +++ b/wai/claim-conformance/vectors.json @@ -13535,6 +13535,680 @@ "reason": "session_layer_not_applicable" } }, + { + "name": "session_envelope_encrypted_sha256_uppercase", + "about": "an encrypted WAI2 whose rendition states its sha256 in uppercase hex, which matches no payload", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"1286d933686c99b16331e1c1c200b392ba2a53d1c31c4909ede5ab96206e0219\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":441,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"03d9f4ccf546e61f02f5783c9d9575c382ae64a72f8a004be392d9f0c88e4b7d2e2596b07af8605b52ac60ea3a10114e6e93a16481ceb0c225341b81afa6300f\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"1286d933686c99b16331e1c1c200b392ba2a53d1c31c4909ede5ab96206e0219\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "1286d933686c99b16331e1c1c200b392ba2a53d1c31c4909ede5ab96206e0219", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130433643394245394537363541303039343435324434424337413333343545323237453544353038364239423132424134453239333243314438227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_encrypted_sha256_uppercase_exploded", + "about": "an encrypted WAI2 whose rendition states its sha256 in uppercase hex, which matches no payload; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":815,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"45d887385d0526e79a3cd74787104a5573b126ccad48f7dc2192f356e9e4904a7dfaf323cbe16882f092f87fa983c720d8ae615e640b69df2f207d4c247c3806\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493", + "path": "primary", + "counted": null, + "transferred": 374, + "presented": true + }, + { + "content_hash": "1286d933686c99b16331e1c1c200b392ba2a53d1c31c4909ede5ab96206e0219", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130433643394245394537363541303039343435324434424337413333343545323237453544353038364239423132424134453239333243314438227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_encrypted_sha256_63_digits", + "about": "an encrypted WAI2 whose rendition's sha256 has 63 hex digits", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"82264edf5d265a821f2e1a59deb09b5ac29239874dd0a5f40ddcea640776085c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":440,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"0adc252cb8ca47e64aaf245c41cd08ffd753fa47aec725e068b8f716282dfe8498bf3488f90744d100f556729ecfd301aa3a4abbb5ff73390e3e6a6325e9f400\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"82264edf5d265a821f2e1a59deb09b5ac29239874dd0a5f40ddcea640776085c\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "82264edf5d265a821f2e1a59deb09b5ac29239874dd0a5f40ddcea640776085c", + "path": "primary", + "counted": null, + "transferred": 440, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932020100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a22343033333931306336633962653965373635613030393434353264346263376133333435653232376535643530383662396231326261346532393332633164227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_encrypted_sha256_63_digits_exploded", + "about": "an encrypted WAI2 whose rendition's sha256 has 63 hex digits; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":814,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"7bd1abf4a04f8ce43b39c950fe697be893b81f44c38783801d289cbbe313a315443e76165b0ebbd3fd791f935bf370c51bc68eb4e087bd0d2eca83f2db91930b\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493", + "path": "primary", + "counted": null, + "transferred": 374, + "presented": true + }, + { + "content_hash": "82264edf5d265a821f2e1a59deb09b5ac29239874dd0a5f40ddcea640776085c", + "path": "primary", + "counted": null, + "transferred": 440, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932020100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a22343033333931306336633962653965373635613030393434353264346263376133333435653232376535643530383662396231326261346532393332633164227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_encrypted_sha256_not_hex", + "about": "an encrypted WAI2 whose rendition's sha256 is 64 characters that are not hex digits", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"05bd3b207f18509ca61d242afa1ff7e9c43e18ae16a45a61d9e6fa275241c60d\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":441,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"fbd7ee1f008c361846dfc8570dece497347be9bdd35900916ddef09610087991e8c2546259e7c174982afb7eec26aa4b559d0f89da451db2677973bc40d02104\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"05bd3b207f18509ca61d242afa1ff7e9c43e18ae16a45a61d9e6fa275241c60d\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "05bd3b207f18509ca61d242afa1ff7e9c43e18ae16a45a61d9e6fa275241c60d", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a227a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_encrypted_sha256_not_hex_exploded", + "about": "an encrypted WAI2 whose rendition's sha256 is 64 characters that are not hex digits; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":815,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"45d887385d0526e79a3cd74787104a5573b126ccad48f7dc2192f356e9e4904a7dfaf323cbe16882f092f87fa983c720d8ae615e640b69df2f207d4c247c3806\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493", + "path": "primary", + "counted": null, + "transferred": 374, + "presented": true + }, + { + "content_hash": "05bd3b207f18509ca61d242afa1ff7e9c43e18ae16a45a61d9e6fa275241c60d", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a227a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_plaintext_sha256_uppercase", + "about": "the uppercase digest of a plaintext WAI2, which its payload matches but for case", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"47107627632064188c28daaebee8709022bddee6215a006356a4fd72f5d0a9e3\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":394,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"5777ff83d44683f48a9e56b1a924f3a65a845ede1546f1f52756b86db5c6ccf378e50f2dff061093153a65cf070e391890e10532cd9a1ade859e89dff750400e\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"47107627632064188c28daaebee8709022bddee6215a006356a4fd72f5d0a9e3\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "47107627632064188c28daaebee8709022bddee6215a006356a4fd72f5d0a9e3", + "path": "primary", + "counted": null, + "transferred": 394, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932d40000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130433643394245394537363541303039343435324434424337413333343545323237453544353038364239423132424134453239333243314438227d5d2c22746172676574223a6e756c6c7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_plaintext_sha256_uppercase_exploded", + "about": "the uppercase digest of a plaintext WAI2, which its payload matches but for case; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":327,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":721,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"88719d47056e493e1fb0303b02d47963d34455b25ec46b16dd1492e3336a6619f4534de38a9818f20189501078e9a4df7f3d2a242e6b0334384a9c74c1bdd208\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "0930ae6288148a6a5284cda0b17415134d0d7a76595eb69d8fb42259f5f62281", + "path": "primary", + "counted": 327, + "transferred": 327, + "presented": true + }, + { + "content_hash": "47107627632064188c28daaebee8709022bddee6215a006356a4fd72f5d0a9e3", + "path": "primary", + "counted": null, + "transferred": 394, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932d40000007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130433643394245394537363541303039343435324434424337413333343545323237453544353038364239423132424134453239333243314438227d5d2c22746172676574223a6e756c6c7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "reject", + "step": 6, + "reason": "session_source_mismatch" + } + }, + { + "name": "session_envelope_encrypted_sha256_unmatched_accept", + "about": "an encrypted WAI2 whose rendition states a well-formed sha256 its plaintext payload does not match: whether the payload a key decrypts matches it is the signer's statement", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"cab01b258e46a01e7de85a1f20d50a7b4a0cca42c589836e75cfe6e5f882f23c\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":441,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"6203fcf29d03b21e677f6c67b737db5a4d77362bcb1e43912827efe38b89a4a1fb9e7b2902ecd61036cc1f29d7e9fb979280758f8157a44ec7455348d7a2c602\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"cab01b258e46a01e7de85a1f20d50a7b4a0cca42c589836e75cfe6e5f882f23c\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "cab01b258e46a01e7de85a1f20d50a7b4a0cca42c589836e75cfe6e5f882f23c", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2237656631613766316535363266326336373065353838376533313061623831623937366165393764653133613433333633373635306562303238616563313761227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "442edc8282931aa69394e79bc068b32cddc4fe4b03e66382433556176a76af9c" + } + }, + { + "name": "session_envelope_encrypted_sha256_unmatched_accept_exploded", + "about": "an encrypted WAI2 whose rendition states a well-formed sha256 its plaintext payload does not match: whether the payload a key decrypts matches it is the signer's statement; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":815,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"45d887385d0526e79a3cd74787104a5573b126ccad48f7dc2192f356e9e4904a7dfaf323cbe16882f092f87fa983c720d8ae615e640b69df2f207d4c247c3806\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493", + "path": "primary", + "counted": null, + "transferred": 374, + "presented": true + }, + { + "content_hash": "cab01b258e46a01e7de85a1f20d50a7b4a0cca42c589836e75cfe6e5f882f23c", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2237656631613766316535363266326336373065353838376533313061623831623937366165393764653133613433333633373635306562303238616563313761227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "bda343715b5f8a9cf588fc1c4ca3b842b42e9155cc37c382d95263d33bdfcbf2" + } + }, + { + "name": "session_envelope_encrypted_sha256_matched_accept", + "about": "an encrypted WAI2 whose rendition states a well-formed sha256", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"aea0ff5ee7622f2f12450d1d963442c1cc1018c52be86174ab87fe89069f1f02\",\"path\":\"primary\",\"pin\":null,\"rendition\":0,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":441,\"uncounted\":1,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"aee8ab787583b15dad47ffb3e9c0172c8648583e66f5230b86a160700837e498e427215c0561f377b94998342548cd92b57b882bda40672c0d3d04b00cd70b06\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"aea0ff5ee7622f2f12450d1d963442c1cc1018c52be86174ab87fe89069f1f02\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "aea0ff5ee7622f2f12450d1d963442c1cc1018c52be86174ab87fe89069f1f02", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": true + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "5ce8fe4185accb435ebb2d7d2f13ace038c5c4cba90cdb06a87fc188d141e5ec" + } + }, + { + "name": "session_envelope_encrypted_sha256_matched_accept_exploded", + "about": "an encrypted WAI2 whose rendition states a well-formed sha256; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held", + "procedure": "claim", + "receipt": "{\"body\":{\"classical_declared\":null,\"classical_source\":null,\"counted_discarded\":0,\"counted_fallback\":0,\"counted_primary\":0,\"deadline_us\":null,\"decoders\":[{\"capability\":\"wai.video.int_hyper\",\"decoder\":\"builtin:wai@0.4.0\",\"first_unit\":0,\"leaves\":4,\"module_status\":null,\"object\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"path\":\"primary\",\"pin\":null,\"rendition\":null,\"tier\":null,\"variant\":null}],\"energy\":null,\"fallback_units\":0,\"framing\":\"registered\",\"host\":{\"build\":{\"profile\":\"release\",\"target\":\"aarch64-unknown-linux-gnu\",\"toolchain\":\"rustc 1.95.0\"},\"profile\":\"native-ffi\",\"target\":\"aarch64-unknown-linux-gnu\",\"threads\":4},\"leaf_count\":4,\"media\":\"video\",\"missed\":0,\"missed_units\":[],\"output_root\":\"277377502476a9453a35198a12431f36b362517535be3c53fbc150b63d11d386\",\"primary_units\":4,\"receipt_bytes\":0,\"session_nonce\":\"637b7c9735f0d1481af2833fd790a08493cec0a0ad912e0004f82e810c7fd8fd\",\"stage_sets\":[],\"switches\":[],\"switches_total\":0,\"transferred\":815,\"uncounted\":2,\"units\":4},\"class\":\"reconstruct-session\",\"issued_at\":\"2026-09-27T12:00:00Z\",\"kind\":\"claim\",\"parent_receipt_hash\":null,\"seq\":0,\"sig\":\"45d887385d0526e79a3cd74787104a5573b126ccad48f7dc2192f356e9e4904a7dfaf323cbe16882f092f87fa983c720d8ae615e640b69df2f207d4c247c3806\",\"signer_id\":\"did:example:sink\",\"signer_pubkey\":\"d759793bbc13a2819a827c76adb6fba8a49aee007f49f2d0992d99b825ad2c48\",\"subject\":\"3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493\",\"subject_type\":\"object\"}", + "context": { + "outputs": [ + { + "unit": 0, + "layers": 1, + "decoder": 0, + "out_digest": "55f7e628ca707e2ca3159709eeb68b9000813f2916a299acd33a23e6fe012584" + }, + { + "unit": 1, + "layers": 1, + "decoder": 0, + "out_digest": "a3ee8a4b96eceb663f3d94417957d02f897fc166dc96ebe9bf447c4a36a36264" + }, + { + "unit": 2, + "layers": 1, + "decoder": 0, + "out_digest": "00576d2c4d09ef5d7aa807f9b3b1587e200dea6f6694b4da062b41aa2a5ab8af" + }, + { + "unit": 3, + "layers": 1, + "decoder": 0, + "out_digest": "26cd9b2805b604b26e08d9a461db599c4e249bfd4df41a3befb202bc6d0e0700" + } + ], + "objects": [ + { + "content_hash": "3ce3705fc81bd0b3e9c9458209ad087bd913bfc19f0304fc9cdd7bbe492a4493", + "path": "primary", + "counted": null, + "transferred": 374, + "presented": true + }, + { + "content_hash": "aea0ff5ee7622f2f12450d1d963442c1cc1018c52be86174ab87fe89069f1f02", + "path": "primary", + "counted": null, + "transferred": 441, + "presented": false + } + ], + "envelopes": [ + { + "envelope": "57414932030100007b22776169223a22312e31222c226d65646961223a22766964656f222c22696e74656e74223a227265706c6963617465222c2272656e646974696f6e73223a5b7b226361706162696c697479223a227761692e766964656f2e696e745f6879706572222c226b696e64223a2263222c226964223a2262222c22736861323536223a2234303333393130633663396265396537363561303039343435326434626337613333343565323237653564353038366239623132626134653239333263316438227d5d2c22746172676574223a6e756c6c2c227365637572697479223a7b22656e6372797074696f6e223a226d6c732d736672616d65222c226b6964223a317d7d010000000000a40000005749563101010100040000001000000010000000100000000100000000000000030000000000000000800000000001000000000000000000000000000800000033333333333333335800000057494831010000000400000004000000040000000200000002000000020000000800000088ed3fe30c2b720028000000207259165ca81100a400842d62ce1516f300b254190111b4810047cdf7b87ea2235e87911bb87ecb" + } + ] + }, + "expected": { + "outcome": "accept", + "link_hash": "bda343715b5f8a9cf588fc1c4ca3b842b42e9155cc37c382d95263d33bdfcbf2" + } + }, { "name": "session_no_classical_accept", "about": "a session with no classical length, beside an envelope whose second rendition is WAI's own", diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index 686888f03..e289cf8ed 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -1135,14 +1135,17 @@ the others need the envelopes and the claim. In order: 3. Each envelope a decoder entry names is held, readable or encrypted (`session_envelope_unreadable`). The verifier holds no key: of an encrypted envelope, the rules below check everything its manifest and rendition table give, and nothing - that needs a payload — a rendition's `sha256` (rule 4), the units a base holds, a - layer's `WIR1` payload and the span read against its base's units (rules 5 and 8) — - which are the signer's statement. + that needs a payload — whether a payload matches a well-formed `sha256` (rule 4), the + units a base holds, a layer's `WIR1` payload and the span read against its base's units + (rules 5 and 8) — which are the signer's statement. 4. Each decoder entry whose `object` is a held envelope names what that envelope gives, as a sink dispatches it: of a `WAI2` envelope, a `rendition`, the capability that rendition has, a rendition selectable or a layer — never a companion, which is applied with the rendition a sink picks — whose payload matches its stated `sha256` - (SPEC §7.1, *Selection algorithm*, *Component identity*); of a `WAI1` envelope that + (SPEC §7.1, *Selection algorithm*, *Component identity*), and of an encrypted envelope + whose `sha256`, where stated, is well formed: 64 lowercase hex digits, the only form a + payload can match, so a rendition whose `sha256` is not (uppercase, another length, + not hex) is one no sink decodes, whatever its payload; of a `WAI1` envelope that is not a layer, no `rendition` and the manifest's `capability` or its `fallback`, a capability a sink dispatches, in a manifest whose `capability` is not companion-only (SPEC §4); of a `WAI1` layer, no `rendition` and its `capability`. And each decoder @@ -1252,8 +1255,8 @@ on the sink's limits; each unit's producer, conflict, geometry and deadline (ste of arrival the sink alone saw, while the `stage` claims bound the stages a unit reached and a re-decode its output; a pin's resolution at the sink, its module authorisation and its key log (SPEC §3.1, §4), which a decoder entry's `pin` and `tier` state; what an -encrypted envelope's payloads hold — their digests, the units a base holds and a layer's -`WIR1` payload (SPEC §6.4); whether a refinement's exploded envelope that the verifier +encrypted envelope's payloads hold — whether each matches its well-formed `sha256`, the +units a base holds and a layer's `WIR1` payload (SPEC §6.4); whether a refinement's exploded envelope that the verifier holds as bytes of their own was received on its own, a separate delivery that rule 5 reads as a `WAI1` layer and not through its envelope's component rules (staged-delivery §9); and a @@ -2485,8 +2488,11 @@ where the fallback's format and not the capability's is the payload's, and past (`session_unit_outside_object`); a held inert envelope listed with counted bytes 0 (`session_counted_mismatch`); an encrypted envelope an entry names, accepted with the classical length its table declares, and refused for that length unstated, a rendition its table does not hold, -another capability, no rendition, a base at two layers, a companion-only capability, and -a refinement before a selectable rendition, all read from the manifest in the clear; +another capability, no rendition, a base at two layers, a companion-only capability, a +refinement before a selectable rendition, and a rendition whose `sha256` is malformed +(uppercase, 63 digits, not hex), named by its rendition and by its exploded envelope's +content hash, all read from the manifest in the clear, and accepted with a well-formed +`sha256` its payload does not match; an encrypted layer over an encrypted base, accepted; entries naming a `WAI2` rendition by its exploded envelope's content hash, held as the `WAI2` alone — accepted, relabelled, past its frames, a refinement off its base's first unit and one whose envelope does not conform — and a diff --git a/wai/staged-measure-conformance/README.md b/wai/staged-measure-conformance/README.md index fec8525f4..ee75844aa 100644 --- a/wai/staged-measure-conformance/README.md +++ b/wai/staged-measure-conformance/README.md @@ -32,7 +32,10 @@ identity (Appendix D). Across the corpus: the record-wide deduplication totals ( capability (`no-format-check`); `WIH1` under a `wai.video.int_motion` fallback (`format_capability_mismatch`) and under a fallback WAI checks no format for (counted); a `WAI2` component with another payload's `sha256` (`sha256-mismatch`); an - encrypted payload; and bytes after an envelope (`trailing`). + encrypted payload; bytes after an envelope (`trailing`); and a `WAI2` whose second + rendition, PNG, is its classical rendition (`no-format-check`), with its encrypted twin + (`encrypted`), which a session receiving either states the classical length of + (jwp-receipts §2.4.12). - `refusals//title.json` — titles a tool must refuse, each with the code it states (`refused`): a base whose units pass the chain budget its title states (`chain-over-limit`, over the staged-delivery corpus's `base_over_budget` case); the diff --git a/wai/staged-measure-conformance/counting.json b/wai/staged-measure-conformance/counting.json index 546aee5aa..db2432557 100644 --- a/wai/staged-measure-conformance/counting.json +++ b/wai/staged-measure-conformance/counting.json @@ -105,6 +105,18 @@ "counted": null, "refused": "trailing", "component": null + }, + { + "file": "staged-measure-conformance/counting/wai2-classical.wai", + "counted": null, + "refused": "no-format-check", + "component": 1 + }, + { + "file": "staged-measure-conformance/counting/wai2-classical-encrypted.wai", + "counted": null, + "refused": "encrypted", + "component": null } ] } diff --git a/wai/staged-measure-conformance/counting/wai2-classical-encrypted.wai b/wai/staged-measure-conformance/counting/wai2-classical-encrypted.wai new file mode 100644 index 0000000000000000000000000000000000000000..e028e81f7dfc6d9c453e3bb29925a043f5086e25 GIT binary patch literal 1345 zcmZuwdu$X%82@%>XLojY_Fipipc2WM@X%6wcip=yf5=0O9727BM|lYB?QP42_B^jw zrD;n7QBY&l8dMVdk4g|9sRR)k1!@#2C@m7AKm|eYf}n^3k#MhZ4`2M@WWLPz{bs)3 zH}jjBh0`PcP7a{c`=k-~PVxF`eBNqrs}+kIb`)3TZ38JQ*%CL6bO}sZ ziC8=xe=O1FowB6UYZ^%-8gGfGJM48fSxv%fPZ=#WcJA_(9Z4%?r>u%6VkO#JpthBU zUk}<~Fcvm^^}3-OzCgH6_xtPpQC*LPY7IT4$9zrEXk8%WZ;FM3zPe~28ut65!BEiB zYwK&xfawc)yQ}|a6E{y#lT0-KSN*Tx-?}lQDPVK@!hXXFG?}LEH$tY*ikg-gsyCX9 zdQ%VitZ>X#^EkU2Py1hz3l%?xWS-w2^AIY=IK(EiKjFHp^^J-4vqJ zYbDH7N3tZ7ea6<7w#jWxDWkQd->SH+g|EAthf-_&+vXvFg^^i4`%XZ(#Y(IGF=G4A zT$*~0-j#xhwm&YlXw=fJZrBV@O^yy%jJgWj=Z)svJJ!PeL)ZJ)ym`m64Lw!;YrcB+ zp@#c4WsG8{XpvbnAF)SQ$w-O#rJj{R08|y3Iep%0j&q^QdBBcIWw(uYkI`?R zdR1`hoq@R%XFL#^HoLB&@!mNLrY(s*xF|Yz;p0oK#A36Xb64r0V5gRs3y!>;S9vi< z9c9IQ-tFXbh$;oS=qxA&ibPFT8FTO&r36b@EXNWMmxq%p%GDx=D@0^Zxt%WR^eAPx zk~l|89!%66sv0+zVj>EJDVj$sKD>PW#WROADk;22K}CThGA|*QEUJPmNmSJYs!?9y zB8}@61X(u{5ShKK6Wd@`ImG|~v+jjKYjuF<;+4IDj*SlVLZQZMz*7m;Jv*|lWf*&F=Yh>14EOaP-F0y2lcCf5hL3YyPro>|IZ2Bk^B_x*r=S8b0QqL$weKLG zQzR@nkb)GED!}J7I=J<1Npd+OBBC(qnH!8^F;%j20VS27vIGu5psY?RAGIOI{pf{LiEr>3#|b;fHl?-1qP z{X>ipH!TQ7Nh9T?P{=w7fgI0cL~`?Ym#u`AaNwon2+@$m;CL`RVb`+rI@O_chGyo3UcupZr9a6951J literal 0 HcmV?d00001 diff --git a/wai/staged-measure-conformance/counting/wai2-classical.wai b/wai/staged-measure-conformance/counting/wai2-classical.wai new file mode 100644 index 0000000000000000000000000000000000000000..a3c916c53621bf721a7ebae0cbc669712740b30c GIT binary patch literal 1298 zcmZuwYitx%6h1R|?#!K;JNs%&1C>bDgoi@y?sj&!{E&w=un6@L9_1l0vokFl%UYL3 zXKBl^{Z+K#d|TN{fUjP(cvfASj|hB<$-ti!Xk7bHChkzI)Dh z?mfA8!L(R#HV4q|f6_?!C;J1{0sln*O4~{pj+aXgw^?c^?7(bj6GoRmisNvkA#3$<#6 z5!AyD8MdNEpiVb*BM^$#>cL=L(A0G+Qe)^5-3m0BW^E`EY_g)^K&=@vqrrd~j)ZN! zrmiL)iU%V8wG;p65I1j7-I{FvulirkzjZC6DdcDdqCvwBHO1q4(1^qXwi&nMkvgNv zsEg~7fE~4hb(W=vo5E&1s#`VT+M19RGDC5v?jsZZX(QEaI}J*%ZfRM|LuoYrjkyS5 zL2PEgX)*}6pcM5Fh+{u{E_L$Vd5lgmtVGBGp$sDQ}aTRvV9m#oju7eqa z*LyqPykqIcuBzV7ubzFdVTPuRQk)bmHnaX=XZ4goO2RL7tq234s#yKBxobGigD&R* zyC#&~Hr6{zzkNb*^tfqN;VE~9=8T_ye`M;c+J?q^XV0Iy*m_{0IcLG+OYG#L_*%|e zrGtXqT3#-=@^W6~#T<2&74vzoo6jMt6y&12pcE()HCbiM#cPxjEMc)6OF%q6POd0d ziyW>Hk+bD>d#Kx|l;KL^9x3@SQFEwj%xH>vM?uWFF^Qb@`{|c=9NW})w)L++kN zbI$w@FTofS>?+*A6$tVbSS$)aWa#U8LlFMJIiIZLh)8b;gr|9`jdBZ=^0FIil~l`m z+#>S;t^|TXHR~;xsIn_oYLG%iy-qL zOOU6a0x$si=G?viAfHntEVz(@6p<>x=QP^C?QKdy^gx!D9-atL4uAprK0j8Dh(sU%1NP+brS+Pp2vt1q5*Vo{j_`M-gkB#+WOhh zNBt-EeQ{#%;p2x6pX)#J%TVU`!Jl&9{`lK>zq0d}Smrvr%Gi-L*^~3qW1n|^3&ieg KsPCD+eEpy0fQPdH literal 0 HcmV?d00001 diff --git a/wai/wai-rs/src/bin/wai_stage_measure.rs b/wai/wai-rs/src/bin/wai_stage_measure.rs index c6bee0c59..c26d78025 100644 --- a/wai/wai-rs/src/bin/wai_stage_measure.rs +++ b/wai/wai-rs/src/bin/wai_stage_measure.rs @@ -446,6 +446,22 @@ fn counting_cases(c: &Corpus) -> Result>)>, String> enc.security = Some(Security::new("aes-256-gcm", 1)); let mut trailing = one(hyper, None, wih1.clone()); trailing.push(0); + // A WAI2 whose second rendition, PNG, is its classical rendition (jwp-receipts §2.4.12), + // its payloads plaintext or encrypted: the rendition table, in the clear either way, + // declares the classical length a session receiving it states. + let png = Wai::from_bytes(&std::fs::read(c.wai.join("staged-conformance/cases/image_png_up2/base.wai")).map_err(|e| e.to_string())?) + .map_err(|e| e.to_string())? + .payload; + let classical = |encrypted: bool| -> Result, String> { + let mut w = WaiMulti::new("image", "replicate", Value::Null, vec![ + Rendition::media(hyper, "int_hyper", wih1.clone()).with_payload_digest(), + Rendition::media(wai::codecs::CAP_IMAGE_PNG, "png", png.clone()).with_payload_digest(), + ]); + if encrypted { + w.manifest.extra.insert("security".into(), json!({ "encryption": "mls-sframe", "kid": 1 })); + } + w.to_bytes().map_err(|e| e.to_string()) + }; Ok(vec![ ("wih1".into(), Some(one(hyper, None, wih1.clone()))), ("staged-measure-conformance/fixtures/still/L01.wai".into(), None), @@ -461,6 +477,8 @@ fn counting_cases(c: &Corpus) -> Result>)>, String> ("wai2-sha256-mismatch".into(), Some(wai2(false)?)), ("encrypted".into(), Some(Wai::new(enc, wih1.clone()).to_bytes().map_err(|e| e.to_string())?)), ("trailing".into(), Some(trailing)), + ("wai2-classical".into(), Some(classical(false)?)), + ("wai2-classical-encrypted".into(), Some(classical(true)?)), ]) } diff --git a/wai/wai-rs/src/claim_receipt.rs b/wai/wai-rs/src/claim_receipt.rs index 615c5edfe..09744d940 100644 --- a/wai/wai-rs/src/claim_receipt.rs +++ b/wai/wai-rs/src/claim_receipt.rs @@ -3469,7 +3469,7 @@ pub(crate) fn rfc3339(s: &str) -> bool { /// fails instead of passing on nothing. (A function rather than a public constant so /// cbindgen does not export it into the C header.) pub fn corpus_vector_count() -> usize { - 555 + 567 } /// The conformance corpus (`claim-conformance/vectors.json`), regenerated. Ed25519 diff --git a/wai/wai-rs/src/claim_receipt/corpus/session.rs b/wai/wai-rs/src/claim_receipt/corpus/session.rs index 1e63174fe..e68a02ab0 100644 --- a/wai/wai-rs/src/claim_receipt/corpus/session.rs +++ b/wai/wai-rs/src/claim_receipt/corpus/session.rs @@ -86,7 +86,8 @@ fn classical_envelope() -> Vec { wai2("video", "wai.video.avc") } -/// The same envelope with a `security` member that encrypts it: inert (SPEC §6.4). +/// The same envelope with a `security` member that encrypts it (SPEC §6.4): held, its +/// manifest and rendition table read in the clear, its payloads not at all. fn encrypted_envelope() -> Vec { let mut w = WaiMulti::from_bytes(&classical_envelope()).expect("a WAI2 envelope"); w.manifest.extra.insert("security".into(), json!({ "encryption": "mls-sframe", "kid": 1 })); @@ -1052,8 +1053,8 @@ pub(super) fn vectors() -> Vec { vec![neither, unreadable_wai1, classical_envelope()], Ok(()), )); - // An encrypted envelope received and named by no entry: inert, listed uncounted and not - // presented, and held. + // An encrypted envelope received and named by no entry: listed uncounted and not + // presented, and held, its rendition table read for the classical length. let encrypted = encrypted_envelope(); let mut with_encrypted = objects.clone(); with_encrypted.push(ObjectSeen { content_hash: object_content_hash(&encrypted), path: SessionPath::Primary, counted: None, transferred: encrypted.len() as u64, presented: false }); @@ -1069,8 +1070,8 @@ pub(super) fn vectors() -> Vec { &[base_envelope(), classical_envelope(), encrypted], &[&stage], )); - // The same envelope listed with counted bytes 0: an inert envelope is not countable, so - // its `counted` is null and nothing else. + // The same envelope listed with counted bytes 0: an encrypted envelope is not countable, + // so its `counted` is null and nothing else. let mut counted_zero = with_encrypted.clone(); if let Some(o) = counted_zero.last_mut() { o.counted = Some(0); @@ -2654,6 +2655,36 @@ fn resolve_vectors() -> Vec { and(four(0), &[pres(4, 2, 1)]), Some(Reason::SessionLayerNotApplicable), )); + + // A malformed `sha256` — not 64 lowercase hex digits — matches no payload (SPEC §7.1), + // so no sink decodes that rendition, whatever its payload: a fact of the manifest, in + // the clear of an encrypted envelope too. Whether a payload matches a well-formed one + // is the signer's statement there. Each named by its rendition and by its exploded + // envelope's content hash. + let encrypt = |e: &[u8]| { + let mut w = WaiMulti::from_bytes(e).expect("a WAI2 envelope"); + w.manifest.extra.insert("security".into(), json!({ "encryption": "mls-sframe", "kid": 1 })); + w.to_bytes().expect("a WAI2 envelope") + }; + let good = crate::pin::sha256_hex(&wiv1(4)); + let with_digest = |digest: &str| wai2_of(vec![component_of(HYPER, "b", None, None, wiv1(4), Some(digest))]); + let unmatched = crate::pin::sha256_hex(b"another payload"); + for (tag, digest, encrypted, reason, about) in [ + ("encrypted_sha256_uppercase", good.to_uppercase(), true, Some(Reason::SessionSourceMismatch), "an encrypted WAI2 whose rendition states its sha256 in uppercase hex, which matches no payload"), + ("encrypted_sha256_63_digits", good[..63].to_owned(), true, Some(Reason::SessionSourceMismatch), "an encrypted WAI2 whose rendition's sha256 has 63 hex digits"), + ("encrypted_sha256_not_hex", "z".repeat(64), true, Some(Reason::SessionSourceMismatch), "an encrypted WAI2 whose rendition's sha256 is 64 characters that are not hex digits"), + ("plaintext_sha256_uppercase", good.to_uppercase(), false, Some(Reason::SessionSourceMismatch), "the uppercase digest of a plaintext WAI2, which its payload matches but for case"), + ("encrypted_sha256_unmatched_accept", unmatched.clone(), true, None, "an encrypted WAI2 whose rendition states a well-formed sha256 its plaintext payload does not match: whether the payload a key decrypts matches it is the signer's statement"), + ("encrypted_sha256_matched_accept", good.clone(), true, None, "an encrypted WAI2 whose rendition states a well-formed sha256"), + ] { + let w = if encrypted { encrypt(&with_digest(&digest)) } else { with_digest(&digest) }; + let x = WaiMulti::explode(&w, 0).expect("the rendition's exploded envelope"); + let by_rendition = leak(format!("session_envelope_{tag}")); + let by_hash = leak(format!("session_envelope_{tag}_exploded")); + v.push(vector(by_rendition, about, vec![w.clone()], vec![w.clone()], vec![dec(HYPER, Some(0), &w, 0)], four(0), reason)); + let about_x = leak(format!("{about}; the entry names the rendition by its exploded envelope's content hash, with only the WAI2 held")); + v.push(vector(by_hash, about_x, vec![w.clone()], vec![x.clone(), w.clone()], vec![dec(HYPER, None, &x, 0)], four(0), reason)); + } v } diff --git a/wai/wai-rs/src/claim_receipt/session.rs b/wai/wai-rs/src/claim_receipt/session.rs index f146bd415..35ba1f53d 100644 --- a/wai/wai-rs/src/claim_receipt/session.rs +++ b/wai/wai-rs/src/claim_receipt/session.rs @@ -749,6 +749,57 @@ pub fn classical_rendition(w: &crate::container::WaiMulti) -> Option { }) } +/// An envelope a verifier holding the `envelopes` context holds (§2.4.12). +enum HeldEnvelope { + One(crate::container::Wai), + Multi(crate::container::WaiMulti), +} + +/// `bytes` as a held envelope (§2.4.12): one that reads as a `WAI1` or `WAI2` envelope +/// whose payloads are plaintext, or encrypted — well formed, its `security` a security +/// object naming an encryption, which a sink holding the key decrypts and dispatches (SPEC +/// §6.4 step 3). An encrypted envelope's manifest and rendition table are in the clear +/// (§6.1): the rules read them, and nothing that needs a payload. `true` for encrypted; +/// `None` for inert bytes. +fn read_held(bytes: &[u8]) -> Option<(HeldEnvelope, bool)> { + use crate::container::{Wai, WaiMulti}; + match bytes.get(..4) { + Some(b"WAI2") => { + let w = WaiMulti::from_bytes(bytes).ok()?; + match crate::container::manifest_v2_security(&w.manifest) { + Ok(s) => Some((HeldEnvelope::Multi(w), s.as_ref().is_some_and(|x| !x.is_plaintext()))), + Err(_) => None, + } + } + Some(b"WAI1") => { + let w = Wai::from_bytes(bytes).ok()?; + let sealed = w.manifest.security.as_ref().is_some_and(|x| !x.is_plaintext()); + Some((HeldEnvelope::One(w), sealed)) + } + _ => None, + } +} + +/// The classical length §2.4.12 rule 9 reads from `envelopes`: the sum, over the held +/// `WAI2` envelopes among them — readable or encrypted, since the rendition table +/// declares it in the clear — of the length of each one's classical rendition +/// ([`classical_rendition`]) whose capability no entry of `decoders` decoded. `None` +/// where there is none. [`ClaimReceipt::check_session_envelopes`] requires it of +/// `classical_declared`, and a [`crate::session_recorder::SessionRecorder`] states it so, +/// from the envelopes it holds. +pub fn classical_length(envelopes: &[&[u8]], decoders: &[DecoderEntry]) -> Option { + let mut sum: Option = None; + for bytes in envelopes { + let Some((HeldEnvelope::Multi(w), _)) = read_held(bytes) else { continue }; + if let Some(i) = classical_rendition(&w) + && !decoders.iter().any(|d| d.capability == w.manifest.renditions[i].capability) + { + *sum.get_or_insert(0) += w.renditions[i].len() as u128; + } + } + sum +} + /// Whether a re-decode of a presentation through this capability is checked against its /// digest: its replicate class makes it byte-exact (`neural-int-exact`, /// `standard-defined`). @@ -945,17 +996,23 @@ impl ClaimReceipt { /// 2. with the objects, every object listed with an envelope's content hash states that /// envelope's counted bytes (staged-measurement §3), and `null` exactly when it is not /// countable (`session_counted_mismatch`); - /// 3. each envelope a decoder entry names reads as a `WAI1` or `WAI2` envelope (SPEC §2, - /// §7.1) whose payloads are plaintext, or is encrypted — a sink holding its key - /// decrypts and dispatches it (SPEC §6.4 step 3), and the rules below read nothing of - /// it, as of an envelope not held (`session_envelope_unreadable`); one no entry names - /// may be inert — encrypted, or not an envelope at all — and is then a received object - /// that is neither counted nor presented. An entry naming a held `WAI2` rendition by + /// 3. each envelope a decoder entry names is held: it reads as a `WAI1` or `WAI2` + /// envelope (SPEC §2, §7.1) whose payloads are plaintext, or is encrypted — a sink + /// holding its key decrypts and dispatches it (SPEC §6.4 step 3) + /// (`session_envelope_unreadable`). The rules below read every held envelope's + /// manifest and rendition table, an encrypted one's in the clear, and of an encrypted + /// one nothing that needs a payload: whether a payload matches a well-formed `sha256`, + /// a base's units and a layer's `WIR1` payload are the signer's statement. An + /// encrypted envelope no entry names is a received object neither counted nor + /// presented, as are inert bytes — a `security` member that is not a security object, + /// or bytes that are not an envelope at all. An entry naming a held `WAI2` rendition by /// its exploded envelope's content hash, with no rendition, is read from here on as /// naming that rendition, unless the exploded envelope's own bytes are held; /// 4. each decoder entry whose object is one of them names what it gives, as a sink /// dispatches it — a rendition of a `WAI2` envelope and that rendition's capability, - /// a rendition selectable or a layer, whose payload matches its stated `sha256` + /// a rendition selectable or a layer, whose payload matches its stated `sha256`, and + /// of an encrypted envelope whose `sha256` is absent or well formed, since a malformed + /// one matches no payload ([`crate::container::RenditionMeta::digest_well_formed`]) /// (SPEC §7.1, *Selection algorithm*); or no rendition and a `WAI1` envelope's /// capability or fallback, dispatchable, of a manifest whose capability is not /// companion-only (SPEC §4), where the envelope is not a layer — and each entry @@ -987,10 +1044,11 @@ impl ClaimReceipt { /// or 0 and its base's units with no span; a payload whose units WAI does not read, /// or a base not held, leaves the presentation unchecked /// (`session_unit_outside_object`); - /// 9. the lengths of the readable `WAI2` envelopes' classical renditions - /// ([`classical_rendition`]) whose capability no decoder entry decoded sum to + /// 9. the lengths of the held `WAI2` envelopes' classical renditions + /// ([`classical_rendition`]) whose capability no decoder entry decoded — readable or + /// encrypted, since the rendition table declares them in the clear — sum to /// `classical_declared`, which is `null` exactly when there is none - /// (`session_classical_mismatch`). + /// (`session_classical_mismatch`, [`classical_length`]). pub fn check_session_envelopes(&self, envelopes: &[&[u8]], objects: Option<&[ObjectSeen]>, outputs: Option<&[Presentation]>) -> Result<(), Rejection> { use crate::container::{RefForm, Refines, Wai, WaiMulti}; let s = self.session()?; @@ -1010,32 +1068,8 @@ impl ClaimReceipt { } } } - enum Read { - One(Wai), - Multi(WaiMulti), - } - // A held envelope: one that reads as a WAI1 or WAI2 envelope whose payloads are - // plaintext, or encrypted — well formed, its `security` a security object naming an - // encryption, which a sink holding the key decrypts and dispatches (SPEC §6.4 step - // 3). An encrypted envelope's manifest and rendition table are in the clear (§6.1): - // the rules below read them, and nothing that needs a payload. `true` for encrypted. - let read_one = |bytes: &[u8]| -> Option<(Read, bool)> { - match bytes.get(..4) { - Some(b"WAI2") => { - let w = WaiMulti::from_bytes(bytes).ok()?; - match crate::container::manifest_v2_security(&w.manifest) { - Ok(s) => Some((Read::Multi(w), s.as_ref().is_some_and(|x| !x.is_plaintext()))), - Err(_) => None, - } - } - Some(b"WAI1") => { - let w = Wai::from_bytes(bytes).ok()?; - let sealed = w.manifest.security.as_ref().is_some_and(|x| !x.is_plaintext()); - Some((Read::One(w), sealed)) - } - _ => None, - } - }; + use HeldEnvelope as Read; + let read_one = read_held; let mut read: Vec<([u8; 32], Read)> = Vec::new(); let mut inert: Vec<[u8; 32]> = Vec::new(); let mut encrypted: Vec<[u8; 32]> = Vec::new(); @@ -1102,7 +1136,7 @@ impl ClaimReceipt { w.manifest.renditions.get(i).is_some_and(|m| { m.capability == d.capability && (m.is_selectable() || layer_entry(m)) - && (sealed(&d.object) || m.payload_digest_matches(&w.renditions[i])) + && if sealed(&d.object) { m.digest_well_formed() } else { m.payload_digest_matches(&w.renditions[i]) } }) }), Some(Read::One(w)) => { @@ -1279,17 +1313,8 @@ impl ClaimReceipt { } } } - // 9. The classical length, over the readable WAI2 envelopes. - let mut sum: Option = None; - for (_, r) in &read { - let Read::Multi(w) = r else { continue }; - if let Some(i) = classical_rendition(w) - && !s.decoders.iter().any(|d| d.capability == w.manifest.renditions[i].capability) - { - *sum.get_or_insert(0) += w.renditions[i].len() as u128; - } - } - if sum != s.classical_declared.map(u128::from) { + // 9. The classical length, over the held WAI2 envelopes, readable or encrypted. + if classical_length(envelopes, &s.decoders) != s.classical_declared.map(u128::from) { return Err(Rejection::at(6, Reason::SessionClassicalMismatch)); } Ok(()) diff --git a/wai/wai-rs/src/container.rs b/wai/wai-rs/src/container.rs index 2fca83f3d..108ac22d0 100644 --- a/wai/wai-rs/src/container.rs +++ b/wai/wai-rs/src/container.rs @@ -1678,6 +1678,15 @@ impl RenditionMeta { Some(want) => is_sha256_hex(want) && crate::pin::sha256_hex(payload) == want, } } + + /// Whether this entry's `sha256` is absent or well formed — 64 lowercase hex digits + /// ([`is_sha256_hex`]) — read from the entry alone: one that is not matches no payload + /// ([`Self::payload_digest_matches`]), so no sink decodes the entry whatever its + /// payload. Of an encrypted envelope, whose payloads a verifier without the key does + /// not read, this is what the entry gives of its digest (jwp-receipts §2.4.12 rule 4). + pub fn digest_well_formed(&self) -> bool { + self.sha256.as_deref().is_none_or(is_sha256_hex) + } } /// An envelope that breaks the component rules of SPEC §5 / §7.1. Returned by diff --git a/wai/wai-rs/src/session_recorder.rs b/wai/wai-rs/src/session_recorder.rs index 9bd932f11..bc5dbd6ac 100644 --- a/wai/wai-rs/src/session_recorder.rs +++ b/wai/wai-rs/src/session_recorder.rs @@ -4,12 +4,12 @@ //! A [`SessionRecorder`] is told what the sink does as it does it: the decoders it uses, the //! objects it receives, each presentation with its output's digest and, where it missed its //! deadline, by how much; each switch of path; the `stage` claims it signs about the stage -//! sets it observes; the classical rendition it did not need; and the decode figure where -//! it was metered. [`SessionRecorder::finish`] tallies them as the class states them — -//! decoder entries in first-use order, the leaves, units and paths, the output tree, the -//! first 1024 switches and 256 missed presentations in order, the counted sums — seals the -//! claim, and checks it against the presentations, the objects and the `stage` claims it -//! names (§3.1 step 6) before it returns it. A recorder never emits a claim a verifier +//! sets it observes; and the decode figure where it was metered. +//! [`SessionRecorder::finish`] tallies them as the class states them — decoder entries in +//! first-use order, the leaves, units and paths, the output tree, the first 1024 switches +//! and 256 missed presentations in order, the counted sums, the classical length — seals +//! the claim, and checks it against the presentations, the objects and the `stage` claims +//! it names (§3.1 step 6) before it returns it. A recorder never emits a claim a verifier //! holding what it recorded refuses. //! //! A sink tells the recorder what it received, and never an object's figures: the bytes @@ -21,10 +21,13 @@ //! whole ([`SessionRecorder::received_unheld`]), which is not countable. The session //! accounts for every byte transferred. Whether an object was presented is derived from //! the decoder entries, and an object received more than once on a path is one object, -//! its `transferred` every byte received for it. +//! its `transferred` every byte received for it. The classical length, +//! `classical_declared`, is derived at the tally from the `WAI2` envelopes the recorder +//! holds, readable or encrypted, exactly as §2.4.12 rule 9 counts them +//! ([`crate::claim_receipt::session::classical_length`]): a sink never states it. use crate::claim_receipt::{ - session::SESSION_CLASSICAL_SOURCES, ClaimBody, ClaimClass, ClaimReceipt, DecoderEntry, Missed, ObjectSeen, + session::{classical_length, SESSION_CLASSICAL_SOURCES}, ClaimBody, ClaimClass, ClaimReceipt, DecoderEntry, Missed, ObjectSeen, Rejection, SessionClaim, SessionEnergy, SessionHost, SessionPath, StageSetRef, SubjectType, Switch, }; use crate::output_tree::{self, Presentation}; @@ -117,7 +120,6 @@ pub struct SessionRecorder { switches: Vec, objects: Vec, receipt_bytes: u64, - classical: Option, stage_sets: BTreeSet, stage_signer: Option<[u8; 32]>, /// The wire forms of the `stage` claims named, each once. @@ -144,7 +146,6 @@ impl SessionRecorder { switches: Vec::new(), objects: Vec::new(), receipt_bytes: 0, - classical: None, stage_sets: BTreeSet::new(), stage_signer: None, stage_claims: Vec::new(), @@ -164,16 +165,19 @@ impl SessionRecorder { } } - /// An object received whole on `path`, as its bytes: a `WAI1` or `WAI2` envelope, or - /// bytes that are inert at this sink — an encrypted envelope it cannot open (SPEC §6.4), - /// or bytes that are not an envelope at all. Every one is recorded, so the session - /// accounts for every byte transferred. The recorder derives its content hash, its - /// counted bytes (staged-measurement §3; none where it is not countable, as inert bytes - /// never are) and its length, and at the tally whether a decoder entry names it. It - /// holds the bytes, and [`SessionRecorder::finish`] checks the claim against every - /// envelope it holds, where inert bytes no entry names are an object received, neither - /// counted nor presented. Received again on the same path, it is the same object, its - /// `transferred` the bytes of both receipts. + /// An object received whole on `path`, as its bytes: a `WAI1` or `WAI2` envelope, its + /// payloads plaintext or encrypted, or bytes that are not an envelope at all. Every one + /// is recorded, so the session accounts for every byte transferred. The recorder + /// derives its content hash, its counted bytes (staged-measurement §3; none where it is + /// not countable, as an encrypted envelope and bytes that are not one never are) and its + /// length, and at the tally whether a decoder entry names it. It holds the bytes, and + /// [`SessionRecorder::finish`] checks the claim against every envelope it holds + /// (§2.4.12 step 6): an encrypted envelope's manifest and rendition table are in the + /// clear, so a `WAI2` one's classical rendition counts in the classical length the + /// tally derives, as a plaintext one's does; an encrypted envelope, or bytes that are + /// not one, no entry names is an object received, neither counted nor presented. + /// Received again on the same path, it is the same object, its `transferred` the bytes + /// of both receipts. pub fn received_envelope(&mut self, envelope: &[u8], path: SessionPath) { let content_hash = crate::jwp_hash::content_hash(envelope); if !self.held.iter().any(|h| crate::jwp_hash::content_hash(h) == content_hash) { @@ -268,12 +272,6 @@ impl SessionRecorder { Ok(()) } - /// An entry envelope's classical rendition the sink did not need: its length as the - /// envelope's `WAI2` rendition table declares it. - pub fn classical(&mut self, declared_len: u64) { - self.classical = Some(self.classical.unwrap_or(0).saturating_add(declared_len)); - } - /// The decode figure of one completion of the presentations, or `None` where the decode /// was not metered. pub fn energy(&mut self, e: Option) { @@ -342,6 +340,10 @@ impl SessionRecorder { let sum = |f: &dyn Fn(&ObjectSeen) -> bool| -> u64 { objects.iter().filter(|o| f(o)).filter_map(|o| o.counted).fold(0u64, u64::saturating_add) }; + // The classical length, as §2.4.12 rule 9 reads it from the envelopes held: a + // length past u64 cannot be stated, and the check at the seal refuses it. + let held: Vec<&[u8]> = self.held.iter().map(Vec::as_slice).collect(); + let classical = classical_length(&held, &decoders).map(|n| u64::try_from(n).unwrap_or(u64::MAX)); let body = SessionClaim { session_nonce: self.session_nonce, media: self.media.clone(), @@ -365,8 +367,8 @@ impl SessionRecorder { uncounted: objects.iter().filter(|o| o.counted.is_none()).count() as u64, transferred: objects.iter().map(|o| o.transferred).fold(0u64, u64::saturating_add), receipt_bytes: self.receipt_bytes, - classical_declared: self.classical, - classical_source: self.classical.map(|_| SESSION_CLASSICAL_SOURCES[0].to_owned()), + classical_declared: classical, + classical_source: classical.map(|_| SESSION_CLASSICAL_SOURCES[0].to_owned()), energy: self.energy.clone(), }; (body, ps, objects) @@ -492,7 +494,6 @@ mod tests { r.received_unheld([6; 32], SessionPath::Primary, 300); r.received_unheld([6; 32], SessionPath::Primary, 300); r.received_unheld([3; 32], SessionPath::Fallback, 3_000); - r.classical(700); let s = r.finish([1; 32], &k, "did:example:sink", 0, None, T).unwrap(); let ClaimBody::ReconstructSession(b) = &s.claim.body else { panic!("a session") }; let caps: Vec<&str> = b.decoders.iter().map(|d| d.capability.as_str()).collect(); @@ -503,7 +504,7 @@ mod tests { assert_eq!((b.counted_primary, b.counted_fallback, b.counted_discarded, b.uncounted, b.transferred), (0, 0, 0, 4, 9_300)); assert_eq!(s.objects.iter().map(|o| (o.content_hash[0], o.presented, o.transferred)).collect::>(), [(1, true, 5_000), (2, true, 700), (6, false, 600), (3, true, 3_000)], "a repeat is one object; presented derived"); - assert_eq!((b.classical_declared, b.classical_source.as_deref()), (Some(700), Some("wai2-table"))); + assert_eq!((b.classical_declared, b.classical_source.as_deref()), (None, None), "no WAI2 envelope held: no classical length"); assert_eq!(b.output_root, output_tree::root(&s.presentations).unwrap()); s.claim.verify().unwrap(); s.claim.check_session_outputs(&s.presentations, &|_| None).unwrap(); @@ -626,6 +627,51 @@ mod tests { assert_eq!(refused(record("wai.neural.int_hyper", Some((1, 1, 0)))), Err((6, Reason::SessionUnitOutsideObject)), "the base holds one unit"); } + /// The classical length is the recorder's, never the sink's: from the `WAI2` envelopes + /// it holds, plaintext or encrypted — whose rendition tables are in the clear — each + /// one's classical rendition no entry decoded counts its table's length, as §2.4.12 + /// rule 9 reads it, so a session that received one seals and verifies against its + /// envelopes. + #[test] + fn a_recorder_derives_the_classical_length_from_its_envelopes() { + let wai = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join(".."); + let read = |p: &str| std::fs::read(wai.join(p)).unwrap_or_else(|e| panic!("{p}: {e}")); + let base = read("staged-conformance/cases/image_int_hyper_2l/base.wai"); + let plain = read("staged-measure-conformance/counting/wai2-classical.wai"); + let encrypted = read("staged-measure-conformance/counting/wai2-classical-encrypted.wai"); + let png = |w: &[u8]| crate::container::WaiMulti::from_bytes(w).expect("a WAI2 envelope").renditions[1].len() as u64; + assert_eq!(png(&plain), png(&encrypted), "one table, in the clear either way"); + let hash = crate::jwp_hash::content_hash; + let k = SigningKey::from_bytes(&[0x44; 32]); + // The base presented, each of `received` received whole; with `decode_png`, the + // plaintext WAI2's PNG rendition decoded too. + let seal = |received: &[&[u8]], decode_png: bool| { + let mut r = SessionRecorder::new([7; 32], "image", host(), None); + let b = r.decoder(key("wai.neural.int_hyper", SessionPath::Primary, hash(&base))); + r.presented(0, 1, b, d(0, 1), None).unwrap(); + if decode_png { + let p = r.decoder(DecoderKey { rendition: Some(1), ..key("wai.image.png", SessionPath::Primary, hash(&plain)) }); + r.presented(1, 1, p, d(1, 1), None).unwrap(); + } + r.received_envelope(&base, SessionPath::Primary); + for e in received { + r.received_envelope(e, SessionPath::Primary); + } + let s = r.finish(hash(&base), &k, "did:example:sink", 0, None, T).expect("the session seals"); + let refs: Vec<&[u8]> = s.envelopes.iter().map(Vec::as_slice).collect(); + s.claim.check_session_envelopes(&refs, Some(&s.objects), Some(&s.presentations)).unwrap(); + let ClaimBody::ReconstructSession(body) = &s.claim.body else { panic!("a session") }; + (body.classical_declared, body.classical_source.clone()) + }; + let table = |n: u64| (Some(n), Some("wai2-table".to_owned())); + assert_eq!(seal(&[], false), (None, None), "no WAI2 held"); + assert_eq!(seal(&[&plain], false), table(png(&plain)), "a plaintext WAI2"); + assert_eq!(seal(&[&encrypted], false), table(png(&encrypted)), "an encrypted WAI2: its table is in the clear"); + assert_eq!(seal(&[&plain, &encrypted], false), table(2 * png(&plain)), "both"); + assert_eq!(seal(&[&plain, &plain], false), table(png(&plain)), "received twice, held once"); + assert_eq!(seal(&[&plain], true), (None, None), "its classical rendition decoded: the session needed it"); + } + /// A `stage` claim about the set of `n` units over `base`, every unit at stage 0, signed /// with `k`. fn stage_claim(k: &SigningKey, base: [u8; 32], n: u64) -> ClaimReceipt { diff --git a/wai/wai-web/demo/verify_measure_wasm.mjs b/wai/wai-web/demo/verify_measure_wasm.mjs index 4a3f55d48..88416d8f4 100644 --- a/wai/wai-web/demo/verify_measure_wasm.mjs +++ b/wai/wai-web/demo/verify_measure_wasm.mjs @@ -32,7 +32,12 @@ // would say; bytes that are not an envelope, and an encrypted envelope, are recorded as // objects neither counted nor presented, every byte transferred; and integers from JS (a unit, a layer // count, a decoder handle, a picture's width and height) that are not whole numbers in -// range are refused, never truncated or wrapped. +// range are refused, never truncated or wrapped; +// - the classical length: a session that received a WAI2 it did not decode — counting/ +// wai2-classical.wai and its encrypted twin — seals, stating the classical length its +// rendition table declares, which the page never states; verifyClaim accepts it with +// the envelopes and refuses it without that WAI2 (session_classical_mismatch), and the +// native and Python verifiers give the same verdicts. // // node verify_measure_wasm.mjs [path/to/wai_web.js] [path/to/staged-measure-conformance] [--out ] // @@ -332,6 +337,48 @@ for (const [name, { files, t, golden }] of titles) { check(wai.verifyClaim(r.claim, JSON.stringify(r.outputs), JSON.stringify(r.objects), [...golden.objects.map(env), ...inert.map(([, b]) => b)]) === '', 'that session verifies against the envelopes received'); } +// ── a WAI2 received and not decoded: the classical length the page never states ────── +// A page receives a WAI2 whose second rendition, PNG, is its classical rendition, its +// payloads plaintext or encrypted. Its rendition table is in the clear either way, so the +// recorder states the classical length that table declares (jwp-receipts §2.4.12 rule 9), +// read here from the table itself: magic, manifest length, manifest, rendition count, then +// (offset, length) per rendition. +{ + const { files, golden } = titles.get(names.includes('still') ? 'still' : names[0]); + const base = golden.objects[0]; + const env = files.get(base.file); + const tableLength = (w, i) => { + const dv = new DataView(w.buffer, w.byteOffset, w.byteLength); + const ml = dv.getUint32(4, true); + return dv.getUint32(8 + ml + 2 + 8 * i + 4, true); + }; + for (const which of ['wai2-classical', 'wai2-classical-encrypted']) { + const w = new Uint8Array(readFileSync(join(corpus, `counting/${which}.wai`))); + const h = wai.sessionBegin(env, HOST, NONCE, undefined); + const bd = golden.decoders.find((x) => x.object === base.object); + const dd = h.decoderFor(env, bd.capability, bd.pin !== null, firstUnitOf(golden, base.object)); + const p0 = golden.presentations.find((x) => golden.decoders[x.decoder].object === base.object && x.layers === 1); + h.presented(p0.unit, 1, dd, p0.out_sha256, undefined); + h.received(env); + h.received(w); + let r = null; + try { r = h.finish(SEED, undefined, T); } catch (e) { check(false, `${which}: the session seals (${e.message ?? e})`); continue; } + const body = JSON.parse(r.claim).body; + check(body.classical_declared === tableLength(w, 1) && body.classical_source === 'wai2-table', + `${which}: the session states the classical length its table declares (${body.classical_declared})`); + const o = JSON.stringify(r.outputs), j = JSON.stringify(r.objects); + check(wai.verifyClaim(r.claim, o, j, [env, w]) === '', `${which}: verifyClaim accepts the session with the envelopes`); + check(wai.verifyClaim(r.claim, o, j, [env]) === 'session_classical_mismatch', `${which}: without the WAI2, no classical length is read`); + for (const [vname, envs, verdict] of [ + [`classical/${which}/accept`, [env, w], `accept link_hash=${r.link_hash}`], + [`classical/${which}/wai2-not-held`, [env], 'reject step=6 reason=session_classical_mismatch'], + ]) { + vectors.push({ name: vname, procedure: 'claim', receipt: r.claim, + context: { outputs: r.outputs, objects: r.objects, envelopes: envs.map((e) => ({ envelope: Buffer.from(e).toString('hex') })) } }); + expected.push(`${vname}\t${verdict}`); + } + } +} if (out) { writeFileSync(join(out, 'sessions.json'), printed({ about: 'Sessions sealed by the wasm32 binding over the staged-measure corpus (verify_measure_wasm.mjs).', vectors })); diff --git a/wai/wai-web/src/measure.rs b/wai/wai-web/src/measure.rs index 5a4b66075..d94426c76 100644 --- a/wai/wai-web/src/measure.rs +++ b/wai/wai-web/src/measure.rs @@ -479,11 +479,15 @@ impl SessionHandle { } /// An object received whole on the primary path, as its bytes — every object the page - /// received, presented or not, and one it refused too: an encrypted envelope it cannot - /// open, or bytes that are not an envelope at all, are an inert object, neither counted - /// nor presented, so the session accounts for every byte transferred. The recorder - /// derives its figures, and whether a decoder entry names it, and holds it, so `finish` - /// checks the claim against it. Received again, it is one object with the bytes of both. + /// received, presented or not, and one it refused too: an envelope whose payloads are + /// encrypted, or bytes that are not an envelope at all, are recorded as an object + /// neither counted nor presented, so the session accounts for every byte transferred. + /// The recorder derives its figures, and whether a decoder entry names it, and holds + /// it, so `finish` checks the claim against it. An encrypted envelope's manifest and + /// rendition table are in the clear: a `WAI2` envelope's classical rendition, encrypted + /// or not, counts in the classical length `finish` derives from the envelopes held + /// (jwp-receipts §2.4.12 rule 9), which the page never states. Received again, it is one + /// object with the bytes of both. pub fn received(&mut self, envelope: &[u8]) -> Result<(), JsError> { self.rec()?.received_envelope(envelope, SessionPath::Primary); Ok(()) @@ -772,11 +776,40 @@ mod tests { let (claim, o, j) = (s["claim"].as_str().unwrap(), s["outputs"].to_string(), s["objects"].to_string()); assert_eq!(s["objects"][1]["counted"], Value::Null, "the encrypted envelope: uncounted"); assert_eq!((s["objects"][2]["counted"].clone(), s["objects"][2]["transferred"].clone()), (Value::Null, Value::from(7)), "bytes that are not an envelope: uncounted, transferred"); - assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone(), encrypted.clone(), base[..7].to_vec()])).unwrap(), "", "inert objects no entry names"); + assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone(), encrypted.clone(), base[..7].to_vec()])).unwrap(), "", "objects no entry names, uncounted"); let why = session(Some("wai.audio.int_codec")).unwrap_err(); assert!(why.contains("session_source_mismatch"), "{why}"); } + /// A page that receives a `WAI2` envelope it does not decode — its payloads plaintext or + /// encrypted, its rendition table in the clear either way — seals its session: `finish` + /// states the classical length the envelopes held give (jwp-receipts §2.4.12 rule 9), + /// which the page has no way to state, and a verifier holding them accepts it; one not + /// holding that envelope reads none. + #[test] + fn a_session_that_received_a_wai2_states_its_classical_length() { + let dir = "staged-measure-conformance/fixtures/still"; + let files = fetch(dir); + let m = measured(dir, &files).unwrap(); + let base = &m.t.bases[0].obj.bytes; + let p = &m.e.presentations[0]; + for name in ["wai2-classical", "wai2-classical-encrypted"] { + let w = std::fs::read(wai_dir().join(format!("staged-measure-conformance/counting/{name}.wai"))).unwrap(); + let png = wai::container::WaiMulti::from_bytes(&w).unwrap().renditions[1].len() as u64; + let (mut r, subject) = begin(base, host_of(HOST).unwrap(), [7; 32], None).unwrap(); + let h = r.decoder(decoder_key(base, None, true, 0).unwrap()); + r.presented(p.p.unit, p.p.layers, h, p.p.out_digest, None).unwrap(); + r.received_envelope(base, SessionPath::Primary); + r.received_envelope(&w, SessionPath::Primary); + let s = finish(r, subject, &"44".repeat(32), None, T).unwrap_or_else(|e| panic!("{name}: {e}")); + let (claim, o, j) = (s["claim"].as_str().unwrap(), s["outputs"].to_string(), s["objects"].to_string()); + let body: Value = serde_json::from_str::(claim).unwrap()["body"].clone(); + assert_eq!((body["classical_declared"].as_u64(), body["classical_source"].as_str()), (Some(png), Some("wai2-table")), "{name}"); + assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone(), w.clone()])).unwrap(), "", "{name}"); + assert_eq!(verify_session(claim, &o, &j, Some(&[base.clone()])).unwrap(), "session_classical_mismatch", "{name}: the WAI2 not held"); + } + } + /// Integers from JS are whole numbers in range, read as given: never truncated (0.5, /// 1.9, 0.99) or wrapped (2^32 + 2), the cases a review found wasm-bindgen's integer /// types coerced. -- 2.54.0 (Apple Git-157) From 1cffbc6ffdbd42b161c41234565905c39932770b Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 03:11:46 -0400 Subject: [PATCH 19/21] wai: HTTP reports a refinement by its refines.base alone; a conforming envelope's refinement tested MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - §7 step 4 as the text stands: a refinement of the pick is one whose refines.base, read on its own, is the pick's id (container::refinements_naming, refinements_naming in http_verify.py), so one whose refines is otherwise malformed is reported dropped (components_nonconforming). Of a conforming envelope the set is the same as before. - Objects OCF (ONC's conforming twin: refinements [2], dropped []), ONM (refines {base: b} alone: reported) and ONX (refines {base: x}: not reported), on the whole and the range paths; fetch_OR_malformed_refines now reports its refinement; the generator checks each outcome. - falsify: conforming-withheld and refines-read-whole, each with an http_verify.py --mutate, wired into falsify/run.sh; nonconforming-offered's must-fail list extended. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 10 +++- wai/http-conformance/README.md | 11 +++- wai/http-conformance/cases.json | 11 +++- .../falsify/conforming-withheld.patch | 15 +++++ .../falsify/nonconforming-offered.patch | 2 +- .../falsify/refines-read-whole.patch | 15 +++++ wai/http-conformance/falsify/run.sh | 2 +- wai/http-conformance/http_verify.py | 24 +++++++- wai/http-conformance/objects.json | 24 ++++++++ ...839ad6486ebb9dcdc521d11413db99ad1b4b94.wai | Bin 0 -> 32726 bytes ...6486ebb9dcdc521d11413db99ad1b4b94.wai.etag | 1 + ...ad6486ebb9dcdc521d11413db99ad1b4b94.wai.hp | Bin 0 -> 213 bytes ...f7ae0e448103b03b534c20a4a173c735197f9d.wai | Bin 0 -> 33015 bytes ...e448103b03b534c20a4a173c735197f9d.wai.etag | 1 + ...e0e448103b03b534c20a4a173c735197f9d.wai.hp | Bin 0 -> 245 bytes ...d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai | Bin 0 -> 32726 bytes ...8e6a4cdaee317fc6dfa7ca29841413d90.wai.etag | 1 + ...2b8e6a4cdaee317fc6dfa7ca29841413d90.wai.hp | Bin 0 -> 213 bytes wai/wai-rs/src/bin/wai_cli/http_vectors.rs | 53 +++++++++++++++++- wai/wai-rs/src/container.rs | 15 +++++ wai/wai-rs/src/http_binding/session.rs | 10 +++- 21 files changed, 180 insertions(+), 15 deletions(-) create mode 100644 wai/http-conformance/falsify/conforming-withheld.patch create mode 100644 wai/http-conformance/falsify/refines-read-whole.patch create mode 100644 wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai create mode 100644 wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.etag create mode 100644 wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.hp create mode 100644 wai/http-conformance/objects/4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d.wai create mode 100644 wai/http-conformance/objects/4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d.wai.etag create mode 100644 wai/http-conformance/objects/4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d.wai.hp create mode 100644 wai/http-conformance/objects/b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai create mode 100644 wai/http-conformance/objects/b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai.etag create mode 100644 wai/http-conformance/objects/b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai.hp diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 672c4e253..003d9defe 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -106,7 +106,15 @@ wire format may change and such changes are recorded here. for the whole envelope; and http-delivery §7 step 4 states it for a client planning from a verified head: each refinement of a nonconforming envelope is dropped (`components_nonconforming`), never requested, one stating no `sha256` dropped for that - too, on the range path and the whole-object path alike. + too, on the range path and the whole-object path alike. A refinement is one whose + `refines.base`, read on its own, is the pick's id (`container::refinements_naming`), so + one whose `refines` is otherwise malformed is reported too; of a conforming envelope + that is exactly the refinements whose `refines` is well formed. The HTTP corpus adds + ONC's conforming twin, OCF, whose refinement is fetched and delivered on both paths, + and ONM and ONX, a `refines` of the pick's id alone (reported) and of no entry's (not + reported); `OR`'s refinement, which names the pick, is now reported. `falsify/` adds + `conforming-withheld` and `refines-read-whole`, each with its `http_verify.py + --mutate`. - **An encrypted envelope's clear parts are checked** (§2.4.12). SPEC §6.4 encrypts payloads only: rules 4–9 now read an encrypted envelope's manifest and rendition table as any held envelope's — the rendition an entry names, its capability, the component diff --git a/wai/http-conformance/README.md b/wai/http-conformance/README.md index b679626bf..d5f2cbae0 100644 --- a/wai/http-conformance/README.md +++ b/wai/http-conformance/README.md @@ -66,9 +66,11 @@ reference adaptation policies. Two implementations check every case and must agr | OT | two renditions the first request holds whole | bytes changed in the first response are not reused | | OF | a `WAI1` naming a record beside a payload fallback | the union lists what SPEC §4 dispatches | | OE1, OE2s, OE2t | an encrypted `WAI1`; `WAI2`s whose `security` is a string, `true` | SPEC §6.4 on both containers | -| OR | a refinement component whose `refines` is malformed | it refines nothing | +| OR | a refinement component whose `refines` is `{"base": "b"}`, the pick's id and nothing else | the envelope does not conform, and the refinement, whose `refines.base` read on its own names the pick, is reported dropped (`components_nonconforming`, §7 step 4) | | OPf, OPe, OPw | a `WAI1` naming `wai.text.zstd` whose `refines` is `false`, `{}`, and well formed | a payload carrying `refines` is an ordinary object: dispatched, described by its capability, `not_a_layer` when listed as a layer (§10.4) | | ORN | an AV1 base most of the object and a refinement component stating no `sha256` | the refinement dropped (`component_digest_absent`) on the whole path and the range path alike | +| ONC, OCF | a base most of the object, an HDR10+ companion, and a refinement with its `sha256`; the companion bound to nothing (ONC) or to the base's capability (OCF) | ONC does not conform, so its refinement is dropped (`components_nonconforming`) and never requested; every component of OCF conforms, so its refinement is fetched and delivered; on the whole path and the range path alike (§7 step 4) | +| ONM, ONX | ONC's base and refinement, the refinement's `refines` the base's id alone (ONM) or `x`, no entry's (ONX) | ONM's refinement is reported dropped (`components_nonconforming`); ONX's names no entry, so it is no refinement of the pick and is not reported | | `bad/OK.wai`, `bad/OKN.wai` | a string key id; a numeric `kind` | the manifest's member types | | O11a, O11b, O11bL1 | the staged-delivery pair of `../staged-conformance/cases/live_multi_base/`: two `WAI1` int_motion bases of two frames each, and a layer over the second | `#WAI-LAYER` after one segment only; the layer joined to its own base in the union; depth over a base with one layer | | O12s0, O12s1, O12p0_00 – O12p1_11 | a low-latency set: two segments of 3.84 s, each its own object, and their twenty-four 0.32 s parts, each its own object that decodes alone | Live-P adjacency, parts listed under aliases with cids, the live revision chain, parts verified against the cid the first revision listing them lists | @@ -83,7 +85,8 @@ the same bytes. The HDR10+ block, the AVC bases and the LCEVC enhancements are synthetic: they carry the right start codes and decode to nothing, which transport does not need. OD's and -OT's payloads are byte patterns, as are OE2s', OE2t's, OR's and ORN's. Every other payload is real: the integer renditions are +OT's payloads are byte patterns, as are OE2s', OE2t's, OR's, ORN's, ONC's, OCF's, +ONM's and ONX's. Every other payload is real: the integer renditions are the committed vectors; the images and the AV1 streams are in `src/`, encoded once outside this repository, and the AV1 streams were checked to decode. @@ -163,7 +166,9 @@ fails the self-test; `base-at-done`, `tick-noop` and `refinement-unclipped` fail `timed_*` cases; `pdt-ignored`, `dseq-ignored`, `parts-after-extinf`, `average-floor`, `render-digest-off`, `name-unchecked`, `chain-unchecked`, `ilog2-no-interp`, `bola-waits`, `unlabelled-as-zero` and `round-half-down` fail the playlist, receipt and -adaptation cases they reach), and the job checks a differential: `wai_http_vectors diff` +adaptation cases they reach; `nonconforming-offered`, `conforming-withheld` and +`refines-read-whole` fail the ORN, ONC, OCF, ONM and OR fetches; `falsify/run.sh` runs +every one), and the job checks a differential: `wai_http_vectors diff` writes random envelopes' covered prefixes and proofs, `http_verify.py diff` verifies every one, and, with one chaining-value byte changed in ten of them, refuses exactly those ten. diff --git a/wai/http-conformance/cases.json b/wai/http-conformance/cases.json index 4be8e80b8..148adc9ce 100644 --- a/wai/http-conformance/cases.json +++ b/wai/http-conformance/cases.json @@ -57,6 +57,7 @@ {"name":"head_proof_ok_O9a","op":"head_proof","input":{"object":"O9a"},"expect":{"covered_len":1009,"n_cv":5,"envelope_len":21034}}, {"name":"head_proof_ok_O9b","op":"head_proof","input":{"object":"O9b"},"expect":{"covered_len":1009,"n_cv":5,"envelope_len":18004}}, {"name":"head_proof_ok_O9c","op":"head_proof","input":{"object":"O9c"},"expect":{"covered_len":1009,"n_cv":5,"envelope_len":18381}}, +{"name":"head_proof_ok_OCF","op":"head_proof","input":{"object":"OCF"},"expect":{"covered_len":1009,"n_cv":6,"envelope_len":33015}}, {"name":"head_proof_ok_OD","op":"head_proof","input":{"object":"OD"},"expect":{"covered_len":1009,"n_cv":6,"envelope_len":53794}}, {"name":"head_proof_ok_OE1","op":"head_proof","input":{"object":"OE1"},"expect":{"covered_len":299,"n_cv":0,"envelope_len":299}}, {"name":"head_proof_ok_OE2s","op":"head_proof","input":{"object":"OE2s"},"expect":{"covered_len":1009,"n_cv":3,"envelope_len":5251}}, @@ -65,6 +66,8 @@ {"name":"head_proof_ok_OH","op":"head_proof","input":{"object":"OH"},"expect":{"covered_len":6129,"n_cv":3,"envelope_len":23519}}, {"name":"head_proof_ok_ON","op":"head_proof","input":{"object":"ON"},"expect":{"covered_len":1009,"n_cv":6,"envelope_len":38384}}, {"name":"head_proof_ok_ONC","op":"head_proof","input":{"object":"ONC"},"expect":{"covered_len":1009,"n_cv":6,"envelope_len":32978}}, +{"name":"head_proof_ok_ONM","op":"head_proof","input":{"object":"ONM"},"expect":{"covered_len":1009,"n_cv":5,"envelope_len":32726}}, +{"name":"head_proof_ok_ONX","op":"head_proof","input":{"object":"ONX"},"expect":{"covered_len":1009,"n_cv":5,"envelope_len":32726}}, {"name":"head_proof_ok_OPe","op":"head_proof","input":{"object":"OPe"},"expect":{"covered_len":264,"n_cv":0,"envelope_len":264}}, {"name":"head_proof_ok_OPf","op":"head_proof","input":{"object":"OPf"},"expect":{"covered_len":267,"n_cv":0,"envelope_len":267}}, {"name":"head_proof_ok_OPw","op":"head_proof","input":{"object":"OPw"},"expect":{"covered_len":421,"n_cv":0,"envelope_len":421}}, @@ -277,7 +280,7 @@ {"name":"select_OE2s_security_string","op":"select","input":{"object":"OE2s","advertises":["wai.text.zstd"]},"expect":{"inert":[[0,"unsupported_encryption"]]}}, {"name":"select_OE2t_security_true","op":"select","input":{"object":"OE2t","advertises":["wai.text.zstd"]},"expect":{"inert":[[0,"unsupported_encryption"]]}}, {"name":"fetch_OE2s_security_string","op":"fetch","input":{"object":"OE2s","advertises":["wai.text.zstd"]},"expect":{"error":"inert","skipped":[[0,"unsupported_encryption"]]}}, -{"name":"fetch_OR_malformed_refines","op":"fetch","input":{"object":"OR","advertises":["wai.video.int_motion"],"applies":["wai.video.int_refine"]},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":9615,"requests":2,"companions":[],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"6b1bcc071f58c5fb62613d029be744e824494acf931a1c46d89641a548b4aa91"}}, +{"name":"fetch_OR_malformed_refines","op":"fetch","input":{"object":"OR","advertises":["wai.video.int_motion"],"applies":["wai.video.int_refine"]},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":9615,"requests":2,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"components_nonconforming"]],"skipped":[],"component_sha256":"6b1bcc071f58c5fb62613d029be744e824494acf931a1c46d89641a548b4aa91"}}, {"name":"union_OR_malformed_refines","op":"union_floor","input":{"objects":["OR"]},"expect":{"union":"wai2.video.int_motion","floor":"wai2.video.int_motion"}}, {"name":"parse_head_kid_string","op":"parse_head","input":{"file":"bad/OK.wai"},"expect":{"error":"head_malformed"}}, {"name":"parse_head_kind_number","op":"parse_head","input":{"file":"bad/OKN.wai"},"expect":{"error":"head_malformed"}}, @@ -309,6 +312,12 @@ {"name":"fetch_ORN_ranged","op":"fetch","input":{"object":"ORN","fragment":"#n=32659&h=1009","advertises":["wai.video.av1"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30572,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"component_digest_absent"],[1,"components_nonconforming"]],"skipped":[],"component_sha256":"7898322c774e80346b83405764069cbf1d06484da8824fab90e18e2ce0188f8c"}}, {"name":"fetch_ONC_whole","op":"fetch","input":{"object":"ONC","fragment":"#n=32978&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":33223,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[2,"components_nonconforming"]],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, {"name":"fetch_ONC_ranged","op":"fetch","input":{"object":"ONC","fragment":"#n=32978&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30859,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[2,"components_nonconforming"]],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_OCF_whole","op":"fetch","input":{"object":"OCF","fragment":"#n=33015&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":33260,"requests":3,"companions":[],"refinements":[2],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_OCF_ranged","op":"fetch","input":{"object":"OCF","fragment":"#n=33015&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":33196,"requests":4,"companions":[],"refinements":[2],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_ONM_whole","op":"fetch","input":{"object":"ONM","fragment":"#n=32726&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":32939,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"components_nonconforming"]],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_ONM_ranged","op":"fetch","input":{"object":"ONM","fragment":"#n=32726&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30639,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[[1,"components_nonconforming"]],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_ONX_whole","op":"fetch","input":{"object":"ONX","fragment":"#n=32726&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":900},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"range_threshold","body_bytes":32939,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, +{"name":"fetch_ONX_ranged","op":"fetch","input":{"object":"ONX","fragment":"#n=32726&h=1009","advertises":["wai.video.int_hyper"],"applies":["wai.video.int_refine"],"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":30639,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"49bb512e4d956426f1b3fa3f029bb60fe7bdfdb1ad8b2bb47bdd9c8ad6c9dc3a"}}, {"name":"fetch_OS_threshold_stall","op":"fetch","input":{"advertises":["wai.video.avc"],"applies":["wai.video.lcevc"],"fragment":"#n=38460&h=1009","object":"OS","tamper":{"kind":"no_refinement"}},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":8705,"requests":4,"companions":[],"refinements":[],"abandoned":[1],"dropped":[],"skipped":[],"component_sha256":"e93f5c55dc5938a8cadd00477e4110d567d4a725b647a3cddf0c70c5e59dcd18"}}, {"name":"fetch_OS_threshold_stall_1001","op":"fetch","input":{"advertises":["wai.video.avc"],"applies":["wai.video.lcevc"],"fragment":"#n=38460&h=1009","object":"OS","tamper":{"kind":"no_refinement"},"threshold_permille":1001},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":8705,"requests":4,"companions":[],"refinements":[],"abandoned":[1],"dropped":[],"skipped":[],"component_sha256":"e93f5c55dc5938a8cadd00477e4110d567d4a725b647a3cddf0c70c5e59dcd18"}}, {"name":"fetch_OS_full","op":"fetch","input":{"advertises":["wai.video.avc"],"applies":["wai.video.lcevc"],"fragment":"#n=38460&h=1009","object":"OS"},"expect":{"role":"base","pick":0,"verified_by":"head-proof","why_whole":null,"body_bytes":38705,"requests":4,"companions":[1],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"e93f5c55dc5938a8cadd00477e4110d567d4a725b647a3cddf0c70c5e59dcd18"}}, diff --git a/wai/http-conformance/falsify/conforming-withheld.patch b/wai/http-conformance/falsify/conforming-withheld.patch new file mode 100644 index 000000000..911d883e3 --- /dev/null +++ b/wai/http-conformance/falsify/conforming-withheld.patch @@ -0,0 +1,15 @@ +# must fail: fetch_OCF_whole fetch_OCF_ranged +# the plan withholds the refinements of an envelope every component of which conforms (session::nonconforming_refinements) +diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs +index fd00472d..24c7063d 100644 +--- a/wai/wai-rs/src/http_binding/session.rs ++++ b/wai/wai-rs/src/http_binding/session.rs +@@ -205,7 +205,7 @@ impl Selector { + /// conform (SPEC §7.1, `ManifestV2::check_component_roles` over the head's manifest) does + /// not offer: every one of them where it does not conform, none where it does. + fn nonconforming_refinements(m: &ManifestV2, wanted: &[(usize, Class)]) -> Vec { +- if m.check_component_roles().is_ok() { ++ if false && m.check_component_roles().is_ok() { + return Vec::new(); + } + wanted.iter().map(|&(i, _)| i).filter(|&i| m.renditions.get(i).is_some_and(|e| e.is_refinement())).collect() diff --git a/wai/http-conformance/falsify/nonconforming-offered.patch b/wai/http-conformance/falsify/nonconforming-offered.patch index bbb66a51b..6a19bb3cd 100644 --- a/wai/http-conformance/falsify/nonconforming-offered.patch +++ b/wai/http-conformance/falsify/nonconforming-offered.patch @@ -1,4 +1,4 @@ -# must fail: fetch_ONC_whole fetch_ONC_ranged fetch_ORN_whole fetch_ORN_ranged +# must fail: fetch_ONC_whole fetch_ONC_ranged fetch_ORN_whole fetch_ORN_ranged fetch_ONM_whole fetch_ONM_ranged fetch_OR_malformed_refines # the plan offers the refinements of an envelope whose components do not all conform (session::nonconforming_refinements) diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs index 32c85293..2f462787 100644 diff --git a/wai/http-conformance/falsify/refines-read-whole.patch b/wai/http-conformance/falsify/refines-read-whole.patch new file mode 100644 index 000000000..bddaab423 --- /dev/null +++ b/wai/http-conformance/falsify/refines-read-whole.patch @@ -0,0 +1,15 @@ +# must fail: fetch_ONM_whole fetch_ONM_ranged fetch_OR_malformed_refines +# the plan finds a refinement only by a well-formed refines, so one naming the pick with the rest malformed is dropped unreported (Selector::applied) +diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs +index fd00472d..55d75f69 100644 +--- a/wai/wai-rs/src/http_binding/session.rs ++++ b/wai/wai-rs/src/http_binding/session.rs +@@ -196,7 +196,7 @@ impl Selector { + .filter(|&i| (self.applies)(&e[i])) + .map(|i| (i, if crate::codecs::is_enhancement_layer(&e[i].capability) { Class::Refinement } else { Class::Base })) + .collect(); +- out.extend(refinements_naming(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); ++ out.extend(crate::container::refinement_indices(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); + out + } + } diff --git a/wai/http-conformance/falsify/run.sh b/wai/http-conformance/falsify/run.sh index 754ceb709..df63f4073 100755 --- a/wai/http-conformance/falsify/run.sh +++ b/wai/http-conformance/falsify/run.sh @@ -53,7 +53,7 @@ for m in left-half no-root counter-zero floor-as-codecs blake3-iv base-at-done t unlabelled-escapes abr-unbounded gap-carries receipt-duplicates receipt-surrogates session-data-anywhere \ dash-r-expanded xml-attributes-scanned dash-timelines-unbounded budget-raises \ uri-unresolved gap-withdraws reanchor-backwards walk-exceeded-wedges walk-name-unchecked walk-verify-unchecked bindings-unbounded \ - file-numbers-unbounded nonconforming-offered; do + file-numbers-unbounded nonconforming-offered conforming-withheld refines-read-whole; do if python3 http_verify.py . --mutate "$m" > "$WORK/py-$m.log" 2>&1; then echo "::error::http_verify.py --mutate $m passed"; fail=1 else diff --git a/wai/http-conformance/http_verify.py b/wai/http-conformance/http_verify.py index 2cdeda932..947bd8ed0 100644 --- a/wai/http-conformance/http_verify.py +++ b/wai/http-conformance/http_verify.py @@ -22,7 +22,8 @@ stops the verifier, never passes. python3 http_verify.py [dir] verify every case and the self-test python3 http_verify.py [dir] --mutate NAME the same with a deliberate defect: left-half | no-root | counter-zero | floor-as-codecs | blake3-iv | base-at-done | - tick-noop | refinement-unclipped + tick-noop | refinement-unclipped | nonconforming-offered | conforming-withheld | + refines-read-whole | ... (falsify/run.sh runs every one) python3 http_verify.py cases FILE [dir] give every case of a case file (wai_http_vectors fuzz) its stated outcome python3 http_verify.py diff FILE [--flip N --seed S] @@ -404,6 +405,22 @@ def refinements_of(entries, i): return out +def refinements_naming(entries, i): + """The refinement components whose `refines.base`, read on its own, is entry i's id: + refinements_of without the rest of `refines` read. Of a conforming envelope the two + agree; of one that does not, these are the refinements a plan drops and reports + (components_nonconforming, http-delivery §7 step 4), a malformed `refines` naming the + pick among them.""" + if MUTATE == "refines-read-whole": + return refinements_of(entries, i) + bid = entries[i].get("id") + if bid is None: + return [] + return [j for j, e in enumerate(entries) if e.get("role") == "refinement" + and isinstance(e.get("refines"), dict) and isinstance(e["refines"].get("base"), str) + and e["refines"]["base"] == bid] + + def payload_ok(e, payload): return e.get("sha256") is None or e["sha256"] == sha(payload) @@ -913,7 +930,8 @@ class Session: """§7 step 4: the refinement components among `wanted` of an envelope whose components do not all conform (SPEC §7.1) — every one of them where it does not, none where it does.""" - if SV.component_roles(entries) is None or MUTATE == "nonconforming-offered": + conforms = SV.component_roles(entries) is None and MUTATE != "conforming-withheld" + if conforms or MUTATE == "nonconforming-offered": return [] return [i for i, _ in wanted if entries[i].get("role") == "refinement"] @@ -921,7 +939,7 @@ class Session: adv, applies = self.sink[0], self.sink[1] out = [(j, "refinement" if enhancement(entries[j]["capability"]) else "base") for j in companions_of(entries, pick) if entries[j]["capability"] in applies] - out += [(j, "refinement") for j in refinements_of(entries, pick) if entries[j]["capability"] in applies] + out += [(j, "refinement") for j in refinements_naming(entries, pick) if entries[j]["capability"] in applies] return out def advance_head(self): diff --git a/wai/http-conformance/objects.json b/wai/http-conformance/objects.json index 8eb83cde5..94d1b100a 100644 --- a/wai/http-conformance/objects.json +++ b/wai/http-conformance/objects.json @@ -231,6 +231,30 @@ "codecs": "wai2.video.int_hyper+video.int_refine", "what": "WAI2: a base, a companion bound to nothing, and a refinement with its sha256" }, + "OCF": { + "cid": "4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d", + "path": "objects/4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d.wai", + "n": 33015, + "h": 1009, + "codecs": "wai2.video.int_hyper+meta.hdr10plus+video.int_refine", + "what": "ONC with its companion bound to the base's capability: every component conforms" + }, + "ONM": { + "cid": "b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90", + "path": "objects/b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai", + "n": 32726, + "h": 1009, + "codecs": "wai2.video.int_hyper", + "what": "WAI2: a base and a refinement whose refines is {\"base\": \"b\"}, the base's id and nothing else" + }, + "ONX": { + "cid": "48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94", + "path": "objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai", + "n": 32726, + "h": 1009, + "codecs": "wai2.video.int_hyper", + "what": "ONM with refines {\"base\": \"x\"}, naming no entry" + }, "O11a": { "cid": "8f3a701e2f904ad90663466c2c12cafed3410eeb84ad41db82acdc8f9a10adf7", "path": "objects/8f3a701e2f904ad90663466c2c12cafed3410eeb84ad41db82acdc8f9a10adf7.wai", diff --git a/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai b/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai new file mode 100644 index 0000000000000000000000000000000000000000..2ec9b62387f7c3f571233336792e314d85405fe5 GIT binary patch literal 32726 zcmeHQWpvX}6z+x%clY2>N|QEeJ9PMPA27yvu`R4?OWPTxxa)9tcXxMpcXxLik^qOp zFMjclujlkf-fNQkUeYJ`e)s#rLPDA30G-Z9B@l%Qrf36A>8V&rRET;MuZWUUJyslE z$>CKC+>*<#2*fL?g>K0qDqh9u@KC|wK1v`i!Yg*go233uy_n(0$p-b*$mk@ORL`Dc-$74T}ECz>!UryiJXJkQdMWEO2KXJ$B==1np&$wo%4;Eb|l;YC^GX(C#A zhUd-dp=cAVMC1gUD3}Q4*ZTECqj=)csuL-{KSED=i91SCJJ}IuxBCNi+Q%68^P3W+)1}IizhtH0I?cl6F5L!< znz~^1wu5J`KYFXnn5VejQnPVe!I9K=#H6_^Ht#!m<^HQLK{<<*GgoiWx>HPiuc6~- zE#0vD*u^`~Kc&f5urytzUWS+&R4=2nn=&(>(zhS(E&51TN1*~UG`FWr6dIc@erWtghP>sFU0>4|3v&3@o&Wcfqwx01Nax= z_;=v{k^g}F59Gff{|EU`$p1qA8}k2<|A_og~h^8dkq0R9K?Ux5Du z{3qal0sjs7f53kP{wMHXf&UBqXW)MW{~h@Mz<&t-NAO>Q{}cSD;C}`GE%<-Ie+>R- z@Lz-f8~o?se+U0P`2V4Q0R0E(UqJr@`X|tTf&LBjf1rN^{U_*OLH`T-XV8Cx{vGuH zpnnMcN9bSvJN?gqECtK5HJf%&;`<~|U9^7B$!m{4q{&fKZ>!s~Q*74(V`eVfeBkV@ z=PBv)lrUCp5GHo%K4ik&RojnTy!Tp{xj-3nNR#mBxZWeCEL^wy#MMXdQ)e$y!CI$9 zq&=zs=ow2l?LTw#+2^3#RHZ7RZ3LHp@c20^w;jH4_tm#d`AeH>G;SZ|?KOPzg0;Jj zUwQa0Rkp(AEw!6>j7jV_YWk9m`%d3@`YBzm;)crgTl3CtgT~EXvGvgTJ1@Ux%vXx3 z-l(1I={aoD{53m|U4HO3Fl(W5T&-piofGr7{KNQ<`S1Ul|Gxu-V^}!= literal 0 HcmV?d00001 diff --git a/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.etag b/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.etag new file mode 100644 index 000000000..60ceb3bf5 --- /dev/null +++ b/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.etag @@ -0,0 +1 @@ +"48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94" diff --git a/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.hp b/wai/http-conformance/objects/48be900eeba898a279b604db9e839ad6486ebb9dcdc521d11413db99ad1b4b94.wai.hp new file mode 100644 index 0000000000000000000000000000000000000000..e39d60c25c7d6366fa904c3b960bd927e8674e2a GIT binary patch literal 213 zcmV;`04o1iNKi3IzK{;7 z9&CH^|9OatwR?3n+;(=6``fhJ_9 literal 0 HcmV?d00001 diff --git a/wai/http-conformance/objects/4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d.wai b/wai/http-conformance/objects/4e89b2896be32390caaa435b09f7ae0e448103b03b534c20a4a173c735197f9d.wai new file mode 100644 index 0000000000000000000000000000000000000000..72b93a4e80272e89faa738950749f829ce46dd24 GIT binary patch literal 33015 zcmeHQWpvYA7%uMaItUJ9Bx#eT!`&S=V2p8NTcB%8*KLe3+}+*X-3G&b!`qx|`EiUd6RxQSp|L1K)toeLI6Rue zLlfMZ%Wf#dqtQgS=1>if;dDeW{z0*fLR>^P?1m?X{*T_w@8`vS^wN;97?Z9PrYdH_#QFZCFyWeq_=Tx%j&<21BmR~pdD73age5PFWL4bKU8A*9oZ&9wpp8Y7 z{)9uEI?ei5Tm7>Re;d@T>4wAG2ftf1+HiZj?PmqN4gIGv1yPZ`?Wsyuj2&^?i~i+uJ=Bl_IoTNlL&A9 zyj|#WYf-<0b`nE-+@Fh!3-)C^#2u>9(c_4;+v8H1ydO65*S7`@yJ+}JdXp(t)&eCf z`PXd`q<8B%c-+h->vtSJbN$gMJdeXX^cwo@E214d6^*kz&ht-cvKK1NRjJ=9I4q*q&r6JmTuUYc=pEQcPTRGV=79uo3&S+ zJqC`MzG!X2!BbZsy#AIUw@-PYM&kftkM1{e%KTOF`;K3_`{Hxj9EHp9RU5SKWO#ZH zn>c6rrrk%*-+KB1^+*3>{Nw${{D=7;>mSyC?0>NT!~Pfhf1H1C{=@kf=YPmQApe2< z3-Uk6KOz5x{2TIr=s%$Uf&L5nKj=T9|Aqb=`hVCz!2SdFFR=fC{S)lJVE+dDKiEIQ z{uB1Eu>XbqGwi=%{|@_q_&>n^1O6}Y|AGG#{J-G;2LC_!Kf?bL{;%-=h5s}Bzv2H5 z|9{{g0RI8_7r_4j{t573fPVx0AK)JW{|We4!2bgN8SvkLe+T?O;2#425%`zD{{;Ri z@Lz#{3;bW;9|Qjx_}9Sy2L3tl-+_M*{D1Htfd2vf7vTQ@{|WeCz<&e&AMhW6{|Wq8 z;Qs>u8TjA8e+T|Q@E?Nz5&W0`9sg&FoFy!E146qGowhvT=(Xpj9E`b6TRnQn)MeX_ zTz&REdvU&Y8!c+^l%-pft~~vgtr%CUwHi5S@{;((%TK;$^24CiWrJMGixccaQ>KsKYNOfC<*kcBbpR;o7!813XeNLZ;sZ^z5fZ~c9 zHhIC?9Z47NzWScIKxuQ0rX4~(eMe1SvT@JxD-YkL%3h?rwNA@UUAqq)H+x0=fzvmh zeoB|SxL@T4ZDnWAp_AsX*`9d*&dYC^@|WVPH)*d&^cgvA@rK>UExMI8GoJkfB*mh0002- z0{{R300006c&4$}OABvrJDeB3p}*_%0!ItLNj!*`5LJV$YJq;{$s|DXoXg4^2SUjl zovF*p(#`Q$?PN=EaxYrNnrhXFYdA&692F)+z^+l{o5R=#og|;7OUYD7u`tC0T=*5R zxiOM|ZE5Y)e!cn;=Byk=01HJ`n{x)d7(I;WQ=r?U@NuR^LSxL9D)G!^7DK;Ir|Wn* vsX;pcGr29Ta;t|gc?%ad0%-%K6wUF@$l_SWoym`7GZj5Do?ynH2QLIVDjaPN literal 0 HcmV?d00001 diff --git a/wai/http-conformance/objects/b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai b/wai/http-conformance/objects/b36600ee5a7498d8c8246b8440d072b8e6a4cdaee317fc6dfa7ca29841413d90.wai new file mode 100644 index 0000000000000000000000000000000000000000..a95941d0dd83054cb434779ed4f88bc5b1227898 GIT binary patch literal 32726 zcmeHQRdm}(6m?QcnVD5?UDuK&*-kO#lsRqFG#yc*#<5-7Nt(JYGp5YU%*@Qp%*;$F zNbR0I`?X*Dx7X+RLo=52W+V^1ci+7cVc|?lkip=ml88!$QnZPtj8wcVsYE+UR3+J^ z9ji{C?DS~`9@*_sMdFjSLXYf}RG;c{da2MzKP3`35mbljOV)m;UCi|RWRrGkbZoL) z_Go9ssZL3&{AZD>7YJINHZa{eE0Xe(z|XhQQWCvi5S8OcJR#gM{mD}|;=t{8VLIon{>*SC4@y(-yAT ze(3Ct$M1e*%u~D~SF3S5;z;T@a`L>DTlSy2`r!4q^f`-^W2!f7-C6bZ9yVe2vWSp!f2vHr*Y2m3$lf3g3E{{#LX_`l%)gZ~r$ zU--Y_|3~}-@gKy$5dTB`6Y*cfzY+fj{sH(8;9r3M0saa2FW}#R{{#LJ_)p+pf&T^m z8TfDD-+})}{sZzqkpF`GALKtF{|otV$p1tBBl16y|BC!y3;@gD_owd-Mo{U*gs{)(oOr%+1I<+T#zw*^5-*>$HgKnlxa{%w?MooW1q@OZwa;Du*^`L!AC0 z6Xveke&pi4*WWYcFHP5I++Ozd9x-L%y4@$PK6;P#~^K|PSxe*gdg0002- z0{{R300005R335Gm_jlQigtEQ!hCqz@uE9ah-9y-tsUWv1-b#yt1d$}xzFkb?82>7 z9&CH^|9OatwR?3n+;(=6``AB$y# literal 0 HcmV?d00001 diff --git a/wai/wai-rs/src/bin/wai_cli/http_vectors.rs b/wai/wai-rs/src/bin/wai_cli/http_vectors.rs index 000c6713e..3e6da62aa 100644 --- a/wai/wai-rs/src/bin/wai_cli/http_vectors.rs +++ b/wai/wai-rs/src/bin/wai_cli/http_vectors.rs @@ -252,9 +252,29 @@ fn objects(dir: &Path) -> Result, &'static str)>, Str let mut hcm = RenditionMeta::new("wai.meta.hdr10plus", "hdr10plus").with_role("companion").with_id("h").with_sha256(sha(&hc)); hcm.companion_of = None; let onc = WaiMulti::from_parts( - wai::container::ManifestV2::new("video", "replicate", vec![RenditionMeta::new("wai.video.int_hyper", "int_hyper").with_id("b").with_sha256(sha(&bc)), hcm, rcm]), - vec![bc, hc, rc], + wai::container::ManifestV2::new("video", "replicate", vec![RenditionMeta::new("wai.video.int_hyper", "int_hyper").with_id("b").with_sha256(sha(&bc)), hcm.clone(), rcm.clone()]), + vec![bc.clone(), hc.clone(), rc.clone()], ).map_err(|e| e.to_string())?.to_bytes().map_err(|e| e.to_string())?; + // Its conforming twin: the companion bound to the base's capability. Every component + // conforms, so the refinement is offered and fetched on either path (§7 step 4). + let mut hcf = hcm.clone(); + hcf.companion_of = Some("wai.video.int_hyper".into()); + let ocf = WaiMulti::from_parts( + wai::container::ManifestV2::new("video", "replicate", vec![RenditionMeta::new("wai.video.int_hyper", "int_hyper").with_id("b").with_sha256(sha(&bc)), hcf, rcm.clone()]), + vec![bc.clone(), hc.clone(), rc.clone()], + ).map_err(|e| e.to_string())?.to_bytes().map_err(|e| e.to_string())?; + // A refinement whose `refines` is malformed — `base` alone — beside the base it names: + // the envelope does not conform for it, and §7 step 4 reports it dropped, since its + // `refines.base`, read on its own, is the pick's id. Its twin names `x`, no entry, and + // is no refinement of the pick at all. + let malformed = |base: &str| -> Result, String> { + let mut r = rcm.clone(); + r.refines = Some(json!({ "base": base })); + WaiMulti::from_parts( + wai::container::ManifestV2::new("video", "replicate", vec![RenditionMeta::new("wai.video.int_hyper", "int_hyper").with_id("b").with_sha256(sha(&bc)), r]), + vec![bc.clone(), rc.clone()], + ).map_err(|e| e.to_string())?.to_bytes().map_err(|e| e.to_string()) + }; Ok(vec![ ("O1", o1, "WAI1, pinned, below one chunk is not reached: the head proof covers it whole"), ("O2", o2, "WAI2 image: a pinned integer learned rendition, AVIF, JPEG XL and PNG of one picture"), @@ -285,6 +305,9 @@ fn objects(dir: &Path) -> Result, &'static str)>, Str ("OPw", with_refines(json!({ "base": o5_cid, "prev": o5_cid, "layer": 1 }))?, "WAI1 text with a well-formed refines: an ordinary object"), ("ORN", orn, "WAI2: an AV1 base and a refinement stating no sha256"), ("ONC", onc, "WAI2: a base, a companion bound to nothing, and a refinement with its sha256"), + ("OCF", ocf, "ONC with its companion bound to the base's capability: every component conforms"), + ("ONM", malformed("b")?, "WAI2: a base and a refinement whose refines is {\"base\": \"b\"}, the base's id and nothing else"), + ("ONX", malformed("x")?, "ONM with refines {\"base\": \"x\"}, naming no entry"), ]) } @@ -1055,6 +1078,15 @@ fn cases(objs: &BTreeMap>, extra: &mut BTreeMap> v.push(case(name, "fetch", json!({ "object": "ONC", "fragment": frag("ONC", Some(1009)), "advertises": ["wai.video.int_hyper"], "applies": ["wai.video.int_refine"], "threshold_permille": permille }))); } + // ONC's conforming twin offers its refinement on either path; a refinement whose + // malformed `refines` names the pick is dropped and reported, one naming no entry is no + // refinement of it (§7 step 4). + for id in ["OCF", "ONM", "ONX"] { + for (path, permille) in [("whole", 900), ("ranged", 1001)] { + v.push(case(format!("fetch_{id}_{path}"), "fetch", json!({ "object": id, "fragment": frag(id, Some(1009)), "advertises": ["wai.video.int_hyper"], + "applies": ["wai.video.int_refine"], "threshold_permille": permille }))); + } + } // Item 3: a refinement never moves its base. let os_frag = frag("OS", Some(1009)); let lcevc_sink = |extra: Value| -> Value { @@ -1300,6 +1332,23 @@ fn generate(dir: &Path) -> Result>, String> { return Err(format!("{name} does not drop the refinement of a nonconforming envelope: {f}")); } } + for (id, refinements, dropped) in [ + ("OCF", json!([2]), json!([])), + ("ONM", json!([]), json!([[1, "components_nonconforming"]])), + ("ONX", json!([]), json!([])), + ] { + for (path, why) in [("whole", json!("range_threshold")), ("ranged", Value::Null)] { + let name = format!("fetch_{id}_{path}"); + let f = outcome_of(&name)?; + if f["refinements"] != refinements || f["dropped"] != dropped || f["why_whole"] != why || f["pick"] != 0 { + return Err(format!("{name}: refinements {refinements} and dropped {dropped} expected: {f}")); + } + } + } + let f = outcome_of("fetch_OR_malformed_refines")?; + if f["dropped"] != json!([[1, "components_nonconforming"]]) || f["refinements"] != json!([]) { + return Err(format!("fetch_OR_malformed_refines does not report the refinement naming its pick: {f}")); + } for (k, b) in extra { if k.starts_with("cases/") { files.insert(k, b); diff --git a/wai/wai-rs/src/container.rs b/wai/wai-rs/src/container.rs index 108ac22d0..e493a1f4e 100644 --- a/wai/wai-rs/src/container.rs +++ b/wai/wai-rs/src/container.rs @@ -2844,6 +2844,21 @@ pub fn refinement_indices(entries: &[RenditionMeta], index: usize) -> Vec .collect() } +/// The refinement components whose `refines.base`, read on its own, is the `id` of the +/// entry at `index`, in table order: [`refinement_indices`] without the rest of +/// `refines` read. Where every component conforms (SPEC §7.1) the two agree, since each +/// refinement's `refines` is then well formed; where one does not, these are the +/// refinements a client planning from the head drops and reports +/// (`components_nonconforming`, http-delivery §7 step 4), a malformed `refines` that +/// names the pick among them. +pub fn refinements_naming(entries: &[RenditionMeta], index: usize) -> Vec { + let Some(base_id) = entries.get(index).and_then(|b| b.id.as_deref()) else { return Vec::new() }; + entries.iter().enumerate() + .filter(|(_, m)| m.is_refinement() && m.refines.as_ref().and_then(|v| v.get("base")).and_then(Value::as_str) == Some(base_id)) + .map(|(i, _)| i) + .collect() +} + /// Sniff the magic and return which envelope version is in this byte /// blob. Lets callers branch on `Wai::from_bytes` vs `WaiMulti::from_bytes` /// without parsing twice. diff --git a/wai/wai-rs/src/http_binding/session.rs b/wai/wai-rs/src/http_binding/session.rs index 32c852938..fd00472db 100644 --- a/wai/wai-rs/src/http_binding/session.rs +++ b/wai/wai-rs/src/http_binding/session.rs @@ -16,7 +16,7 @@ use super::head_proof::HeadProof; use super::plan::{plan_components, plan_head, rest_of, Class, FetchPolicy, Plan, WhyWhole}; use super::{ByteRange, Fragment, RangeRefusal}; use crate::container::{ - companion_indices, refinement_indices, select_entries, ManifestV2, PinRefusal, Prior, RenditionMeta, Skip, Wai, + companion_indices, refinements_naming, select_entries, ManifestV2, PinRefusal, Prior, RenditionMeta, Skip, Wai, WaiMulti, }; @@ -184,7 +184,11 @@ impl Selector { } /// The companions and refinements of entry `index` the sink applies, with their - /// classes: an enhancement layer or a refinement is a refinement (§10.1). + /// classes: an enhancement layer or a refinement is a refinement (§10.1). A + /// refinement is one whose `refines.base`, read on its own, is the entry's `id` + /// ([`refinements_naming`]): of a conforming envelope, exactly those whose `refines` is + /// well formed; of one that does not conform, each is dropped and reported (§7 step 4), + /// one whose `refines` is otherwise malformed included. fn applied(&self, m: &ManifestV2, index: usize) -> Vec<(usize, Class)> { let e = &m.renditions; let mut out: Vec<(usize, Class)> = companion_indices(e, index) @@ -192,7 +196,7 @@ impl Selector { .filter(|&i| (self.applies)(&e[i])) .map(|i| (i, if crate::codecs::is_enhancement_layer(&e[i].capability) { Class::Refinement } else { Class::Base })) .collect(); - out.extend(refinement_indices(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); + out.extend(refinements_naming(e, index).into_iter().filter(|&i| (self.applies)(&e[i])).map(|i| (i, Class::Refinement))); out } } -- 2.54.0 (Apple Git-157) From 0077d74c6c94ccadd78b37c9feb91f03a59b3a47 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 05:23:56 -0400 Subject: [PATCH 20/21] wai: state the ranged-WAI2 classical length as a limitation of this revision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jwp-receipts §2.4.12 (classical_declared and rule 9), the CHANGELOG and the claim-conformance README (the envelopes context and the sweep table's SPEC §6.4 row, the one that cites rule 9): this revision derives the classical length from the WAI2 envelopes held in full; a sink that received a WAI2 only as byte ranges holds its head, not the envelope, and cannot yet state its classical rendition. Recording such a session is HTTP session work still to come. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 6 +++++- wai/claim-conformance/README.md | 6 ++++-- wai/extensions/jwp-receipts.md | 7 +++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index 003d9defe..112c348c5 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -131,7 +131,11 @@ wire format may change and such changes are recorded here. decode now seals its session. `verify_measure` seals two such sessions in wasm32 — over `counting/wai2-classical.wai`, whose second rendition is PNG, and its encrypted twin, both new in the counting set — checks the length against the rendition table, and the - native and Python verifiers give the same verdicts. + native and Python verifiers give the same verdicts. A limitation of this revision: the + length comes from the `WAI2` envelopes held in full, so a sink that received a `WAI2` + only as byte ranges, holding its head but not the envelope, cannot yet state that + envelope's classical rendition (§2.4.12, `classical_declared` and rule 9). Recording + such a session is HTTP session work still to come. - **A record or a derivation is no component in any role** (SPEC §7.1, *Component identity*; `record-or-derivation-as-component`). - **A record or a derivation is no companion** (SPEC §7.1, rule 1). A companion's diff --git a/wai/claim-conformance/README.md b/wai/claim-conformance/README.md index 05032b7f0..31933c47a 100644 --- a/wai/claim-conformance/README.md +++ b/wai/claim-conformance/README.md @@ -43,7 +43,9 @@ hex, inert bytes included; an object's `counted` is checked against its envelope counted bytes, a decoder entry naming one as its `object` is checked against it, a held layer's against what a sink can apply and its `first_unit` against its base's entry's, a presentation through such an entry against the layer count and the units it gives, and -the classical rendition is read from each readable `WAI2` envelope by §2.4.12's rule) and +the classical rendition is read from each held `WAI2` envelope, readable or encrypted, by +§2.4.12's rule 9 — envelopes held in full: a `WAI2` a sink received only as byte ranges is +not among them, and a session cannot yet state its classical rendition) and `stage_claims` (the wire forms of the `stage` claims it names). An `object` context may also carry the class its leaf is labelled with (jwp-receipts §2.2), in energy-measurement §2.7's JSON @@ -320,7 +322,7 @@ with neither is a hole; there is none. | SPEC §4 | a capability that is not dispatchable never taken; a `WAI1` whose capability is companion-only inert, its fallback never taken | rule 4 | `session_wai1_fallback_not_dispatchable`, `session_wai1_companion_only_capability` | | SPEC §4 step 5 | the fallback decodes the same payload | rule 8 reads the units in the payload's own format | `session_unit_fallback_past_the_title`, `session_unit_fallback_format_past_the_title`, `session_unit_fallback_format_audio`; accepted: `session_unit_fallback_accept`, `session_unit_fallback_format_accept` | | SPEC §3.1, §4 | a pin that does not resolve, a module not held, a key log's revocation | the signer's statement, which a decoder entry's `pin` and `tier` state | — | -| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3), its manifest and rendition table in the clear | rule 3 admits an entry naming it; rules 4–9 read its manifest and table as any held envelope's, a `sha256` that is not well formed included, and what needs a payload — whether a payload matches a well-formed `sha256`, a base's units, a layer's `WIR1` payload — is the signer's statement | `session_envelope_encrypted`, `session_envelope_encrypted_layer_accept`, `session_envelope_encrypted_sha256_unmatched_accept`; refused: `session_envelope_encrypted_sha256_uppercase`, `session_envelope_encrypted_sha256_63_digits`, `session_envelope_encrypted_sha256_not_hex` (each `_exploded` too), `session_envelope_encrypted_classical_unstated`, `session_envelope_encrypted_rendition_out_of_range`, `session_envelope_encrypted_relabelled`, `session_envelope_encrypted_no_rendition`, `session_envelope_encrypted_base_layers`, `session_envelope_encrypted_companion_only`, `session_envelope_encrypted_roles` | +| SPEC §6.4 | an encrypted envelope is inert at a sink without its key; one holding the key decrypts and dispatches it (step 3), its manifest and rendition table in the clear | rule 3 admits an entry naming it; rules 4–9 read its manifest and table as any held envelope's, a `sha256` that is not well formed included, and what needs a payload — whether a payload matches a well-formed `sha256`, a base's units, a layer's `WIR1` payload — is the signer's statement. Rule 9 reads the classical length from `WAI2` envelopes held in full: of one a sink received only as byte ranges it holds the head and not the envelope, and this revision cannot yet state that envelope's classical rendition (a limitation; recording such a session is HTTP session work still to come) | `session_envelope_encrypted`, `session_envelope_encrypted_layer_accept`, `session_envelope_encrypted_sha256_unmatched_accept`; refused: `session_envelope_encrypted_sha256_uppercase`, `session_envelope_encrypted_sha256_63_digits`, `session_envelope_encrypted_sha256_not_hex` (each `_exploded` too), `session_envelope_encrypted_classical_unstated`, `session_envelope_encrypted_rendition_out_of_range`, `session_envelope_encrypted_relabelled`, `session_envelope_encrypted_no_rendition`, `session_envelope_encrypted_base_layers`, `session_envelope_encrypted_companion_only`, `session_envelope_encrypted_roles` | | SPEC §5 | a refinement-only capability is never a `capability` or `fallback` a sink dispatches, a selectable rendition or a companion | rules 4 and 5 | `session_layer_with_fallback`, `session_wai2_refines_on_a_rendition` | | SPEC §7.1, *Selection algorithm* | a companion, or a capability that is not dispatchable, is never picked | rule 4 | `session_wai2_entry_names_a_companion` | | SPEC §7.1, *Component identity* | `component_digest_mismatch`: a rendition whose payload does not match its `sha256` is skipped, a refinement is not offered | rule 4 | `session_wai2_rendition_digest_mismatch`, `session_wai2_refinement_digest_mismatch` | diff --git a/wai/extensions/jwp-receipts.md b/wai/extensions/jwp-receipts.md index e289cf8ed..7a114fa2f 100644 --- a/wai/extensions/jwp-receipts.md +++ b/wai/extensions/jwp-receipts.md @@ -970,7 +970,7 @@ from its `stage` claim. Step 6 checks the two against each other. | `uncounted` | integer | The objects received that are not countable (staged-measurement §3, *Only a checked format is counted*). Their bytes are in no counted member. | | `transferred` | integer | Bytes of WAI objects as received, whole or as byte ranges, without transport or receipts. | | `receipt_bytes` | integer | Bytes of receipts and claims received (staged-measurement §3.5). | -| `classical_declared` | integer or `null` | The sum, over the `WAI2` envelopes the session received whose classical rendition (below) is of a capability no decoder entry decoded, of that rendition's length as the envelope's rendition table declares it (SPEC §7.1). `null` where there is none. Never estimated. | +| `classical_declared` | integer or `null` | The sum, over the `WAI2` envelopes the session received whose classical rendition (below) is of a capability no decoder entry decoded, of that rendition's length as the envelope's rendition table declares it (SPEC §7.1). `null` where there is none. Never estimated. This revision derives it from the `WAI2` envelopes the sink holds in full, the ones rule 9 reads: a sink that received a `WAI2` envelope only as byte ranges holds its head but not the envelope, and cannot yet state that envelope's classical rendition. Recording such a session is HTTP session work still to come. | | `classical_source` | term or `null` | Where `classical_declared` comes from: `wai2-table`, or a term a later extension registers here. | | `energy` | object or `null` | `null` when the decode was unmetered. Otherwise `{ "joules_micro", "energy_provenance", "energy_uncertainty", "energy_counter_filtering", "energy_calibration_ref" }`, each written as §2.4.5 writes it (below). | @@ -1200,7 +1200,10 @@ the others need the envelopes and the claim. In order: 9. The lengths of the held `WAI2` envelopes' classical renditions whose capability no decoder entry decoded — encrypted or not, since the rendition table declares them in the clear — sum to `classical_declared`, which is `null` exactly when there is none - (`session_classical_mismatch`). + (`session_classical_mismatch`). In this revision a held envelope is one held in full: + of a `WAI2` envelope a sink received only as byte ranges it holds the head and not the + envelope, so the session cannot yet state that envelope's classical rendition, nor this + rule read it. Recording such a session is HTTP session work still to come. **Against the stage claims** (§3.1 step 6). The context is the wire form of each `stage` claim the verifier holds of those `stage_sets` names. A set has a claim for each of its -- 2.54.0 (Apple Git-157) From d13d58463cfc465c1db8d8975b44b7da68044a68 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 8 Oct 2026 07:42:21 -0400 Subject: [PATCH 21/21] ci: wai-web's native test count is 24, with the WAI2 classical-length test Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-web-wasm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wai-web-wasm.yml b/.github/workflows/wai-web-wasm.yml index 2854fd532..3f7c8ee7e 100644 --- a/.github/workflows/wai-web-wasm.yml +++ b/.github/workflows/wai-web-wasm.yml @@ -139,7 +139,7 @@ jobs: run: | set -euo pipefail cargo test --locked --lib 2>&1 | tee "$RUNNER_TEMP/wai-web-native.log" - grep -q "test result: ok. 23 passed; 0 failed" "$RUNNER_TEMP/wai-web-native.log" + grep -q "test result: ok. 24 passed; 0 failed" "$RUNNER_TEMP/wai-web-native.log" - name: wasm32 int_synth decode equals the frozen native corpus shell: bash working-directory: wai/wai-web -- 2.54.0 (Apple Git-157)