All checks were successful
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 38s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 34s
wai-app and Create / wai-app · does this change touch it (push) Successful in 33s
wai-audit collector and player integration / does this change touch it (push) Successful in 21s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 30s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 2m3s
wai-quantum for JavaScript / does this change touch it (push) Successful in 33s
wai-quantum studio and desktop / does this change touch it (push) Successful in 37s
WAI operation catalogue / does this change touch it (push) Successful in 1m31s
wai-fleet service / does this change touch it (push) Successful in 1m23s
wai-ledger service / does this change touch it (push) Successful in 1m6s
wai-sink-android native sink library / does this change touch it (push) Successful in 49s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 1m18s
wai-sink-swift native sink package / does this change touch it (push) Successful in 49s
WAI Studio / does this change touch it (push) Successful in 1m16s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 2m13s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 3m11s
wai-audit collector and player integration / collector · linux (push) Successful in 2m43s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 2m33s
wai-ledger service / service · linux (push) Successful in 2m56s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m54s
wai-quantum for JavaScript / javascript · linux (push) Successful in 3m55s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 1m8s
wai-quantum studio and desktop / studio · browser (push) Successful in 4m57s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 6m58s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 5m6s
wai-fleet service / service · linux (push) Successful in 3m28s
wai-ledger service / service · macos (push) Successful in 1m7s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 3m44s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 7m38s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 9m55s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 8m36s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 5m22s
wai-fleet service / service · macos (push) Successful in 35s
WAI Studio / Studio in WebKit · linux (push) Successful in 12m20s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 17m53s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 19m20s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 18m38s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 11m20s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 10m2s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 14m27s
WAI's receipt ledger had no source for storage that is not a package:
a stream's DVR window, whose objects change with every segment admitted
and evicted, and a clip cut from it and kept. waiTransport meters both
(wai-additions §38) and cannot bill them. Version 8 is that source.
- A snapshot, WLS1: what one stored set lists at one instant, signed by
its holder when the listing changes: its objects, their bytes, and the
digest of its listing (each object by SHA-256 and length).
- A storage record, WLH1: the bytes the set held over an interval, in
byte-seconds, naming its snapshots by digest.
- The rule: the snapshots cover the interval (the first at its start,
each after the one before, none at or past its end), and the record's
byte-seconds are floor(sum bytes x (next instant - instant) / 10^6).
Any other figure is storage_mismatch; snapshots that do not cover it,
outside_interval; snapshots not the record's, snapshot_mismatch; a
record or snapshot breaking its rules, storage_invalid.
- A tariff of version 8 adds `storage` (per 10^9 byte-days) and a holder
in its scope (kind 9). One line per holder in byte_days, rounded down
once per line, citing records (kind 26) and snapshots (kind 27), each
billed once in a chain. A record lies in the period that holds its
interval: overlapping records of one set on one invoice are
record_overlap, and one reaching into a billed period outside_period.
Report §8.4 states each set's byte-seconds. Versions 1 to 7 unchanged.
Why snapshots: the ledger's evidence model bills a figure of a record its
party signed, recomputed by the verifier and placed in time by the time
the record states. Snapshots are signed as the listing changes and bind
bytes to objects by content hash; the record is a pure function of them.
A package's byte-days stay billed from the chain, since its bytes do not
change while it is kept.
Gates (Framework, [email protected], Rust 1.99.1):
- cargo test --release --no-default-features --features receipt_ledger,
revenue_share,opportunity_report,impression_aggregate: lib
receipt_ledger:: 23 of 23 (5 new), --test receipt_ledger 15 of 15 (2
new: version 8's figures and refusals, a changed copy of a storage day
refused), --test revenue_share 7 of 7, --test opportunity_report 6 of
6, lib codecs::registry 15 of 15; wai-ledger 11 of 11 (one new: the two
storage days issued byte for byte, a set's time held once).
- wai_receipt_ledger_vectors verify: regenerates byte for byte, every
vector its outcome.
- receipt_ledger_verify.py (python3.14 -I): every vector agrees with
wai-rs; 352 mutated copies fail; each of its 88 checks dropped is
caught (12 new for version 8). Both read the same vectors.json.
- Planted faults, each alone, 10 plants of the 5 faults: caught by the
Rust tests 10 of 10 and by the Python verifier 10 of 10.
- wai registry export --check, wai ops export --check: up to date.
- wai breaking --against b3f0aeb4e: no unacknowledged break (8
acknowledged in the change note).
- clippy -D warnings on wai-ledger: clean; the new wai-rs code clippy
clean.
- changelog-assemble --check, check-changelog-fragment, check-tests-in-
ci, wai-conformance-lists check, check-workflow-concurrency.sh,
check-comparative-prose.sh, check-public-names.sh
--maintainer-products-only, check-wai-quantum-names, check-wai-
section-refs, check-spec-refs, check-orphan-sources.py: pass.
Not built: waiTransport's side (it still meters and does not bill).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
39 lines
3 KiB
Shell
39 lines
3 KiB
Shell
# step: receipt ledger · wai-rs and receipt_ledger_verify.py
|
|
# order: 400
|
|
# features: receipt_ledger
|
|
# paths: wai/extensions/receipt-ledger.md
|
|
# independent: receipt-ledger live needs=cryptography python3 -I live-conformance/receipt_ledger_verify.py live-conformance/ledger
|
|
#
|
|
# wai.delivery.ledger (extensions/receipt-ledger.md): the reference module's unit tests and
|
|
# tests/receipt_ledger.rs (vectors.json regenerates byte for byte from its fixed seeds and
|
|
# from the sources it takes from the metering, settlement, ads, presentation, stitched and
|
|
# routes corpora and the packs of pack-conformance, and no other file is there; wai-rs gives every vector its
|
|
# stated outcome; every reason of §10 and every reused code refuses a vector, and so does
|
|
# each source kind's own extension; §10 lists exactly the reference's codes; under a tariff
|
|
# of version 3, jobs priced per operation and a chain that bills a job's work once, its
|
|
# output's receipt cited again by a re-run, with version 2 billing as before; under a tariff of
|
|
# version 8, a holder's storage billed by byte-days from records whose byte-seconds its snapshots
|
|
# recompute, two days of it remade byte for byte, and each planted fault refused: byte-seconds over
|
|
# what the snapshots support, an interval overlapping the set's previous record, a snapshot after
|
|
# the interval, a unit mismatch and a signature over other bytes); and, in the step of every
|
|
# independent verifier above, the corpus's second implementation, receipt_ledger_verify.py, written from the
|
|
# extension's text and sharing no code with wai-rs, which verifies each source with that corpus's own
|
|
# second implementation (live_metering_verify.py, settlement_verify.py, live_ads_verify.py
|
|
# with ad_presentation_verify.py, stitched_presentation_verify.py, pack_verify.py, and for a
|
|
# media job route_record_verify.py and _int_motion_receipt.py, and reads a holder's snapshots and
|
|
# storage records itself) and
|
|
# reports a stitched stream's statement as that verifier gives it, checks signatures with
|
|
# WAI's strict Ed25519 rule, recomputes every line, citation, energy row and report,
|
|
# requires every mutated copy of the corpus to fail, and drops each of its own checks in turn and requires
|
|
# the corpus to catch the weakened verifier; run isolated (-I), with the `cryptography` package
|
|
# installed above for the OER/2 reference verifier that checks a job's hop receipts.
|
|
#
|
|
# The paths this step brings to the workflow's trigger, and why:
|
|
# wai/extensions/receipt-ledger.md: tests/receipt_ledger.rs requires this extension's §10 to list
|
|
# the codes the reference reports, receipt_ledger_verify.py reads that table, and the registry's
|
|
# wire identifiers test reads its sections. Its corpus is generated from the metering,
|
|
# settlement, ads, presentation and stitched corpora and the packs of pack-conformance, all
|
|
# under the paths above.
|
|
set -euo pipefail
|
|
(cd wai-rs && cargo test --no-default-features --features "$WAI_FEATURES" --lib receipt_ledger::)
|
|
(cd wai-rs && cargo test --no-default-features --features "$WAI_FEATURES" --test receipt_ledger)
|