All checks were successful
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 27s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 27s
wai-app and Create / wai-app · does this change touch it (push) Successful in 30s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 48s
wai-ledger service / does this change touch it (push) Successful in 25s
wai-quantum for JavaScript / does this change touch it (push) Successful in 26s
wai-audit collector and player integration / does this change touch it (push) Successful in 45s
wai-key-proxy / does this change touch it (push) Successful in 44s
wai-quantum studio and desktop / does this change touch it (push) Successful in 53s
WAI operation catalogue / does this change touch it (push) Successful in 1m2s
wai-fleet service / does this change touch it (push) Successful in 1m1s
WAI Studio / does this change touch it (push) Successful in 35s
wai-sink-android native sink library / does this change touch it (push) Successful in 48s
wai-sink-swift native sink package / does this change touch it (push) Successful in 36s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 2m0s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 14s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 14s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 35s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 4m15s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 50s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 6m10s
wai-ledger service / service · linux (push) Successful in 2m42s
wai-ledger service / service · macos (push) Successful in 1m11s
wai-key-proxy / proxy · linux (push) Successful in 1m3s
wai-quantum for JavaScript / javascript · linux (push) Successful in 4m0s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 7m36s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m14s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 2m6s
wai-audit collector and player integration / collector · linux (push) Successful in 5m18s
wai-fleet service / service · linux (push) Successful in 2m24s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 10m8s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 2m3s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 6m45s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 8m6s
wai-quantum studio and desktop / studio · browser (push) Successful in 7m35s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 5m4s
wai-fleet service / service · macos (push) Successful in 45s
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Successful in 12m29s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 16m4s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 9m18s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 10m18s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 9m50s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 15m22s
WAI Studio / Studio in WebKit · linux (push) Successful in 13m34s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 7m17s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 14m15s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 10m40s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 7m5s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 15m44s
ad-presentation §14 and stitched-presentation §12: a verifier applies six invalid-traffic rules to the impressions it states, each a comparison of signed bytes or integers with no score or model: one impression presented twice, a span past its creative or a media time in two claims, a claim with no attestation where the terms require one, more sessions under one device key than the policy's cap, an address in a pinned list of ranges, and a user agent holding a token of a pinned list of declared crawlers. New records: the traffic policy (WTP1), the session origin an edge signs (WSO1), the device binding a device key and the session key sign (WDB1), and the two lists pinned by digest with their source (WAL1, WUL1). Each impression is valid, invalid with every rule and the records it rests on, or undecided where a turned-on rule had no record; invalid impressions that counted are excluded and counted, undecided ones withheld, and the valid spend is what remains (by currency for a stream). No claim's verdict or record changes. live_ads::traffic and stitched_presentation::traffic read a finished verification; live_ads::verify and stitched_presentation::verify are unchanged. Corpus live-conformance/ad-traffic/ (wai_ad_traffic_vectors), tests/ad_traffic.rs, and the second implementation ad_traffic_verify.py; a verifier with any one rule off is caught by the vectors in both. Decision D5 records what is and is not a rule here. Co-Authored-By: Claude <[email protected]>
64 lines
4.3 KiB
Markdown
64 lines
4.3 KiB
Markdown
# live-conformance/ad-traffic — invalid-traffic rules
|
|
|
|
The corpus of [`extensions/ad-presentation.md`](../../extensions/ad-presentation.md) §14 and
|
|
[`extensions/stitched-presentation.md`](../../extensions/stitched-presentation.md) §12: the
|
|
rules a verifier applies to the impressions it states, each decided from signed records by
|
|
comparing bytes and integers.
|
|
|
|
- `rooms.json` holds `rooms`, each a room the ad-presentation verifier accepts, in the form of
|
|
[`../presentation/README.md`](../presentation/README.md) with everything that verifier
|
|
states; and `vectors`, each naming its `room`.
|
|
- `stitched.json` holds one `stream`: the `manifests` (their text), `records` and `claims` the
|
|
stitched verifier is given, with the `record_facts`, `claim_facts` and `spend` it states
|
|
([`../stitched/README.md`](../stitched/README.md)); and `vectors` over it.
|
|
|
|
Both hold the `creatives`, `issuers` (and `signers`) their verifiers hold; `lists`, the two
|
|
pinned lists with their bytes, digests, sources and entries as text; and `keys`, the public
|
|
keys of the corpus's edges, attesters, devices and session keys, for a reader. Every address is
|
|
a documentation address and every crawler token names a crawler that does not exist.
|
|
|
|
**A vector** gives a verifier, beside its room or the stream: `traffic_policy` (`WTP1`, or
|
|
`null` for none), `origins` (`WSO1`), `bindings` (`WDB1`) and `lists` (the lists it holds),
|
|
each hexadecimal. `origin_about` and `binding_about` say what each record is, and are not
|
|
checked. Its `traffic` is what a conforming verifier states (ad-presentation §14.7):
|
|
|
|
- `outcome` `refuse` with its `reason`, when the policy does not read, verify or bind, or a
|
|
list is not held or does not read; otherwise `accept`, and:
|
|
- `policy`, its digest or `null`; `origin_facts` and `binding_facts`, each record's `digest`
|
|
and `player` (`null` when it does not read) and its `verdict`, `accepted` or a reason;
|
|
`devices`, each device key with its `sessions` and the indices of the `bindings` that give
|
|
them, in ascending order of the key;
|
|
- `impressions`, each with where it is (`receipt` and `slot`; in `stitched.json` `record`,
|
|
`slot` and its own `claim`), its `price_micros`, whether the base verification `counts` it,
|
|
its `traffic` verdict (`valid`, `invalid`, `undecided`), the `rules` that refuse it, each
|
|
with its `code` and what it rests on (`claims`, `origin` and `binding` by index among those
|
|
given, `entry` by index in its list, `device` and `sessions`), and its `undecided` marks;
|
|
- `rules`, for each rule its `impressions`, and of those the ones that counted, `excluded`,
|
|
with `excluded_micros`; `undecided`, for each mark its `impressions`, `withheld` and
|
|
`withheld_micros`;
|
|
- `totals`: `impressions`, `counted`, `valid`, `invalid`, `undecided`, `excluded`, `withheld`,
|
|
and `presented_spend_micros`, `excluded_micros`, `withheld_micros` and `valid_spend_micros`;
|
|
and each receipt's or record's valid spend (`receipt_valid_spend_micros`,
|
|
`record_valid_spend_micros`).
|
|
|
|
A sum of prices is a number in `rooms.json` and an object by currency in `stitched.json`. In
|
|
every vector the presented spend is the excluded, the withheld and the valid spend together,
|
|
and every impression is in exactly one of valid, invalid and undecided: an impression a rule
|
|
refuses is counted as excluded, never left out.
|
|
|
|
A verifier that states anything else of a vector does not conform. One that leaves out a rule
|
|
states another `traffic` for some vector: without the duplicate rule, session 42's second
|
|
claim of one impression passes in `room_no_policy`, and the vector refuses that verifier.
|
|
|
|
```
|
|
cd wai-rs && cargo run --features stitched_presentation --bin wai_ad_traffic_vectors -- verify ../live-conformance/ad-traffic
|
|
python3 -I live-conformance/ad_traffic_verify.py live-conformance/ad-traffic
|
|
```
|
|
|
|
The first is the reference: it regenerates both files from their fixed seeds and requires them
|
|
byte for byte, gives every vector its statement, and turns each rule off in turn.
|
|
`wai_ad_traffic_vectors gen` writes the files. The second is the second implementation,
|
|
written from the extensions' text and sharing no code with `wai-rs`: it verifies the rooms
|
|
and the stream with the ad-presentation and stitched corpora's second implementations, judges
|
|
every vector itself, mutates copies of the corpus and requires each to fail, and drops each
|
|
rule and each of its checks in turn.
|