open-standards/wai/live-conformance/ledger/README.md
Transaction Science 823c35b202
Some checks failed
joule-moq-http live HTTP egress / joule-moq-http · does this change touch it (push) Successful in 23s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 19s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 13s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 21s
wai-app and Create / wai-app · does this change touch it (push) Successful in 17s
wai-audit collector and player integration / does this change touch it (push) Successful in 38s
WAI operation catalogue / does this change touch it (push) Successful in 1m6s
wai-fleet service / does this change touch it (push) Successful in 42s
wai-pack / wai-pack · does this change touch it (push) Successful in 26s
wai-quantum for JavaScript / does this change touch it (push) Successful in 24s
wai-quantum studio and desktop / does this change touch it (push) Successful in 27s
wai-sink-android native sink library / does this change touch it (push) Successful in 14s
wai-sink-swift native sink package / does this change touch it (push) Successful in 16s
WAI Studio / does this change touch it (push) Successful in 56s
wai-ledger service / does this change touch it (push) Successful in 2m28s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Has been cancelled
WAI Studio / Studio in Chromium and Firefox · macos (push) Has been cancelled
WAI Studio / Studio in WebKit · linux (push) Has been cancelled
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Has been cancelled
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Has been cancelled
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Has been cancelled
wai-quantum studio and desktop / studio · browser (push) Has been cancelled
wai-quantum studio and desktop / desktop app · macos (push) Has been cancelled
wai-quantum studio and desktop / desktop app · linux (push) Has been cancelled
wai-quantum studio and desktop / desktop app · windows (push) Has been cancelled
wai-quantum for JavaScript / javascript · linux (push) Has been cancelled
wai-pack / wai-pack · linux (push) Has been cancelled
wai-pack / wai-pack · linux-arm64 (push) Has been cancelled
wai-pack / wai-pack · macos (push) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (push) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (push) Has been cancelled
wai-pack / wai-pack · dependency licences (push) Has been cancelled
wai-ledger service / service · linux (push) Has been cancelled
wai-ledger service / service · macos (push) Has been cancelled
wai-fleet service / service · linux (push) Has been cancelled
wai-fleet service / service · macos (push) Has been cancelled
WAI examples / WAI examples · does this change touch them (push) Has been cancelled
WAI examples / WAI examples · portable · linux (push) Has been cancelled
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (push) Has been cancelled
WAI examples / WAI examples · android-app · linux-arm64 (push) Has been cancelled
WAI operation catalogue / the catalogue and every door · linux (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Has been cancelled
wai-audit collector and player integration / collector · linux (push) Has been cancelled
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Has been cancelled
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Has been cancelled
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Has been cancelled
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (push) Has been cancelled
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Has been cancelled
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Has been cancelled
joule-moq-http live HTTP egress / joule-moq-http, every target (push) Has been cancelled
Tariff version 9: a tariff that follows another, its chain continuing across a scope changed
receipt-ledger §4.14 (new), §4.1, §4.3, §6.1, §6.8, §6.9, §7.2 step 4, §7.3, §9, §10, §11,
§12. A tariff of version 9 states `follows`, after `storage`: zero, or the digest of the tariff
whose chain it continues; both parties sign it with the rest of the body. Everything version 8
bills, version 9 bills as it does, and an invoice of version 9 is version 8's layout. A tariff
that follows another continues that tariff's chain: its first invoice names in `prev` the last
invoice of the chain it follows, and every rule that reads the invoice before reads that one,
across the two tariffs: a package it lists is held and billed its byte-days (§4.7), a record it
lists that is billed once is billed never again (record_rebilled, §6.9), and its period ends
where the next begins (invoice_overlap). §7.2 step 4 accepts a previous invoice of the
invoice's tariff or of the one it follows (tariff_mismatch otherwise) and refuses an invoice of
a following tariff that names none before it, chain_restarted (new, §10). An accepted invoice
of a following tariff states the tariff it follows. So a key made or retired, a packager or a
holder added, is a tariff the buyer signs that keeps the chain, its held storage and its
billed-once history; a retired key's records bill nothing under the tariff that retires it.
Versions 1 to 8 read, verify and bill exactly as before.

Reference: receipt_ledger VERSION_9, may_follow, Tariff::follows and Tariff::followed,
continues, Reason::ChainRestarted; make_invoice refuses a following tariff's invoice with no
previous and a previous of a tariff not followed. The reference ledger (wai/wai-ledger, §9)
accepts a following tariff when it holds the tariff followed, of its buyer, followed by no
other, with an invoice; closes it (a source or an invoice under it is tariff_mismatch); and
takes over its chain: its last invoice, its billed records, and every source its next invoice
would bill, verified again under the following tariff, a held package whose packager the new
scope drops left behind, and any other source refused or billing less (outside_scope) refusing
the following tariff at that source. It rebuilds each chain after the one it continues on start,
and its test issues the corpus's three invoices byte for byte across a restart.

Corpus live-conformance/ledger/: one buyer's chain across three tariffs of version 9, a stitcher
key made then another retired, the package the first day lists billed its byte-days under each
tariff after, beside the new key's interstitials (a new source, stitched_interstitial, from the
stitched corpus's hls_interstitial); the same scope under a tariff that follows none, billing no
storage; controls for chain_restarted, a previous invoice of a tariff not followed
(tariff_mismatch), an overlap across the tariffs (invoice_overlap), a record billed again across
them (record_rebilled), a retired key's records billed (quantity_not_recorded), and an invoice
of version 8 under a tariff of version 9; the control of an undefined invoice version moves from
9 to 10. It regenerates byte for byte on x86_64 (Framework) and aarch64 (Thor); wai-rs, the
service and the Python second implementation each remake the chain's three invoices byte for
byte.

Second implementation receipt_ledger_verify.py mirrors the rule (a tariff's follows, step 4's
previous of the tariff followed, chain_restarted, the follows an outcome states): all 321
vectors agree; the month, the two days of storage and the chain across three tariffs, 10
invoices, are written again byte for byte; every reason of §10 refuses a vector (24 listed); 389
of 389 mutated copies fail (five new: the invoice before not given, another tariff stated
followed, none stated followed, another chain's invoice given as the one before, the held
package's storage left out); 90 of 90 weakened verifiers are caught (two new checks: a restarted
chain, a previous invoice of a tariff not followed).

Planted faults, each caught by tests/receipt_ledger.rs: an invoice of a following tariff
naming none accepted; any tariff's invoice taken as the one before; the tariff followed not
read in step 4; follows left out of the signed body; a held package read only under one
tariff; the billed records of another tariff's invoice not read; the tariff followed not
stated; version 10 read as defined.

Decision D62: a following tariff that both parties sign, not an amendment of a scope; fail
closed on a restarted chain; what it does not do (a stitched record's time). Breaks
acknowledged in the change note.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-12 02:17:18 -05:00

232 lines
19 KiB
Markdown

# live-conformance/ledger — the receipt ledger
The corpus of [`extensions/receipt-ledger.md`](../../extensions/receipt-ledger.md) §11, in one
file, `vectors.json`:
- `sources`: the sources the vectors bill from, by name, each a source document of §5.1;
- `vectors`: verification documents (§7.1), each a `tariff`, an `invoice`, the `previous`
invoice or `null`, and the names of its `sources` in order, with the `outcome` §7.3 gives it;
- `keys`: the seller's, the buyers', the two delivering parties', the broadcaster's, the cache
node's, the agent's, the collector's and the holder's public keys.
**Ledger equivalence.** For each vector, a conforming verifier given its tariff, its invoice, its
previous invoice and its sources, resolved by name, reaches the outcome the vector states:
- `refuse`: the `reason` and where, `at`: `["tariff"]`, `["tariff", "seller"]` or `["tariff",
"buyer"]`, `["invoice"]`, `["previous"]`, `["source", k]` for source `k`, or `["source", k, …]`
followed by the place the source's own extension gives (live-metering §5.1, settlement §8.2,
packaging §9, live-ads §9.2), for a group (§4.10) `["source", k, "group"]`, `["source", k,
"objects", i]`, `["source", k, "parent"]` or `["source", k, "claims", i]`, for a cache source also
`["source", k, "declarations", i]`, and for an aggregated source (§4.11) `["source", k, "receipt"]`,
`["source", k, "task"]`, `["source", k, "leader"]` or `["source", k, "result"]`, and for a
storage source (§4.13) `["source", k, "record"]`, `["source", k, "snapshots"]` or `["source", k,
"snapshots", i]`;
- `accept`: the invoice's `digest`, its `tariff`, `currency`, `start` and `end`, the number of
`records`, each line (its source kind, source, unit, quantity, price, amount and the records it
`cites`, each `[kind, identity]`), each energy row (scope, class, figures, joules and
`max_ppm`), the `unmetered` figures and `coverage` of each scope, the `amount`, and the
`reports` of §8: `ads`, one per ads source, and `delivery`, the parties and their overlaps; in
versions 7 to 9, `transmission`, one per group or cache source; in versions 8 and 9, `storage`,
one per storage source (§8.4); and, under a tariff that follows another (§4.14), `follows`, the
digest of the tariff it follows.
The accepted vectors:
- `a_day`: one day's invoice over a lesson room, two delivering parties (one viewer acknowledges
part of one object from both, in windows that overlap; one party serves a fetch free; the other
declares delivery to viewers with no key), a viewer that forwarded sealed objects and states no
tariff of its own, a package, ads under a policy that requires presentation claims and under one
that does not;
- `the_next_invoice`: the next invoice of the chain, over a relay's session whose hop is
unmetered (its room energy is partial) and a second package;
- `room_hops_of_three_classes`: a room whose hops are a model, a counter and an estimate, under a
tariff of its own: one row each;
- `streams_stitched_by_others`: presentations of ads another party stitched, from three vectors
of [`stitched/`](../stitched/) (`hls_stitched`; `form1_prefetch`, whose form-1 receipt states
its own quartiles and spend beside the presented ones; and `squeezeback`, a shared break whose
sessions' own claims are not all presented), under a tariff whose ad scope is the stitchers
that corpus accepts; its report is stitched-presentation §7.5's statement, unchanged;
- `jobs_routed_and_served` (version 2, §4.5): a month of media jobs routed by the route corpus's
router, beside a package, under a tariff of version 2 that prices `wai.video.int_motion` per job
and per subpixel and `wai.video.av1` per job: the served `int_motion` jobs are billed from their
billed hop and their output's decode receipt (`work_pixel_ops`); the failover is billed at the
fallback's price; the job served past its deadline and the one every allowed hop failed bill
nothing; the jobs' energy is the serving hops' figures, a counter row and a model row, and the
job whose serving hop was unmetered is counted unmetered (coverage partial);
- `jobs_priced_per_operation` (version 3, §4.6): the same jobs under a tariff of version 3, which
prices each job by its serving capability and its operation, with a decode of
`wai.video.int_motion` beside the encodes: the encodes and the decode are billed per job and per
subpixel at their own prices, and the failover at the fallback's encode price;
- `a_rerun_billed` (version 3, §6.9): the next invoice of that chain bills `job-0001` run again
two days later, a new route record and a new hop receipt, its output the decode receipt the first
invoice already lists: the work is billed once, and the output is the evidence, cited again;
- `one_output_under_two_hops` (version 3): `job-0001` and its re-run in one invoice: both billed,
the output receipt they share cited once and its subpixels billed for each hop;
- `an_operation_the_tariff_does_not_price` (version 3): a tariff that prices `int_motion`'s encode
and not its decode: the decode bills nothing, and its hop's energy is stated;
- `version_2_routes_under_version_3` (version 3, §5.1): jobs routed under the route record's
version 2, its price book pricing each operation apart with measured failures and each served
hop stating its outputs: an encode, a failover whose failed hop was metered, billed at the
endpoint that served, a decode, a hop past the deadline and three that failed, which bill
nothing, and a failover whose failed hop's figure states no class, which version 3 does not
read; each output receipt is of the clip its hop states it delivered;
- `version_4_by_the_byte_and_the_work` (version 4, §4.7): the lesson room's receipt of version 2
([`metering/`](../metering/)'s `bytes_out_priced`) billed by its bytes out beside its time, a
package listed, no storage yet, and the run of `package.build` that made it (`package_run`)
billed per run and per work unit of the package, its receipt cited, and those jobs at their own
prices, with every hop's energy: the billed hops' in `jobs`, the failed and late hops' in
`unbilled_hops`, one of them unmetered;
- `version_4_storage_held_through_a_period` (version 4): the next invoice of that chain bills the
package the first holds for the byte-days of its own period, and the same package made again by
a new run (`package_run_again`), its work billed again and its receipt cited again, beside a
second package listed;
- `version_5_a_decode_held_to_its_frames` (version 5, §4.8): an `int_motion` decode
(`job_v5_decode`) whose served hop states it delivered one animated PNG of the clip's frames,
its receipt re-derived from the codestream it read and each frame's samples hashing to the
receipt's frame, billed at the decode's prices beside an encode held to its codestream as in
version 4. The animation is written here by `png_still::encode_animation` from the clip the
decode reads, and each refused animation is that one with one rule broken, its chunks
rewritten with good CRCs.
- `route_record_3_outputs_proved_among_what_was_delivered` (route-record §3.4, §6.1; §5.1
here): jobs routed here under the route record's version 3, whose served hops state what they
delivered by its count and root, each output giving its inclusion proof: an encode
(`job_v3r_encode`) whose clip is the second of two objects, a decode of version 5
(`job_v3r_decode`) whose animation is its one object, and a package's run
(`package_run_v3r`) whose receipt is the first of 1,501 objects, the rest standing for the
package's own; billed under the tariff of version 5.
- `version_6_a_third_partys_usage_per_endpoint` (version 6, §4.9): a third party's jobs, each
`third_party` record naming what the provider bills, billed per job and by that usage at its
endpoint's price: gen.alpha (`job_tp_alpha`), gen.beta (`job_tp_beta`), a failover whose failed
hop's billed usage reaches no line (`job_tp_failover`), a job given no record, billed by the job
alone (`job_tp_unrecorded`), one in another unit at that unit's price (`job_tp_images`), and one
in a unit no price names (`job_tp_a_unit_no_price_names`).
- `version_6_holds_what_version_5_holds`: the encode, decode and package run of version 5's route
records of version 3, at prices of any endpoint.
- `version_6_an_upscale_and_a_tone_mapping`: an upscale of two pictures (`job_upscale`) and two tone
mappings, one of whose records states two pictures of one rendering
(`job_tonemap_two_pictures_of_one_rendering`), each re-derived from what it read; and
`version_6_an_upscale_run_again`, the next invoice, billing the upscale's new hop and citing its
records again.
- `version_6_re_derived_jobs_under_a_list`: an upscale and a tone mapping whose route records are of
version 2, so that no output gives a proof.
- `version_7_week_1` to `version_7_week_4` (version 7, §4.10): a month of a broadcaster's
transmissions, four invoices chained a week apart over October 2026, under a tariff that prices
multicast octets at two ceilings and pass time at one, and broadcast octets at one ceiling and
pass time at two. Week 1 (`group_week_1`): a group of four objects simulcast on a broadcast and
a multicast instance, its envelopes held, each entry billed at the price of its class whose
ceiling is the least at or above its pass rate, each declaration's energy in its class's row.
Week 2: a faster broadcast (`group_week_2`), one entry above the ceiling of the class's octets,
which bills its pass time alone, and the first week's group sent again on a new instance
(`group_week_1_again`), its group receipt listed again. Week 3 (`group_week_3`): a multicast
entry above every ceiling of its class, billing nothing and reported with no price, and a
declaration with no figure. Week 4 (`group_week_4`): a broadcast and a relay chain declared and
scheduled nowhere, which bills nothing. Each week's group names the claim of the broadcaster's
chain its first claim follows (`parent`).
- `version_7_week_5` (version 7, §4.10 to §4.12): the invoice after the month, in the first week of
November. A broadcast whose schedule a later one extends (`group_week_5`), billed in the last
schedule's passes alone; a node's own multicast instance of that group (`cache_week_5`), its plan
naming three objects and its claim saying it sent two, with its settlement declaration; the counts
of the flight's two receipts (`aggregated_r0`, `aggregated_r12`), each from the impressions corpus,
on one line of the collector's; and an agent's two chained consumption claims
(`consumption_week_5`) of three objects and two.
- `version_7_one_group_on_two_instances` (§5.2): `group_week_1` and `group_week_1_again` on one
invoice of the two weeks, two sources of one group, its receipt the head of neither.
- `version_7_two_groups_on_one_service` (§5.2): `group_week_5` and `group_1_on_the_service_of_group_5`,
two groups on one broadcast service, an instance of a group being that group's.
- `version_7_aggregated_its_batch_is_the_period` (§5.3): `aggregated_r0` in the hour its batch fills,
from its first instant to the end of its last.
- `version_7_aggregated_of_statements_of_version_1` (§4.11): `aggregated_r0_of_version_1`, whose
statements state no rejected count, its count billed as any other.
- `version_7_a_node_s_unsent_entry_past_the_period` (§5.3): a node's plan with an entry past the
period that its claim does not say it sent, billing what the claim says it sent.
- `version_8_storage_day_1` (version 8, §4.13): a day of a holder's storage, 16 October 2026, under a
tariff that prices storage at the corpus's package price per 10^9 byte-days. A stream's window
(`storage_window_day_1`), empty at 00:00 and listing three segments from 06:00, five from a
microsecond after 12:00 and four from 18:00, two evicted and one admitted, its byte-seconds rounded
down; and a clip cut at 13:00 (`storage_clip_day_1`), three segments' copies and its playlist. One
line of the holder's byte-days, citing both records and their five snapshots.
- `version_8_storage_day_2`: the next day of the chain, each set's record from a snapshot at the
day's start (`storage_window_day_2`, `storage_clip_day_2`), the window's listing changing at 08:00
and the clip's record ending at its deletion at 05:00.
- `version_8_storage_at_a_price_of_0`: the first day under a storage price of 0, a line whose amount
is 0.
- `version_8_storage_under_a_byte_day`: a thumbnail of 100 bytes kept ten seconds
(`storage_a_moment`), 1,000 byte-seconds: no line, its record and snapshot listed.
- `version_8_bills_what_version_7_bills`: the window's first day beside `consumption_week_5` and
`aggregated_r0`, over one period to the end of the week after the month, each billed as version 7
bills it.
- `version_9_first_day` (version 9, §4.14): the first day of one buyer's chain, under a tariff
that follows none and names the packager and signer 1: signer 1's stitched stream
(`stitched_hls`) billed, and the package `package_base` first listed, which bills no storage.
- `version_9_a_key_made`: the next day, under a tariff that follows the first and adds signer 2's
key: its first invoice names the first day's, so the package that invoice lists is held and its
byte-days billed, beside signer 2's interstitials (`stitched_interstitial`).
- `version_9_a_key_retired`: the day after, under a tariff that follows the second and retires
signer 1's key: the package held through a third tariff's period, its byte-days billed again.
- `version_9_a_tariff_following_none`: the second day's scope under a tariff that follows none, a
chain of its own: the package first listed again, billing no storage, as a new tariff's chain
did before version 9.
Every other vector is refused, a control of one defect: each reason of §10, the reused codes, and a
refusal of each source kind by its own extension. Among them, one instance given twice over: one
node's schedule in two sources (`cache_twice_first`, `cache_twice_one_schedule`), one instance of a
node's or a publisher's in two sources sharing no claim (`cache_twice_one_instance`,
`group_twice_first`, `group_twice_one_instance`), and a node naming a publisher's or another node's
instance (`cache_of_the_publishers_instance`, `cache_of_another_nodes_instance`). And for version 8
(`storage_*`), the faults §4.13 refuses, each planted alone in the first day's records: byte-seconds
over what the snapshots support (`storage_window_over_its_snapshots`); a record overlapping the
window's day in one invoice (`storage_window_overlapping`) and one reaching back into the day before
(`storage_window_from_the_day_before`); a snapshot after the interval, a first one after its start
and two out of order; a clip's bytes stated as its byte-seconds; and signatures over other bytes, a
snapshot's raised after it was signed, a record's, and a snapshot signed under a record's domain.
For version 9 (`version_9_*`): a following tariff's invoice naming none before it
(`chain_restarted`), one naming an invoice of a tariff it does not follow (`tariff_mismatch`), one
beginning before the invoice it follows ends (`invoice_overlap`), signer 1's stream billed again
across the tariffs (`record_rebilled`), and a retired key's records billed under the tariff that
retires it (`quantity_not_recorded`); `invoice_version` is an invoice of version 10.
**Provenance.** Generated here: `wai_receipt_ledger_vectors gen` writes `vectors.json` from fixed
seeds (the seller, the buyers, the two delivering parties, their viewers and objects) and from
sources taken unchanged from the corpora of the extensions the ledger reads: rooms and their
receipts from [`metering/`](../metering/) (`lesson`, `mixed_classes`, `receipt_bad_signature`,
`relay_recorded`, `bytes_out_priced`), the forwarding viewer's statement and the room its hop records name from
[`settlement/`](../settlement/), ad rooms from [`ads/`](../ads/) (`live_break`, `gap`) and
[`presentation/`](../presentation/) (`video_rule`, `ceiling_exceeded_by_presented`), streams
stitched by others from [`stitched/`](../stitched/) (`hls_stitched`, `form1_prefetch`,
`squeezeback`, `hls_interstitial`, with the
manifests, responses and receipts they name, by their bytes), media jobs from
[`routes/`](../routes/) (`served_first_try`, `failover_after_a_server_error`,
`served_after_the_deadline`, `served_by_an_unmetered_hop`, `every_allowed_survivor_failed`,
`served_by_a_hop_whose_figure_states_no_class`, `a_failed_hop_billed`,
`an_unknown_energy_ranks_last`), each `int_motion` job's output a decode receipt sealed here over
`wai-rs/tests/vectors/int_video/int_video_bitstream.wiv1`; the version-3 jobs (`job_decode`,
`job_rerun`, `job_rerun_replays_its_hop`, `job_claims_another_hop`) routed here by that corpus's
router under its price book and policy, their hop receipts sealed under its hop key, the replayed
and the claimed one being `served_first_try`'s own; the jobs of version 2 (`job_v2_*`) routed
here by that router under the route corpus's price book of version 2, and the runs of
`package.build` (`package_run*`) under a price book of version 2 of its own; the third party's
jobs (`job_tp_*`), the upscales (`job_upscale*`) and the tone mappings (`job_tonemap*`) routed here by
that router, the upscales derived under the prior `generic.wsr` of
[`live-conformance/upscale/priors/`](../upscale/priors/) and the tone mappings' envelopes written
by exact-tonemap's corpus encoder; the broadcaster's groups (`group_*`), their envelopes, receipts,
declarations and carousel schedules, the cache node's instance (`cache_*`) and the agent's claims
(`consumption_*`), and the holder's snapshots and storage records (`storage_*`), their segments'
content hashes and lengths derived from fixed labels, written here from fixed seeds; the aggregate receipts (`aggregated_*`) of
[`live-conformance/impressions/`](../impressions/), the controls that change one's task or leader's
statement signed again from a fixed seed; and the
packages `video-base-01` and `video-staged-01` of
[`pack-conformance/packs/`](../../pack-conformance/packs/). When one of those corpora is
regenerated, so is this one. Nothing here was fetched from outside the repository.
Regenerate and check:
cd wai/wai-rs
cargo run -q --release --no-default-features --features receipt_ledger --bin wai_receipt_ledger_vectors -- gen ../live-conformance/ledger
cargo run -q --release --no-default-features --features receipt_ledger --bin wai_receipt_ledger_vectors -- verify ../live-conformance/ledger
cargo test -q --no-default-features --features receipt_ledger --test receipt_ledger
python3 -I ../live-conformance/receipt_ledger_verify.py ../live-conformance/ledger
The second implementation, `receipt_ledger_verify.py`, shares no code with `wai-rs`. It verifies
each source with the second implementation of that source's own corpus, recomputes every line,
citation, row and report, requires every mutated copy of the corpus to fail, and requires the corpus
to catch it with each of its own checks dropped.