open-standards/wai/live-conformance/timeliness/README.md
Transaction Science e253ac952a
Some checks failed
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 17s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 17s
wai-app and Create / wai-app · does this change touch it (push) Successful in 29s
WAI operation catalogue / does this change touch it (push) Successful in 28s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 37s
wai-fleet service / does this change touch it (push) Successful in 29s
wai-audit collector and player integration / does this change touch it (push) Successful in 41s
wai-quantum for JavaScript / does this change touch it (push) Successful in 21s
wai-ledger service / does this change touch it (push) Successful in 23s
wai-key-proxy / does this change touch it (push) Successful in 35s
wai-quantum studio and desktop / does this change touch it (push) Successful in 15s
wai-sink-android native sink library / does this change touch it (push) Successful in 16s
wai-sink-swift native sink package / does this change touch it (push) Successful in 14s
WAI Studio / does this change touch it (push) Successful in 14s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
WAI operation catalogue / the catalogue and every door · linux (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-room room service / joule-moq-room, every target (push) Has been cancelled
joule-moq-web browser client / joule-moq-web · 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
wai-fleet service / service · linux (push) Has been cancelled
wai-fleet service / service · macos (push) Has been cancelled
wai-quantum studio and desktop / desktop app · windows (push) Successful in 9m21s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 1m30s
wai-ledger service / service · macos (push) Successful in 1m0s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 4m24s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 7m3s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 9m34s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 14m21s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 6s
wai-audit collector and player integration / collector · linux (push) Successful in 2m6s
wai-key-proxy / proxy · linux (push) Successful in 2m9s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m53s
wai-ledger service / service · linux (push) Successful in 3m14s
wai-quantum for JavaScript / javascript · linux (push) Successful in 3m26s
wai-quantum studio and desktop / studio · browser (push) Successful in 6m12s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 8m52s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 4m49s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 5m3s
WAI Studio / Studio in WebKit · linux (push) Successful in 12m24s
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: a statement or wanted object of the wrong shape is refused for it
A statement in symbols that is not an object, with a bearer_id that is not a
string, or with a malformed group or index is now symbols_invalid, at plan
level and as run check 7, where the reader used to return an error. Section
7.1 states the rule for group and index: 64 lowercase hexadecimal digits, and
an integer from 0 to 2^53 - 1.

A new reason, wanted_invalid, is the last of section 7.1's checks. It refuses
a wanted that is not a list, an entry that is not an object, a malformed group
and an index that is not an integer in that range. A run raises it at check 2.
One object wanted twice stays plans_invalid, and an entry section 7.1 refuses
names no object, so two of them alike are wanted_invalid. No case in any corpus
changes. A position past 2^53 - 1, which no case carries and which read as
deadline_not_stated, is now refused.

Both readers derive these outcomes from the JSON, and the generator writes the
forms the typed inputs cannot hold over a built case's JSON. Existing cases are
byte-identical.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 18:09:39 -05:00

88 lines
7.1 KiB
Markdown

# live-conformance/timeliness — when an object is of use, and whether it was held in time
The corpus of [`extensions/timeliness.md`](../../extensions/timeliness.md) §10, in one file,
`vectors.json`.
**Provenance.** Generated here by `wai_timeliness_vectors gen` (`wai-rs`, feature `timeliness`),
from Ed25519 keys on fixed 32-byte seeds, constant instants, and envelopes whose payloads are
opaque test bytes written by the generator; no media and no input from outside this repository.
`keys` names every key by its role, as 64 lowercase hexadecimal digits: the publisher's
(`did:web:publisher.example#d1`), another of its origin's (`publisher_other`,
`did:web:publisher.example#d2`), and three holders' (`holder_a`, `holder_b`, `holder_c`).
`groups` names the link hash of each group the cases use, all the publisher's, all starting at
2026-11-03T00:00:00.500Z: **G**, three bases and a layer of `wai.image.int_refine` (object 3);
**F**, a floor of each of G's objects, its manifest's `derived_from.motif` the content hash of G's
object at the same position; **F_other**, F with object 2's floor derived from G's object 1; and
**H**, two objects, the second a `WAI2`; and **E**, another floor of each of G's objects, derived
as F's are, the ladder's higher rung. G's entries, used throughout, have `from_ms`
1,793,664,000,000 (2026-11-03T00:00:00Z) and `by_ms` a minute later: entry 0 falls to 600,000 two
seconds after its deadline and to 0 ten seconds after, with F's object 0 at 400,000 as its
fallback; entry 1 is a hard deadline with no fallback; entry 2 holds 700,000 from one to five
seconds after, and 0 a second later, with F's object 2 at 1,000,000. The ladder cases and the runs
give entry 0 the ladder E's object 0 at 700,000, then F's object 0 at 400,000.
- `claims` (§4.1, §4.2; jwp-receipts §3.1 steps 1 to 4) are each a claim's wire form, `claim`,
and its `outcome`: `accept`, or `reject step=N reason=R`.
- `values` (§5) are each an `entry` read alone and an instant `at_ms`; `outcome` gives the entry's
`value_ppm` at that instant and its `end_ms` (§5.2). No value case's entry has a fallback.
- `verdicts` (§6) are each the `groups` given, in order, each its `group` receipt and its
`objects`, a `receipt` and its `envelope` in hexadecimal or `null`; the `claims`, in order; the
holdings `records` in hexadecimal; and a `statement` offered (§6.4), `{group, index, holder}`, or
`null`. `outcome` is `refuse reason=R` when a group fails jwp-receipts §3 steps 1 and 2, and
otherwise gives: `objects`, each group's object verdicts (`delivered-verified`,
`inclusion-verified`, `reject reason=…`); `claims` (`accepted`, or `reject step=N reason=R`);
`records` (`stands`, `set-aside reason=holdings_contradicted`, `reject reason=…`); `intents`,
in the order of the groups given and then of `leaf_index`, each with its `group`, `leaf_index`,
`intent` (`stands`, or `set-aside reason=timeliness_contradicted`), `end_ms` (`null` for one set
aside) and `lines`, in increasing order of the holder's key bytes, each its `holder`, `held_ms`
(*p*), `fallback_ms` (*f*: one instant or `null`, and for a fallback written as an array the list
of each rung's, in the ladder's order), `outcome` and `value_ppm`; and `statement`,
`{outcome, value_ppm}`, `reject reason=deadline_not_stated`, or `null`.
- `plans` (§7) are each a verdict's `groups`, `claims` (timeliness, transmission and schedule) and
`records`; `loss_ppm` and `overhead`, both integers or both `null`; `at_ms`, an instant or the
string `from_ms`; the `sources` in the asker's order, each exactly `{kind: "bearer", bearer_id}`,
`{kind: "holder", holder, fetch_ms}` or `{kind: "origin", fetch_ms}`; the `wanted` objects, each
`{group, index}`; and, in a plan that states what its asker holds, `symbols`, each
`{bearer_id, group, index, held}`, `held` one number for each source block. `outcome` is `refuse reason=R`, or gives `claims` (`accepted`,
`declared`, `stands`, `extended`, `set-aside reason=…`, `reject step=N reason=R`), `records` as a verdict's,
and `choices`, one for each wanted object: `{outcome, object, rung, source, arrival_ms,
value_ppm}`, with `object` `primary`, `fallback` or `null`, `rung` the rung's index in the ladder
or `null` unless `object` is `fallback`, and `source` an index into `sources` or `null`, or
`reject reason=deadline_not_stated`.
- `runs` (§7.5) are each a plan's `groups`, `claims`, `records`, `loss_ppm` and `overhead`, shared
by the run; its `plans`, each `{at_ms, sources, wanted}` as a plan case writes them; and the
sink's `arrivals`, each `{group, index, at_ms}`, the trace of what it first held and when. A run
that states when the sink first held its groups, claims or records also has `groups_at_ms`,
`claims_at_ms` or `records_at_ms`, a list with one entry for each, an instant or `null`, or
`receipts_at_ms`, a list for each group with one such entry for each of its object receipts. A run
that states what the sink held of objects on bearer instances also has `symbols`, each
`{bearer_id, group, index, at_ms, held}`, in the order of its clock. A case meant to be refused for
its form writes that form: an instant, a number or a position as a string or a fraction, a hash as
anything but 64 lowercase hexadecimal digits, a list or an entry as an integer or `null`, or a member
left out.
`outcome` is `refuse reason=R`, or gives `plans`, each plan's `choices` as above, in a run that
states instants of its groups, object receipts, claims or records `read`, each plan's
`{claims, records}` labels with `not-held` for what it did not read, and `decisions`
in the order taken, each `{at_ms, plan, action, group, index, object, rung, source, value_ppm}`:
`action` is `fetch`, `abandon`, `present`, `passed` or `ended`, and a member that does not apply
is `null`.
The plans' schedules are G's objects 0 to 2 on `urn:example:bearer:b1` and F's objects on `b1` and
on `urn:example:bearer:b3`, each declared `unidirectional`: RaptorQ, one source block of eight
symbols of 128 octets and two repair symbols a pass, `advance`, ten passes of a second every ten
seconds from 2026-11-03T00:00:00Z. At the plans' loss bound of 500,000 and overhead of 2 a receiver
gets 5 symbols a pass and needs 12, so it holds an object at the end of its third pass. The cases
that state symbols hold F's object 0 on `b2` under a schedule of four passes, so from
2026-11-03T00:00:16Z two passes are left, too few from nothing and enough from what they state.
`urn:example:bearer:b2` is declared `bidirectional`.
Everything is synthetic: keys attest nothing, the publisher's origin is a reserved example domain,
and bearer instances use the example URN namespace. Each case states the outcome it was written to
have, declared in the generator, never copied from a verifier.
`wai_timeliness_vectors verify` and `tests/timeliness.rs` check that the file regenerates byte for
byte and that `wai-rs` reaches every stated outcome, the runs' through `timeliness::scheduler`.
`../timeliness_verify.py` is the second implementation, written from the extension's text, which
also mutates copies of the corpus and drops each of its own checks in turn and requires each to be
caught.