wai-pack: staged packages — refinement layers, stills, a piece's ladder, live windows and simulated delivery (W4-4) #199

Merged
dcharlot merged 27 commits from wai/w4-4-staged-packages into main 2026-10-11 16:58:55 -04:00
Owner

Staged packages in wai-pack: refinement layers, stills, a ladder chosen per piece, live windows written as they seal, and simulated delivery. Every new byte is re-derived by the independent verifier.

Packaging.

  • Refinement layers (packaging §5.4). For each refinement rung, the packer writes a wai.video.int_refine object over the piece's int_motion base, using the shared refinement encoder. The reference sink applies each layer before it is kept. The index records each prefix's tier, digest, SSE and deadline.
  • A piece's ladder and stills (§5.7).
    • A rule's ladder chooses a piece's rungs. §3.4 item 10 now requires one base, refinements only over rungs the ladder names, and every floor.
    • A wai.image.png base is a still. It is written as a PNG whose every byte is stated (Sub filter, one fixed-Huffman block with its matches stated), so an independent implementation writes the same file.
    • Both readers follow PNG's chunk rules, and agree on a corpus of 18 accepted and refused files.
  • Catalogs (§8.3, §8.4).
    • The MoQ catalog is a moq-streaming-format §4.1 stage set: a receipts track and alias per media track, and depends on every layer below. priority and wai_layer are gone.
    • Over HTTP, a still's piece plays from the floor, because variants cannot mix bases that share no capability (http-delivery §4.2).
  • A repeated object over HTTP (http-delivery §4.2). It contributes once, with its layers. pack_verify.py runs the HTTP verifier's union, floor and adjacency checks over every golden playlist.

Live and delivery.

  • Live windows (§9.2). wai-pack live packs a stream from standard input in windows sealed by version-2 receipts chained live-window. It writes each object when it is published and each window when it is sealed, as whole files, and keeps no object's bytes once written. The result is the on-demand package, byte for byte. A source that fails mid-stream keeps every sealed window and exits 1, saying what it kept.
  • Simulated delivery (§8.9). wai-pack sim runs the staged-measurement simulator over what a live packer publishes, with per-track timeouts, §8.5's priorities, a subscriber's layer cap and group receipts. The simulator gains a refinement's own timeout. There is now one stall bound, stall_bound_for, and wai-web prints the same bound as the native tool.
  • Bounded verification. A verifier refuses a piece longer than the policy's max_ms before decoding it, and hashes a held still without repeating its frame.

Corpus and checks.

  • New: the golden video-staged-01, staged-mutations/, delivery/, stills/ and live/ (the golden packed live in windows, with its chain checked).
  • Differentials:
    • stage_diff.py: refinement layers, and stills wide enough to use every deflate distance code;
    • sim_diff.py: per-object timeouts, in CI.
  • staged_resources now counts allocations per thread, so a test harness's own allocation can no longer fail it.

Checked locally on macOS arm64:

  • the link gate;
  • wai-pack's tests in release, clippy and cargo deny;
  • pack_verify.py (891 checks);
  • every pack, stage and simulator differential;
  • the staged, http, staged-measure and claim corpora through both implementations;
  • the public-text, section-reference and workflow checks.

The forge CI runs on this pull request.

🤖 Generated with Claude Code

Staged packages in wai-pack: refinement layers, stills, a ladder chosen per piece, live windows written as they seal, and simulated delivery. Every new byte is re-derived by the independent verifier. **Packaging.** - **Refinement layers** (packaging §5.4). For each refinement rung, the packer writes a `wai.video.int_refine` object over the piece's `int_motion` base, using the shared refinement encoder. The reference sink applies each layer before it is kept. The index records each prefix's tier, digest, SSE and deadline. - **A piece's ladder and stills** (§5.7). - A rule's ladder chooses a piece's rungs. §3.4 item 10 now requires one base, refinements only over rungs the ladder names, and every floor. - A `wai.image.png` base is a still. It is written as a PNG whose every byte is stated (`Sub` filter, one fixed-Huffman block with its matches stated), so an independent implementation writes the same file. - Both readers follow PNG's chunk rules, and agree on a corpus of 18 accepted and refused files. - **Catalogs** (§8.3, §8.4). - The MoQ catalog is a moq-streaming-format §4.1 stage set: a receipts track and alias per media track, and `depends` on every layer below. `priority` and `wai_layer` are gone. - Over HTTP, a still's piece plays from the floor, because variants cannot mix bases that share no capability (http-delivery §4.2). - **A repeated object over HTTP** (http-delivery §4.2). It contributes once, with its layers. `pack_verify.py` runs the HTTP verifier's union, floor and adjacency checks over every golden playlist. **Live and delivery.** - **Live windows** (§9.2). `wai-pack live` packs a stream from standard input in windows sealed by version-2 receipts chained `live-window`. It writes each object when it is published and each window when it is sealed, as whole files, and keeps no object's bytes once written. The result is the on-demand package, byte for byte. A source that fails mid-stream keeps every sealed window and exits 1, saying what it kept. - **Simulated delivery** (§8.9). `wai-pack sim` runs the staged-measurement simulator over what a live packer publishes, with per-track timeouts, §8.5's priorities, a subscriber's layer cap and group receipts. The simulator gains a refinement's own timeout. There is now one stall bound, `stall_bound_for`, and wai-web prints the same bound as the native tool. - **Bounded verification.** A verifier refuses a piece longer than the policy's `max_ms` before decoding it, and hashes a held still without repeating its frame. **Corpus and checks.** - New: the golden `video-staged-01`, `staged-mutations/`, `delivery/`, `stills/` and `live/` (the golden packed live in windows, with its chain checked). - Differentials: - `stage_diff.py`: refinement layers, and stills wide enough to use every deflate distance code; - `sim_diff.py`: per-object timeouts, in CI. - `staged_resources` now counts allocations per thread, so a test harness's own allocation can no longer fail it. **Checked locally on macOS arm64:** - the link gate; - wai-pack's tests in release, clippy and `cargo deny`; - `pack_verify.py` (891 checks); - every pack, stage and simulator differential; - the staged, http, staged-measure and claim corpora through both implementations; - the public-text, section-reference and workflow checks. The forge CI runs on this pull request. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
A MoQ track sets one DELIVERY_TIMEOUT for every object on it, and a packager
gives each refinement layer and deadline its own track (packaging §8.6), so
one refinement timeout per plan cannot model a package's delivery.

- stage_measure::sim: a model object may carry `timeout_us`, a refinement's
  own timeout in place of the plan's for its layer; a base carrying one is not
  a well-formed model. `timeout_us` is written only where an object has one,
  so every existing model reads and writes back unchanged.
- §10.4's bound under fifo takes T as the longest timeout a refinement takes,
  its own or the plan's (`stall_bound_for`); `stall_bound` keeps its meaning
  for a model with none, and `check_stall` uses the model's.
- staged-measurement §10.4 and Appendix B state both; the corpus adds the
  `per-track` model and three cases (a fifo plan with no plan timeout is
  bounded by the objects' own); sim_verify.py follows, independently.
- Tests: a hand-computed case, and the bound over targeted draws whose
  refinements carry timeouts of their own.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The packer writes refinement layers, chooses each piece's representation by
its ladder, packs live, and simulates delivery over MoQ; the corpus gains a
staged golden that the independent verifier re-derives byte for byte.

- Refinements (packaging §5.4): for each refinement rung of a piece's ladder,
  a wai.video.int_refine object over the int_motion base, written by wai-rs's
  refinement encoder (staged::wir1::encode) with the manifest `wai stage
  refine` writes; every layer applied to the decoded base by the reference
  sink before it is kept. The index states each prefix's tier, digest, SSE
  and deadline.
- A piece's ladder and stills (§5.7, plan::piece_ladder): a rule's
  then.ladder, or the component's first base rung, its refinement chain and
  its floors. §3.4 item 10 now requires a rule's ladder to name exactly one
  base, every refinement over a rung it names and every floor. A
  wai.image.png base is a still, the piece's first frame held for the piece,
  written as a PNG whose every byte is stated (png.rs; the verifier's reader
  inflates with miniz_oxide, the one new dependency).
- One coder (pack::Coder) for the on-demand and the live packer; the
  verifier holds each piece to its ladder and its plan's deadline, and
  decodes every prefix (a still held, each layer through the sink).
- Catalogs: the MoQ catalog is a stage set of moq-streaming-format §4.1,
  written by staged::moq (wai_staged, a receipts track and an alias per
  media track, depends on a track of every layer below); `priority` (MOQT's,
  §8.5) and `wai_layer` leave it, and the registry drops `wai_layer`. HTTP
  views carry the component's default base capability only: a still's piece
  plays from the floor there (http-delivery §4.2), and its stage view and
  MoQ tracks list it.
- Live (§9.2, live.rs, `wai-pack live`): frames pushed one at a time, pieces
  coded as the segmenter closes them, windows sealed by version-2 receipts
  chained live-window; its plan, bases and refinements are the on-demand
  package's byte for byte (`wai-pack listing --primary`).
- Delivery (§8.9, delivery.rs, `wai-pack sim`): a thin consumer of
  stage_measure::sim — per-track timeouts, §8.5's priorities, the
  subscriber's cap, group receipts on each track's chain; delivered objects
  accepted by Merkle proof, dropped ones held by inclusion only.
- Corpus: the golden video-staged-01 (fixture, policy, supplied floor and
  supplied_floor.py, which states how it was written), staged-mutations/,
  delivery/; video-base-01 keeps its objects, index and receipt (its MoQ
  catalog and LISTING change).
- pack_verify.py re-derives every layer and still from the source (its own
  rANS coder and deflate), decodes every prefix (staged_verify.py's WIR1 and
  PNG readers), checks the MoQ catalog with staged_verify.py's §4.1 check,
  renders every catalog, and re-derives each delivery case through
  sim_verify.py's simulator. stage_diff.py runs layers, stills, piece plans
  and deliveries differentially.
- Tests 5, 7, 12 and 13 over the staged golden (tests/staged.rs).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
- wai-pack.yml: the push filter lists the staged-delivery and
  staged-measurement verifiers pack_verify.py now imports; the test-count
  floor covers tests/staged.rs and the library's new tests; stage_diff.py
  runs against the debug and the release build; the media job reads both
  goldens' floors.
- CHANGELOG: the staged packages, the MoQ stage set, live windows, simulated
  delivery and the simulator's per-object timeout.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web's simulated() printed the plan-only bound while wai_stage_measure prints
the model's, so a per-track case (refinements with timeouts of their own) gave
35000 against the corpus's 65000 and measure::tests failed.

- wai-web: `stall_bound_for(model, &p)`.
- stage_measure::sim: the plan-only bound is gone from the API; §10.4's bound
  is `stall_bound_for(model, plan)` alone, its documentation the full rule.
  The simulator's tests keep a plan-only helper over `bound_with`.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The counters were process-wide, so libtest's main thread, which allocates a
594-byte message when a test passes 60 seconds, landed in the parse window on
a loaded host: 1,310,720 + 594 = 1,311,314 bytes against 1,310,721 declared.

- The allocator keeps per-thread counts (`thread_local!` `const` `Cell`s, no
  destructor, reached with `try_with`) of bytes allocated, allocations, bytes
  live (signed: a thread may free what another allocated) and their peak, and
  every window reads the measuring thread's.
- A new check: a megabyte another thread allocates inside a window does not
  count, and one this thread allocates does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
http_verify.py joined a layer only to the first occurrence of its base, so the
staged golden's tv playlist, which lists the bumper's base twice, gave a floor
without +video.int_refine while wai-rs, which reads each object once, gave it
with: the two implementations of http-delivery §4.2 disagreed.

- http-delivery §4.2: an object a sequence lists more than once is one object
  of it, described once with every layer it has, and a layer joins every object
  of the sequence that is its base.
- wai-rs (`codecs::described`) and http_verify.py both: each object once, each
  layer joined to every object that is its base.
- http-conformance: two vectors, a base listed twice with its layer beside the
  first and beside the second occurrence; the union and floor keep the layer.
- pack_verify.py runs http_verify.py's adjacency, union and floor over every
  golden's class playlists and MPDs, so CI sees a disagreement; wai-pack.yml's
  push filter lists http_verify.py.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The verifier built a still's prefix as the frame repeated for the piece's
duration (`vec![rgb; n]`), so a package stating a long duration made it
allocate in proportion to that number.

- verify.rs: a still's prefix digest is its frame's digest fed n times
  (`pack::held_digest`); no frame is repeated in memory.
- §4.4 bounds every piece by max_ms; the verifier holds an index to it first
  of every per-piece rule, so nothing is decoded for a piece past it
  (index-policy-mismatch). pack_verify.py does the same, and hashes a held
  still once.
- staged-mutations: the last piece, and the still as the last piece of a cut
  package, each lasting 2^32 − 1 frames with their rules, moments and class
  plan what that span gives, are refused, not aborted.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
§5.7 says a still is any PNG of 8-bit RGB without interlace, and the two
readers disagreed on what that admits. Rust refused a suggested palette, which
an RGB picture may carry; Python accepted an interlace, bytes after IEND and a
short row. Both now read by PNG's chunk rules: IHDR first; an optional PLTE
before the image data; consecutive IDATs; ancillary chunks read past; unknown
critical chunks refused; IEND last and empty; a whole zlib stream with a window
of at most 32 KiB, its Adler-32 checked and nothing after it; exact rows.

Rust now inflates with miniz_oxide's core decompressor, so it sees how much
input the stream used. It refuses bytes after the stream, which it used to
read past whenever their last four bytes were the checksum. It also refuses
the window PNG forbids, which a non-wrapping buffer would otherwise let
through.

pack-conformance/stills/ holds the files both readers give one verdict on.
wai-pack's conformance check and pack_verify.py check each file against its
verdict and, when it is read, the SHA-256 of its samples.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
`wai-pack live` used to gather every object and window in memory and write
them all after the end of the stream. It now writes:

- each object when it is published;
- each window's index, then its receipt, when the window is sealed;
- the plan file and LISTING at the end.

Each file is written to a hidden temporary file beside it, then renamed into
place.

If the source fails mid-stream (a short frame or a frame of another size):

- every sealed window and the objects it lists are kept;
- the objects only unsealed pieces published are removed;
- no plan file and no LISTING are written;
- it exits 1, naming what it kept.

Once an object is written, its bytes are no longer held. A coded piece's stages
now carry their entry lengths (`pack::Lens`), so window_index builds an entry
without the envelope. The live packer moves each envelope into its publication.
The packer hands out sealed windows with `take_sealed()` and keeps none. With
--window 0, the packer still holds every piece's entry fields until the end of
the stream. The module doc, the CLI help and packaging §9.2 now say exactly what
is held.

wai::pin::listing_from_sha256 builds the listing from per-file digests (the
same lines as listing_from), so LISTING needs no file's bytes.

Tests:

- A CLI test feeds the stream through a pipe and checks that windows 0 and 1
  and their objects are on disk while the stream is still open.
- A second CLI test checks that a stream cut inside a frame keeps window 0 and
  its objects and nothing else.
- A unit test checks that no open piece holds an envelope.
- A wai-rs test checks that the listing from digests equals the listing from
  bytes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The corpus had no live windows, so pack_verify.py never read a live-window
receipt, a non-zero `prev_index_digest` or a `first_entry` past zero.

live/ holds the staged golden's source packed live with its key, in windows of
two pieces: each window's index and receipt, and expected.json with each
window's place in the chain, index digest and receipt hash.

pack_verify.py reads each window with its own index reader and §6.3 rules, and
verifies the receipt (§9.1, strict Ed25519). It then checks the chain:

- the parent receipt (`live-window`);
- `prev_index_digest`;
- `first_piece` and `first_entry`;
- the timeline;
- the signer is the golden's key.

It also checks that each window's pieces, entries (but flags and window-relative
`refines`), class plan and plan digest are the golden's.

wai-pack's conformance check writes the windows again, compares their bytes, and
verifies the same chain.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
stage_diff's stills were at most 48 columns wide, so the still writer's matches
never reached past distance code 22. Every sixth still is now a picture 1024 to
10923 columns wide whose rows repeat, some with a few bytes changed. The match to
the row above, one filtered row back, then uses distance codes 23 to 29. At
10923 columns that row is past the 32768-byte window, so the writer must fall
back to nearer matches or literals.

A run with nine or more wide stills fails if any of codes 23 to 29 goes unused.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
sim_verify.py reproduced the committed simulator cases, but nothing ran the two
simulators side by side on inputs outside the corpus. Those inputs include a
refinement with its own delivery timeout, which the corpus has few of.

sim_diff.py generates seeded random models and plans. A model has groups of a
base and up to three layers, each layer one object or one per unit; a
refinement either has its own timeout (zero, small, large or null) or takes the
plan's. A plan varies:

- live or on demand;
- fifo or strict priority;
- subgroup or datagram;
- base and refinement timeouts;
- a layer cap;
- one or two workers;
- the decode order;
- what happens to late refinements.

Each case runs through `wai_stage_measure sim` and through sim_verify.py. The
two must agree on the refusal, or on the whole result, the stall bound and the
longest stall. Where the bound applies, every stall must be within it.

It started as a review probe; the hard-coded paths are removed. wai-conformance
now runs it with two fixed seeds next to sim_verify.py.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge remote-tracking branch 'origin/main' into wai/w4-4-staged-packages
Some checks failed
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Failing after 1h19m24s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m4s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m4s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m10s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 6s
WAI section references / cited sections exist (pull_request) Successful in 11s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m19s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m40s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
standards workspaces build + test / aac-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
standards workspaces build + test / jouleclaw-rs (pull_request) Has been cancelled
1aa1b191a1
The reader used miniz_oxide, which accepts a dynamic block whose lone distance
code is longer than one bit. zlib's inflate, and so pack_verify.py, refuses
that block. A golden resealed with such a still verified in wai-pack and was
refused by pack_verify. Both readers now refuse incomplete code sets exactly as
zlib does: the only incomplete literal/length or distance code allowed is one
whose longest code is one bit.

The reader now uses its own inflater (png::inflate_zlib), written from RFC
1950/1951 to zlib's inflate rules:

- the header's check bits, method, window and preset-dictionary flag;
- the stored-block complement;
- the symbol counts;
- a complete code-length code;
- repeats with a length before them and within the code lengths;
- a code for the end of the block;
- over-subscribed and incomplete codes;
- a code with no symbol, or a distance past the bytes written, refused where it
  is read;
- the Adler-32, with nothing after it.

miniz_oxide is kept only as a dev-dependency: the writer's round-trip test reads
its stills back with an inflater independent of the reader's.

packaging §5.7 now states these rules instead of "any PNG reader", and says
that a still the verifier does not read is prefix-digest.

stills/ gains the same dynamic block twice: a lone one-bit distance code
(read) and a lone two-bit one (refused, still-incomplete-dist).

png_diff.py drives wai-pack's reader (a new stage-json op, read-png) against
pack_verify.py's. The inputs are:

- zlib's own streams at every level, strategy and window;
- the packager's own stills;
- dynamic blocks built on each code-set rule (22 kinds, each checked against
  the verdict the rules give it);
- mutations of all of these.

wai-pack.yml runs it in debug and release.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The new max_ms check bounded nothing, because a policy could set max_ms up to
2^53 − 1. A still's piece could then state 2^32 − 1 frames. Rust hashed once
per stated frame (about 29 minutes), and Python built a list of n references
(about 34 GB).

- **§3.4 item 5 and §4.4.** max_ms is at most 600000, and at most 2^24 units on
  every component's timebase. Both are policy-piece-bounds, in both readers.
  §4.4 gives the reason: a verifier takes a piece whole, so the longest piece
  bounds its work. Ten minutes is far past any piece a delivery cuts, and 2^24
  units bounds the work on any timebase, which may have up to 2^32 − 1 units a
  second.
- **§11.3, before any frame is decoded.** Each piece's floor object, where its
  framing reads, must hold one unit per frame of its piece
  (floor-object-mismatch). Both verifiers make this check first.
- **Held stills.** Python holds a still's frame and its count (Held) and hashes
  the digest a block at a time. Rust's held_digest also feeds a block at a time.
- **Corpus.**
  - refusals: max_ms 600001; and the default max_ms on a timebase of 2^32 − 1
    units a second.
  - policy/max-piece.toml: accepted at both bounds.
  - staged-mutations max-ms-past-cap (policy-piece-bounds).
  - staged-mutations still-at-cap: the still given the longest piece the policy
    allows, its manifest naming the frames, refused by the floor count in both
    verifiers.
- **policy_diff.** Its random policies now reach both bounds.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The Rust verifier never compared a base's manifest with §5.2, while
pack_verify.py did, under a refusal that named no §11.3 reason. A still whose
manifest had one extra target member was ok in Rust and refused in Python.
Python's refusal of a base it cannot decode named no reason either.

§11.3 now states one order, and both verifiers follow it. They take every base
and refinement in entry order:

- a base decodes by its capability, or it is prefix-digest;
- its manifest is §5.2's for its piece's frames and frame size
  (object-manifest, a new §11.3 reason);
- a refinement's manifest is §5.4's (object-manifest);
- each layer applies to every frame of the stage below, or it is prefix-digest;
- a base that does not decode, or a layer that does not apply, ends the pass;
- then the decode-equivalent prefixes are compared with their digests.

Rust's prefix_digests was restructured into this pass.

The new staged mutation cases are:

- still-manifest-target (object-manifest);
- refinement-manifest-target (object-manifest);
- still-incomplete-dist: the still re-coded with a lone two-bit distance code
  (prefix-digest).

The reviewer's still-png-variant and still-manifest-variant packages now get
those reasons from both verifiers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
LiveOut held every object's path, hex SHA-256 and first piece for the whole
session. It now holds:

- no listing record per file. Each file's listing line is appended to a hidden
  .LISTING.lines beside the package as the file is written. At the end the lines
  are read back, sorted into LISTING, and the lines file is removed; that is the
  one moment it holds a line per file.
- no set of written objects. An object already written is known by its file on
  disk.
- for the abandon path, only the objects the unsealed pieces published, as a
  piece number and a 32-byte content hash. Those of a window are dropped when
  the window is sealed.

packaging §9.2 and the CLI help now say exactly what remains:

- what no window has sealed yet: those pieces' entry fields and their objects'
  hashes, which with --window 0 means every piece's until the end;
- the frames of the piece being cut;
- eight bytes per piece for the plan.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-pack: the inflater's bit reader aligns, by name (clippy's conversion rule)
Some checks failed
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m19s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m9s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 4m17s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 17s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 7m37s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 9s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 25s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 49s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 1m51s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 14m49s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m33s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m8s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m14s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 11s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m13s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m7s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Failing after 1h32m26s
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
9ab59f2c96
Co-Authored-By: Claude Opus 5.5 <[email protected]>
http falsification: union-no-layer against this branch's described()
All checks were successful
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m7s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m4s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m17s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m34s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m58s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Successful in 1h31m2s
wai-pack / wai-pack · linux (pull_request) Successful in 1m17s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 23s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m10s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 3m55s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 36m24s
standards workspaces build + test / aac-rs (pull_request) Successful in 8m34s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 5m25s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 3m16s
standards workspaces build + test / map-rs (pull_request) Successful in 4m35s
standards workspaces build + test / mesh-rs (pull_request) Successful in 4m26s
standards workspaces build + test / openpay (pull_request) Successful in 33m15s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 10m24s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 2m2s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 4m32s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 3m50s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 2m48s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 7m21s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 10m9s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 29s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m13s
wai-pack / wai-pack · macos (pull_request) Successful in 2m27s
409b1c1fb2
The union-no-layer patch was written against the described() that this branch
rewrote in round 2 (a repeated object described once, a layer joining every
occurrence of its base), so CI could not apply it ("patch failed: codecs.rs:326").

It is regenerated from the branch's codecs.rs, still a plain patch file: the
layer joins no alt. Its must-fail list adds the two cases that pin the
repeated-object rule: union_O10_repeated_layer_after_first and
union_O10_repeated_layer_after_second. With the patch applied, verify fails all
three and two multivariant playlists.

The receipt-surrogates mutation is left to #200's sharded runner, which owns it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
`wai generate` makes a wai.generate.spectral picture with the reference generator at
any size and prints its SHA-256; with --instr it makes a listed size of an instruction
object of form v0, which it reads as a sink does, and --write-instr writes one.
`wai score build` writes a WSCR from integer note fields only; `wai score render`
prints samples, pcm_sha256, mixdown_blake3 and score_hash, and --pcm writes the samples.

Vectors: tests/vectors/generate/sizes.json (256x128, 640x320) and instr-v0.json (the
object, its four listed sizes and 28 objects a sink refuses); score-conformance gains
pcm_sha256 for every vector and notes/<name>.json, the authoring form, which
`wai score build` turns back into the committed WSCR byte for byte. Every pin was made
natively and equals the shared browser binding's output.

`wai wrap` refuses a wai.generate.spectral payload that is not a form-v0 object, in
every build. No library source changes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai SPEC §5: the payload of wai.generate.spectral is an instruction object (form v0)
Some checks failed
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Successful in 1h19m26s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m5s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m2s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m7s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m18s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m42s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 5s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 28m35s
standards workspaces build + test / aac-rs (pull_request) Successful in 10m55s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 6m27s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 5m23s
standards workspaces build + test / map-rs (pull_request) Successful in 4m43s
standards workspaces build + test / mesh-rs (pull_request) Successful in 1m31s
standards workspaces build + test / openpay (pull_request) Successful in 4m3s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 9m13s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 2m3s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 3m53s
wai-pack / wai-pack · linux (pull_request) Successful in 1m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m40s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 22s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m7s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 3m10s
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
3770d1ab8e
The registration is completed as §8 permits: the row named the generator and no byte
layout. The payload is one canonical JSON object naming the model by its SHA-256 and
giving the prompt, the seed, the steps and every size a sink makes, each within stated
bounds and with one serialization per object, so an envelope's content hash names the
instructions. A sink makes only listed sizes, with that model only; conformance is
generation-equivalence at each listed size, and a sink holding a size's SHA-256 does
not present a picture that differs or accept one on a 64-bit FNV-1a alone. The
envelope's intent is `create`: a generator does not back `replicate` (§7), and this
keeps that rule.

The registry row names the payload; §8 lists the completion. score §2.3 documents the
integer authoring form `wai score build` reads, and §4 the pcm_sha256 every vector now
states. CI builds the `wai` binary with `generate` and `score` in both profiles of the
integer-kernel steps and runs tests/cli_generate_score.rs there; the two larger listed
sizes of instr-v0.json run in the release step.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
SPEC §5 and determinism-tiers §5 said `wai.neural.int_synth` decodes "QAT
weights". No committed model was trained that way. The trained corpus vector was
made by `tools/wai_int_synth_real.py`: float training, then post-training
quantisation with each layer's shift derived from its measured activation range,
the recipe `tools/wai_int_synth_train.py` documents. The synthetic vectors' weights
are generated from a seed. Both texts, the capability constant's comment, the
module doc and a test comment now say that.

`tools/wai_int_synth_qat.py` said it "closes the one open gap" and tunes "the
weights AND the shifts"; it trains the weights against one fixed shift and made no
committed model, and it now says so. `tools/wai_int_synth_export.py` told users to
train with QAT upstream; it now names the working path.

Stale paths: the int_synth decoder is `int_synth.rs` at the crate root, not
`neural/int_synth.rs` (SPEC §5, the export tool, the capability comment); the
quantum-ops engine is `wai-quantum/src/quantum_ops.rs`, and the quantum-sim
receipt's feature is `quantum_receipt` of `wai-quantum`, which `wai-rs` forwards,
not `["quantum", "world"]`.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
A new normative section names the two lanes protected content travels in, and
what a WAI record covers in each.

- Lane A, hardware-protected content: a standard codec decrypted and decoded inside
  the platform's protected media path. This revision registers no
  `security.encryption` value for it, so no WAI envelope carries Lane A media. WAI's
  records about such a title (the served manifest, the package's segment map, the
  key-release decisions, the content hashes of WAI objects) are all it attests; none
  covers a decoded frame. Parametric synthesis applies only inside a decoder the
  protection system certifies, with no tier and no output digest.
- Lane B, end-to-end encryption at the application layer (`mls-sframe`): the
  application decrypts and any decoder runs, so every record and tier applies as to
  plaintext. It is stated not to be a protected-path robustness level: a publisher
  must not offer it for a licence term that requires one.
- The exact tier covers only output a sink can hash. determinism-tiers §5 gains a
  subsection listing the fabrics `decode-equivalence` is shown on in this revision
  (native CPU; wasm32, whose CI job passed on main at 412a08c5), none on GPU or NPU,
  forbids relaxed-SIMD instructions and NaN-bit dependence in a Wasm decoder at the
  tier, and rules out any tier, digest or binding for protected-path output.

The `wai.video.keys` row and the confidentiality extension now say which lane they
belong to.

Two more stale references: README and SPEC Appendix A sent macOS builders to a
committed `.cargo/config.toml` that no longer exists; `wai-rs/build.rs` finds libFLAC
through pkg-config, then the Homebrew prefix.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
`man_len` is a u32, and nothing bounded it: a reader trusted it up to the bytes in
hand, and the HTTP head parser answered a `man_len` of 4 GiB by asking for
4 GiB + 12 bytes. The reference now sets a reader limit:

- `container::MANIFEST_MAX_LEN` is 1 MiB (1 048 576 bytes), far above any manifest in
  the committed corpora. `check_manifest_len` refuses a longer one with
  `manifest_too_large`, from the length field alone, before anything is sliced.
- Both readers (`Wai::from_bytes`, `WaiMulti::from_bytes`), `manifest_bytes` and
  `http_binding::head::parse_head` (as `head_malformed`) apply it.
- Both writers, and the browser crate's `pack` and `packMulti`, refuse to write a
  manifest past it, so the reference never emits what its reader refuses.
- The writers also refuse a payload whose length does not fit its u32 field;
  `Wai::to_bytes` and `WaiMulti::to_bytes` wrote such a length modulo 2^32.
- `include/wai.h` gains the constant, as cbindgen writes it.

Tests: at the limit both containers read and write back byte for byte; one byte
past it, or a declared u32::MAX, is refused by every reader from the first eight
bytes, and neither writer writes it; the head parser refuses it instead of asking
for it. The manifest's nesting limit, which the JSON reader already applied, is
now pinned: 127 levels read, 128 refused, in WAI1 and WAI2 manifests.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The stdlib verifiers already copy the reference reader's nesting limit, so that two
readers agree on an envelope. They now copy its length limit too:
`staged_verify.MANIFEST_MAX` (1 MiB) is refused by `read_wai1` and `read_wai2`, by
`claim_verify.wai2_read`, by `pack_verify.read_envelope`, and by
`http_verify.parse_head` as `head_malformed` before it asks for the head.

Checked: every changed verifier passes its corpus as CI runs it (pack, staged,
http, staged-measure, claim). A manifest of exactly 1 MiB is read by each reader
and one byte more refused, as wai-rs does. On main, `read_wai1` read the longer one
and `parse_head` answered eight bytes declaring u32::MAX by asking for 4 GiB.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
`wai/SECURITY.md` is engineering notes, not normative text:

- how to report a vulnerability: [email protected], the address the
  repository's sandbox standard already gives, and what to send;
- manifest parsing: every bound the readers apply, with where it is specified and
  which tests check it, including the Python verifiers' share of them;
- the native codec libraries behind the `codecs` and `neural` features, that they run
  in-process with no sandbox, what does not touch them, and two gaps stated as gaps:
  `wai.text.zstd` and `wai.text.xz` decompress without an output bound, and the
  random-input smoke test is in no CI workflow;
- module authorisation (SPEC §4, jwp-receipts §7.9) and what it does not yet cover:
  the environment a module runs in;
- the fingerprinting risk of `held_sets`, pointing at the privacy rules still to be
  written for http-delivery.

SPEC §2 gains *Reader limits*: no reader refuses a manifest for its size or nesting
within 1 MiB and 127 levels, any reader may refuse one past them, and a refusal for
length comes from `man_len` alone (`manifest_too_large`). The container layout does
not change. http-delivery §7 step 3 and the WAI2 packer rule point at it.

`verify_pack.mjs`, which the wasm job runs, now checks that `pack` and `packMulti`
write a manifest of exactly 1 MiB and refuse one byte more; it passes against a
release wasm32 build of this source. That build also validates with WebAssembly's
SIMD and relaxed-SIMD features disabled (a control with bulk memory disabled fails),
which determinism-tiers §5 now records in place of a claim about build flags.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai: the manifest reader limit is 2^27, the largest manifest a staged layer has
Some checks failed
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Has been cancelled
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Has been cancelled
WAI neural decoders end-to-end / synthetic fixtures → Rust decode → reference (±4) (pull_request) Has been cancelled
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Has been cancelled
wai-pack / wai-pack · does this change touch it (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
WAI section references / cited sections exist (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Has been cancelled
07e923c724
The gate falsified the 1 MiB limit: `tests/staged_resources.rs` offers layers over
up to 65 536 units whose `refines.prev` names a different producer for each unit,
and the writer refused its 1.47 MB manifest. staged-delivery §3 permits that: a
`WIR1` layer covers up to 2^20 units, and a `prev` with one run per unit is about
90 bytes a run, some 94 MB in all. A reader floor below that would let a sink
refuse layers the extension allows.

`MANIFEST_MAX_LEN` is now 2^27 (134 217 728 bytes), which holds that layer, and SPEC
§2 states why. The Python verifiers use the same bound.

The writers now serialise through a capped writer that stops as soon as the
manifest passes the limit, so a refused manifest is never built in full. Serialising
128 MiB takes a debug build about 17 s, so the tests check the writers' cap at a
small limit, and the readers' boundary from the length field: at the limit a reader
refuses eight bytes only as truncated, one past it as too large. A 2 MiB manifest,
past the old bound, round-trips byte for byte. `verify_pack.mjs` checks a 3 MiB
manifest written and one byte past 2^27 refused by the browser writers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The test named for the writers called manifest_json_within and u32_field
directly and never called Wai::to_bytes or WaiMulti::to_bytes, so putting
serde_json::to_vec and `as u32` back in both writers left every test green.
Both writers now run to_bytes_within(WriteLimits), and to_bytes passes
SPEC's limits. The test writes each envelope at limits equal to its
manifest's and payloads' lengths, and requires manifest_too_large one byte
below the manifest, the field error one byte below a payload, and the sum
error when two payloads each fit and their total does not.

MANIFEST_MAX_LEN's doc cites staged-delivery Appendix A.3 for the 2^20-unit
cap (section 3 bounds a count only by 32 bits), and says the limit bounds
the bytes read, not the memory a parse takes. wai.h regenerated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
instr_makes_the_listed_small_sizes and instr_makes_the_listed_large_sizes run at
once in the release step, and both removed and rewrote one scratch file,
object.instr, while the other's `wai generate --instr` children read it. A remove
or a truncating write landing as a child opened the file would refuse the object
and fail the test. Each caller now names its own file.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
score_render_refuses_a_note_count_its_bytes_cannot_hold wrote a file with no
contract section, so the reader refused it with MissingSection(0x01) before
parse_notes reserved anything, guard or no guard: the test checked only which
message came first. The file now carries a well-formed contract (section 0x01) and
a notes section of only the count (0x02), and the same file declaring no notes is
shown to render, so without the guard the reader reaches Vec::with_capacity.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
render printed "channels":2 beside a mono mixdown of `duration` samples when a WSCR's
contract said two channels, and rendered a contract whose numeric profile was
wai.det.float64; a verifier following SPEC §7 Digests would read that PCM as stereo
frames. render now refuses both, as build refuses to write them.
score_render_refuses_a_contract_it_does_not_render patches the committed scale.wscr
in place for each case.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
No case reached the new limit: with the check deleted from
http_verify.parse_head, every case still gave its outcome, and no committed
envelope declares a man_len past 2^27. Four parse_head cases now do, on a
WAI1 (O5) and a WAI2 (OD): eight bytes declaring 2^27 + 1 are refused
(head_malformed), and eight declaring 2^27 ask for the head they declare
(need 134217740 and 134217738). Both implementations give all four.

falsify/manifest-limit-dropped.patch drops the check from head::parse_head,
and http_verify.py --mutate manifest-limit-dropped drops it on the Python
side; run.sh runs both.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The authoring form (score §2.3) is the definition, yet a note holding both
"start":0 and "start":5 built with start 5 (serde_json keeps the last value) and
the same hash as a note with start 5 alone; another JSON reader could keep the
first. wai_cli/strict_json.rs reads JSON with every object's members distinct and
refuses a repeat, and build reads its document through it. Two refused cases are
added: a note field and a document member, each given twice.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
instr-v0.json had one accepted object and 28 refused ones, none at an inclusive
bound, so a second sink stricter by one passed every vector; and the CLI test held
only that each object was refused, not why, so a rule relaxed (a quotation mark let
into the prompt) stayed green while the canonical-bytes check refused the object
in its place.

- The reader (wai_cli/instr.rs) refuses with a reason code, the first rule broken
  in a stated order; a member given twice is refused as such (strict_json).
- The vector gains twelve accepted objects (seed 0 and 2^32 - 1, steps 1 and 64,
  an empty prompt, 256 bytes, 0x20 and 0x7e, JSON's structural characters, a side of
  1, a side of 4096 and 2^23 pixels, 16 sizes, the w-then-h order), each with the
  SHA-256 of its first listed size made natively; eight more refused objects (types,
  a fraction in a size, a negative side, an escaped line feed, a backslash, cut-short
  JSON); and a reason for every refused object.
- tests/cli_generate_score.rs asserts each refusal's reason through `wai generate
  --instr` and `wai wrap`, and makes and wraps every accepted object.
- tests/generate.rs states form v0 a second time, independently of the reader, and
  holds the object, the accepted and the refused lists to it, making each accepted
  object's output with the library.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
SPEC §5 said the envelope's intent is `create`, but `wai wrap` refused only
`replicate` and wrote wai.generate.spectral envelopes with `--intent improve` or
`--intent banana`, and the non-conforming list did not mention intent. The
sentence is now a rule: an envelope that names the generator, as capability or
fallback, carries `create`, one with another intent is non-conforming, and wrap
refuses any other. wrap_writes_the_generator_only_with_intent_create covers
improve, an open string, a case variant, the empty string and the fallback.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
In staged_verify, claim_verify and pack_verify the man_len check is
outcome-neutral for any input under 128 MiB: the bounds check after it
refuses the same bytes. No corpus file is that large, so nothing exercised
it. Each verifier now builds, in memory, a WAI1 and a WAI2 (claim_verify:
the WAI2 its wai2_read reads) whose manifest is padded to 2^27 + 1 bytes
by a member no revision defines, and requires it refused, and requires the
same envelope with a 300-byte manifest read, so only the limit tells the
two apart. pack_verify builds its own envelopes, as it shares no code.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Form v0 names the model inside the payload by the SHA-256 of one file, and SPEC §5
never said how that relates to §3.1's parameter-set pin, which governs every
GenerativeDeterministic capability: whether a generate envelope carries a pin, or
which wins when a pin and `model` disagree. The library registers the set as
several files, so a form-less pin over the very file `model` names would be
refused form_required. SPEC §5 now states the relation: the model file is the
parameter set and `model` its identity; an envelope that names the generator
carries no `prior` and a sink refuses one that does, whatever it names. §3.1 says
so beside the pin rules, the non-conforming list names it, and prior-carriage §7's
row says the set is never pinned and names the file. No library source changes.

`wai inspect` and `wai unwrap` reported a generate envelope with a corrupt
payload as conforming ("component roles ✓", no payload line). They now report
the payload (form v0, with the reader's reason), the intent and any pin of every
envelope or WAI2 component that names the generator, ✓ or ✗; inspect's verdict
says the envelope does not conform. inspect_and_unwrap_report_the_generators_envelope
covers a prompt byte changed in place, the intent improve, a pin over the model
file itself, and a WAI2 component with and without a pin.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The hand-written Status note listed the integer codecs whose registrations v0.4.0
completes and left out wai.generate.spectral, which SPEC §8 now says §5 completes.
The note sits outside the generated region the library test compares.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
SECURITY.md and the CHANGELOG named wai-web's writers among those that
refuse a payload whose length does not fit its u32 field, but they still
wrote `payload.len() as u32` and `p.len() as u32`; packMulti's checked_add
caught only a total that overflows, and the claim held only because usize
is 32 bits on wasm32. Both now convert with u32::try_from, as wai-rs's
writers do, and name the payload that does not fit.

verify_pack.mjs: the refused manifest is 2^27 + 1 bytes, one past the
limit; the comment read as if it were 2^27.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
SECURITY.md cites sections of SPEC, http-delivery, integer-payloads and
jwp-receipts, and nothing checked them: the checker read only SPEC.md and
extensions/*.md, and the workflow's paths left SECURITY.md out. It reads
SECURITY.md now, and the workflow runs when it changes. Every reference in
it resolves; a reference to http-delivery §66 put in by hand fails the
check. CHANGELOG.md stays out: it is a dated record whose older references
are kept as written.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai: SECURITY.md, SPEC §2 and §6.5 say what holds
All checks were successful
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m12s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 33m46s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m40s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m53s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
standards workspaces build + test / aac-rs (pull_request) Successful in 9m8s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 3m2s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 4m3s
standards workspaces build + test / map-rs (pull_request) Successful in 7m9s
standards workspaces build + test / mesh-rs (pull_request) Successful in 4m14s
standards workspaces build + test / openpay (pull_request) Successful in 31m58s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 1m11s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 10m31s
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Successful in 1h31m39s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 2m1s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 3m36s
wai-pack / wai-pack · linux (pull_request) Successful in 1m7s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 24s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m47s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m21s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 3m18s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 3m10s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 7m16s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 30s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 12m1s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 31s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m31s
wai-pack / wai-pack · macos (pull_request) Successful in 2m11s
59ab0d9489
SECURITY.md:
- "Allocation follows the input" was false for the manifest. The reference
  readers parse it into serde_json::Value; measured on the release build,
  a 94 MB prev of 2^20 runs peaks at about 7 times its length and a
  134,217,000-byte array of zeros at about 38 times (5.1 GB RSS, 7.6 s in
  from_bytes, which returned Ok). The text now says so, and the argument
  that a sink short of that memory could not decode such layers either is
  gone.
- CI does link ONNX Runtime and libzstd: wai-neural-gates.yml and
  wai-neural-e2e.yml build `neural`. No workflow builds `codecs`.
- No Kani harness is in int_kernels.rs; the harnesses are in rans.rs,
  int_entropy.rs, int_transform.rs, wai_video_policy.rs, staged/predict.rs
  and staged/wir1_arith.rs. Its SIMD kernels, the only unsafe outside the
  C ABI, are held to the scalar kernels by equality tests, not by a model
  checker.
- The bare "(§5.1)" names http-delivery; the writer test is described as
  it now runs; the Python verifiers' checks are described as they now run.

SPEC §2: the 2^20-unit cap is staged-delivery Appendix A.3's (section 3
bounds a count only by 32 bits); the limit bounds what a reader reads, not
the memory its parse takes; the paragraph is reflowed.

SPEC §6.5: Lane A's records are "among them", and include wai.video.ssai
and wai.video.channel. Lane B no longer says every record applies:
staged-measurement counts no encrypted object, and a verifier without the
key checks no payload-dependent rule of a reconstruct-session claim
(jwp-receipts §2.4.12 rule 3); nothing in the reference states a Lane B
tier. The confidentiality header and the CHANGELOG say the same.

SPEC §5 and determinism-tiers §5: only `photo` comes from a trained model;
gradient, bloom, facade and the cross-architecture golden use seeded
integer weights, as the CHANGELOG said both texts did.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web wasm32 CI: the browser generator and score synth make every native pin
All checks were successful
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m7s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m5s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m13s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m41s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m0s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · falsification and differential (pull_request) Successful in 1h29m35s
wai-pack / wai-pack · linux (pull_request) Successful in 1m8s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 22s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m19s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m49s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 36m4s
standards workspaces build + test / aac-rs (pull_request) Successful in 10m19s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 9m39s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 5m5s
standards workspaces build + test / map-rs (pull_request) Successful in 5m26s
standards workspaces build + test / mesh-rs (pull_request) Successful in 5m22s
standards workspaces build + test / openpay (pull_request) Successful in 25m11s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 10m47s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 2m42s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 5m40s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 3m48s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 2m54s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 6m47s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 10m43s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 29s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m16s
wai-pack / wai-pack · macos (pull_request) Successful in 2m12s
4c09bea76a
The CHANGELOG said every pin equals the shared browser binding's output, and the
browser sink's form-v0 reading has no CI of its own, yet wai-web-wasm.yml ran no
generate or score check. demo/verify_generate_wasm.mjs runs generateSpectral at
every size the generate vectors pin (sizes.json, instr-v0.json's four listed sizes,
and the first listed size of each object at a bound of form v0), checks each
object names the committed model, and runs ScoreSink over every score-conformance
vector for its pcm_sha256, mixdown hash and score hash. The workflow runs it on the
node build and now also triggers on wai/score-conformance/. 35 checks pass locally
on a wasm32 build of this tree.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The shipped wai-web package needs WebAssembly with sign-extension, non-trapping
float-to-int and bulk memory, and i64 crossing the JS boundary as BigInt.
reach/build.sh derives three more builds from that package with pinned tools
(binaryen version_123 by archive SHA-256; TypeScript, esbuild and acorn by
package-lock.json):

- L1: the shipped binary legalised at the JS interface, for engines where i64
  does not cross as BigInt;
- L2: MVP-lowered and legalised, at four profiles (full, verify_decode, verify,
  receipt), for MVP-only WebAssembly;
- J: the wasm2js translation, one ES5 script per profile, with an ES5-floor
  runtime and glue: memory views refreshed when the buffer changes, i64 values
  carried as Numbers where there is no BigInt.

wai-load.js (ES5) picks shipped, L1, L2 or J from feature probes alone and
says why; a rung can be forced for testing.

test/conformance.js (ES5) runs the workloads over the repository's corpora on
any rung and compares every output with the shipped build's; run-modern.mjs
forces every rung and profile on a modern Node and runs the demo verify
scripts against each full build.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: the recorded manifest, the README, the CHANGELOG, and CI on the engine lines
Some checks failed
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-ui-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
bf7c61ff0b
reach/manifest.json is the build of the package the site serves (wai_web_bg.wasm
0063129a..., wai_web.js f63605f0...); given that package, build.sh refuses any
output whose SHA-256 differs. The manifest records where the package came from.

wai-web-reach.yml (linux runner) builds wai-web from the tree with the web target,
runs build.sh and run-modern.mjs on it, then runs conformance.js in one Node image
per engine line: node:0.12 (J), node:8.0.0 (J, and the L2 receipt build),
node:8 and node:10 (L2), node:12 and node:14 (L1). Each must be given its rung by
the loader's probes, and every output must equal the shipped build's. The README
says which device classes each image stands for, and that no real old device has
been run.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: the i64 workload crosses a low half with its top bit set
Some checks failed
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-ui-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
2c5f382492
2^32 + 2^31 goes in as a parameter and comes back as a result, so the Number
path (no BigInt) is tested where the low half's sign bit matters.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: direct i64 results with a high low half; the shipped wasm streams in browsers
Some checks failed
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-ui-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
3f26fab1f4
The runtime's falsification (an i64 result's low half read as signed where there
is no BigInt) passed every workload: op_lamport returns its u64 through memory,
not as an i64 result, so no workload returned an i64 whose low half has its top
bit set. quantizeScale(0.75, 32) and (1.5, 32) now do, with a zero and a
non-zero high half.

For the shipped rung a browser now hands the glue the wasm URL, so the module
compiles while it downloads; a host that reads files still hands it the bytes.
The recorded manifest changes for wai-load.js only.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
ci(wai-web-reach): build the package outside the tree
Some checks failed
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-ui-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
07ee78d414
The wasm-bindgen glue is an ES module in a .js file. Under wai/wai-web/reach/ the
nearest package.json (the build tools' pins) has no "type", so Node would read
the glue as CommonJS first. In $RUNNER_TEMP no package.json applies; only the
reach build and the reference, which the engine images read, stay in the
workspace.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
ci(wai-web-reach): gate the build on the pull request's own diff
Some checks failed
standards workspaces build + test / joule-ui-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
b77b332d3d
A rebase's push delta fires every path-filtered workflow; the reach job builds
wai-web and runs six engine images, so it now runs only when
scripts/pr-touches-paths.py says the pull request touches its paths (failing
open, and always on main), as wai-pack does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: CI holds the served bytes to the manifest; the package of record kept in-tree
Some checks failed
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
df9d349d92
The reach builds' byte-identity rested on local runs: CI built wai-web from the tree,
which can never be the package the site serves, so build.sh took its "not the recorded
input" branch and the recorded outputs were never checked there.

- reach/record/ keeps the package of record: the two files the site serves under
  /wai/pkg/. It is rebuilt from wai/wai-web at 248846f1 with the site's recipe, which now
  also remaps the standard library's sources in the toolchain to /rustc/<the compiler's
  commit>: the old remap kept the toolchain's folder, named after the build host, in
  every panic location of generic std code (and so in every reach binary and J bundle).
  manifest.json is re-recorded from it, with input.commit.
- The package is kept rather than rebuilt in CI: the same commit and recipe give a
  different wasm on the linux runner's host than on the macOS arm64 host that built it
  (measured twice in the runner's image, with the export at /tmp and at /private/tmp; the
  glue is the same, the code section is not).
- wai-web-reach.yml runs a leg per package. The record leg checks reach/record/ against
  the manifest's SHA-256 and runs build.sh with the new WAI_REACH_REQUIRE_RECORD=1, which
  refuses any other package, so every output must equal the manifest; then run-modern and
  the engine images run on those outputs. The tree leg is the earlier job. Step names
  describe each image by its engine features.
- wai-load.js: the early-engine probe is the feature `noDotAll` (was `v8Before62`), and
  its reasons and comment say what the engine lacks, not which engine it is.
- README, CHANGELOG and wai/README: the proxies are named by Node image and engine
  features, and the device classes they stand for by capability; no engine, browser or
  OS family names. Counts that drift ("five counted places", "four profiles", "the four
  int_synth vectors") describe the shape instead. The CHANGELOG describes what CI runs
  and claims no CI result.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: J's wasm2js from binaryen's WebAssembly build, so every host gives the recorded bytes
Some checks failed
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m19s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 4m19s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 14s
WAI conformance / cargo-class corpora · linux (pull_request) Failing after 6m26s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 8s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 25s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 49s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 1m52s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m28s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m45s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 14m54s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m30s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m5s
standards workspaces build + test / jouleclaw-rs (pull_request) Has been cancelled
standards workspaces build + test / aac-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
3a8a2161d5
The record leg, run in the linux runner's image, built 7 of the 11 recorded outputs and
refused the four J bundles: the x86_64 Linux archive's native wasm2js allocates the
translation's locals differently from the macOS archive's (the same MVP module in, the
i64-lowering temporaries and coalesced locals out in another order). Each host is
deterministic on its own; the difference is between the archives' builds.

- build.sh runs wasm2js from binaryen's WebAssembly build of the same release (npm
  binaryen 123.0.0, pinned with its integrity hash in package-lock.json) on Node, after
  checking its version is the pinned release. Its output is the macOS archive's for every
  profile, so no recorded output changes; only the manifest's tool lines do. The four
  translations run side by side.
- In the linux runner's image (catthehacker/ubuntu:act-22.04, Node 24.18, x86_64), build.sh
  with WAI_REACH_REQUIRE_RECORD=1 on reach/record/ now gives all 11 outputs equal to
  reach/manifest.json; on macOS arm64 the re-recorded manifest has the same 11 outputs.
- README, CHANGELOG and the workflow say which wasm2js J uses and why.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: the provenance vector's signer id is a label
Some checks failed
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m30s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 14m56s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m48s
wai-pack / wai-pack · linux (pull_request) Successful in 1m6s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 23s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 2m4s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m23s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m44s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m1s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 4m36s
standards workspaces build + test / aac-rs (pull_request) Successful in 1m48s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 47s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 30s
standards workspaces build + test / map-rs (pull_request) Successful in 29s
standards workspaces build + test / mesh-rs (pull_request) Successful in 28s
standards workspaces build + test / openpay (pull_request) Successful in 1m30s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 5m46s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 24s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 1m54s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m6s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 2m52s
standards workspaces build + test / macOS energy backends (pull_request) Failing after 4m59s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 10m6s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 29s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m14s
wai-pack / wai-pack · macos (pull_request) Successful in 2m12s
ee44f1871c
The reach receipt workloads verified a receipt copied from the site, written by
wai_prov before its signer id became a label: it named a domain under did:web,
which signer_ids_are_labels refuses (jwp-receipts §7.1, §7.8).

wai_prov gains --carry <receipt.json>: it measures nothing, carries each
step's figure and label from an earlier receipt for the same lineage, and signs
them with its published test seed (0x70 x 32) under its label
did:example:wai-prov. It refuses a receipt that does not verify or whose steps
are not this run's (operations, input and output hashes, work), and writes no
report. The vector is regenerated with it: the envelope is unchanged, the
figures are the ones wai_prov first measured for these bytes, and carrying the
receipt onto itself writes both files again byte for byte. The vector's README
states how it is made and the command.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main into wai/generate-score-cli
All checks were successful
wai-ops integer operators / linux-x86_64 (pull_request) Successful in 22s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (pull_request) Successful in 21s
wai-ops integer operators / wasm32 under Node (pull_request) Successful in 20s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 8m25s
wai-ops integer operators / independent checker (Python) (pull_request) Successful in 11s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m26s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 16m37s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m53s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m2s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 12m20s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 30s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m21s
wai-ops integer operators / macos-arm64 (pull_request) Successful in 25s
wai-pack / wai-pack · macos (pull_request) Successful in 2m14s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 37m13s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 35m47s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m31s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m7s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m50s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 3s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m20s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m16s
wai-pack / wai-pack · linux (pull_request) Successful in 1m9s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m50s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 17s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m15s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 36m23s
815f3fb8c2
Brings in #200 (HTTP receipts and keys) and #206 (wai-ops) among the rest
of main. One conflict, wai/CHANGELOG.md: both sides added entries at the
top of v0.4.0. Kept every entry; this branch's "Generated pictures and
scores" stays on top as the newest, main's entries follow unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge wai/generate-score-cli (with main) into wai/reach-builds
All checks were successful
wai-ops integer operators / wasm32 under Node (pull_request) Successful in 20s
wai-ops integer operators / independent checker (Python) (pull_request) Successful in 12s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m3s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m28s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 16m47s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m2s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 11m54s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 28s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m21s
wai-ops integer operators / macos-arm64 (pull_request) Successful in 26s
wai-pack / wai-pack · macos (pull_request) Successful in 2m15s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 36m32s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 36m3s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m31s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m0s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m47s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 3s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m22s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m11s
wai-pack / wai-pack · linux (pull_request) Successful in 1m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m50s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 20s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m16s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m30s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 36m59s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m14s
4e52e7923a
Brings in #197 (wai generate and wai score build|render) and, through it,
main as of #200 and #206. One conflict, wai/CHANGELOG.md: both sides added
entries at the top of v0.4.0. Kept every entry, newest first: this
branch's "wai-web on older engines: the reach builds", then #197's
"Generated pictures and scores", then main's entries unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge wai/reach-builds (with #197 and main) into wai/d1-record-true
Some checks failed
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 16m41s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m35s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m3s
standards workspaces build + test / macOS energy backends (pull_request) Failing after 31m19s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 1m1s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 23m0s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 33s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m37s
wai-ops integer operators / macos-arm64 (pull_request) Successful in 27s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m3s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 38m28s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 38m16s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m35s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m21s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m30s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
wai-pack / wai-pack · macos (pull_request) Successful in 2m11s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m21s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m11s
wai-pack / wai-pack · linux (pull_request) Successful in 1m13s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 37m30s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 22s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m57s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m23s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Failing after 2m9s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m14s
4e7155b955
Brings in #205 and #197 and, through them, main as of #200 and #206.

- wai/extensions/quantum-sim.md: both sides rewrote the status line's
  reference implementation. Kept main's two capabilities (circuit2 WQC2,
  circuit WQC1 frozen) and this branch's wording of where the reference
  lives (the `quantum` feature of wai-quantum, forwarded by wai-rs).
- wai/http-conformance/falsify/run.sh: #200 rewrote the single-run script
  into shards; took the sharded runner unchanged and ported this branch's
  additions into it: manifest-limit-dropped.patch sits with the other
  patches with its must-fail cases on its first line (it applies to the
  merged head.rs unchanged), and the Python mutation manifest-limit-dropped
  is declared in falsify/mutations.txt, after reload-walked where the old
  list had it, with the cases it must fail:
  head_malformed_manifest_too_large_O5 and _OD. The 3/3 shards cover
  134 patches and 78 mutations, each once.
- wai/http-conformance/cases.json: regenerated with wai_http_vectors gen;
  the generator's output equals the merged text (1049 cases), and both
  wai_http_vectors verify and http_verify.py give every outcome.
- wai/CHANGELOG.md: no textual conflict, but git left this branch's entry
  below "Staged measurement"; moved "The record made true" to the top of
  v0.4.0, newest first, above #205's and #197's entries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge wai/d1-record-true (with #205, #197 and main) into wai/w4-4-staged-packages
Some checks failed
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m30s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 17m2s
wai-ops integer operators / linux-aarch64 (pull_request) Successful in 24s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m5s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 5m15s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 7m56s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 31s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 12m35s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 31s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m10s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m26s
wai-ops integer operators / macos-arm64 (pull_request) Successful in 26s
wai-pack / wai-pack · macos (pull_request) Successful in 2m28s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 36m19s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 36m22s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m34s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m17s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m39s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m26s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m13s
wai-pack / wai-pack · linux (pull_request) Successful in 1m15s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 3m56s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 21s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m19s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Failing after 1m58s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m15s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 37m20s
e1acae7881
Brings in #201, #205 and #197 and, through them, main as of #200 and #206.

- .github/workflows/wai-conformance.yml: both sides added a step after
  sim_verify.py. Kept both: this branch's sim_diff.py differential, then
  main's quantum referee.py. wai-pack.yml merged without conflict: this
  branch's test-count floors (--lib 34, --test=staged 10) and differential
  steps, and main's cargo deny step for the wai binary's TLS client.
- wai/CHANGELOG.md: both sides added entries at the top of v0.4.0. Kept
  every entry, newest first: this branch's "Packaging: refinement layers,
  stills, ...", then #201's, #205's and #197's, then main's unchanged.
- wai/http-conformance/cases.json: regenerated with wai_http_vectors gen;
  the generator's output equals the merged text (1051 cases, with
  union_O10_repeated_layer_after_first and _after_second), and both
  wai_http_vectors verify and http_verify.py give every outcome.
- falsify/union-no-layer.patch, regenerated on this branch, applies to the
  merged codecs.rs unchanged and names the two repeated-layer cases among
  its must-fail cases; it is patches 0/3 of the sharded runner. This
  branch adds no http_verify.py mutation, so mutations.txt is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-web reach: the record leg runs the record's own demo scripts
All checks were successful
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 50s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 1m56s
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 5s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m8s
WAI neural decoders end-to-end / synthetic fixtures → Rust decode → reference (±4) (pull_request) Successful in 1m14s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m12s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 5s
WAI section references / cited sections exist (pull_request) Successful in 11s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m39s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 16m42s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m10s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m22s
wai-pack / wai-pack · macos (pull_request) Successful in 2m24s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 35m55s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 36m25s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m34s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m18s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m34s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m19s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m13s
wai-pack / wai-pack · linux (pull_request) Successful in 1m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m47s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 20s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m14s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m30s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 37m25s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m6s
603c6bbb8c
The record leg holds the package of record (reach/record/, built from the
commit reach/manifest.json names) to the demo verify scripts. It ran this
tree's scripts, so a check added after the record's commit was run against
code that predates it: #201's verify_pack test of the writers' manifest
limit failed on every rung of the record leg (jobs 21114, 21188), because
the recorded wai_web_bg.wasm was built before the writers refused a
manifest past 2^27.

run-modern.mjs takes --demo-commit <commit>: step 3 then runs that commit's
demo scripts over that commit's corpora (its wai/, exported with git
archive). A script this tree runs that the commit lacks is reported as
SKIP, not as a pass; a commit with none of them fails the run, as does an
empty or unknown commit. The record leg fetches input.commit (the checkout
is shallow) and passes it. The tree leg is unchanged: this tree's scripts
against this tree's build, where the new verify_pack check runs and passes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge wai/d1-record-true (the record leg runs the record's own demo scripts) into wai/w4-4-staged-packages
Some checks failed
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 57s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 2m50s
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 5s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m19s
WAI neural decoders end-to-end / synthetic fixtures → Rust decode → reference (±4) (pull_request) Successful in 1m27s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m38s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 12s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m33s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 17m55s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m21s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 3m0s
wai-pack / wai-pack · macos (pull_request) Successful in 2m24s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 37m13s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 37m24s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m34s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m23s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m50s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 3s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m17s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m9s
wai-pack / wai-pack · linux (pull_request) Successful in 1m14s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 4m9s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 16s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m13s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m31s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m14s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Has been cancelled
d4eb15e7ce
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The wasip2 leg's `cargo build --bin wai_quantum_vectors` also links wai's
cdylib, and rust-lld 22 (Rust 1.98) segfaults linking it on #201's tree. The
crash is LLD 22's ElemSection::writeBody dereferencing a null indirect function
table: the linker keeps the flags of the first object that names
__indirect_function_table, and on this tree that object (a codegen unit holding
io::Error::is_interrupted, which the new capped manifest writer instantiates)
names it without NO_STRIP. The table is then no GC root, nothing the cdylib keeps
(only cabi_realloc is exported) calls through it, yet live function addresses
still fill the element segment. LLD 23 ORs NO_STRIP across references and links
the same inputs.

Which object comes first follows the codegen units' hashed names, which depend on
the code and the checkout path, so the crash comes and goes with unrelated
changes. With one unit, wai's object comes first and takes function addresses, so
it names the table with NO_STRIP. Measured on 603c6bbb at the CI path in an x86_64
Ubuntu 22.04 container: the step crashes as is and links with this setting.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main (#215, #216, #217) into wai/d1-record-true
Some checks failed
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m8s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 38s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 2m56s
wai-vector vector graphics / linux-aarch64 (pull_request) Successful in 1m24s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Failing after 29m55s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 58m30s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 37m27s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 12m40s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 46s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 37m23s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m30s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m59s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m24s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 20m0s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 10m11s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 5s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 36s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m40s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m4s
wai-pack / wai-pack · linux (pull_request) Successful in 1m6s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 5m21s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m47s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 20s
wai-vector vector graphics / macos-arm64 (pull_request) Successful in 1m37s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m15s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 3m23s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 9m18s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 57m32s
wai-pack / wai-pack · macos (pull_request) Successful in 3m35s
8885e66688
CHANGELOG: both v0.4.0 entries kept; this branch's entry stays on top, as it
lands after main's vector-graphics entry. README merged without conflict.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge wai/d1-record-true (the wasip2 link fix, with #215, #216, #217 and main) into wai/w4-4-staged-packages
All checks were successful
standards workspaces build + test / openpay (pull_request) Successful in 7m30s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 1m35s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 23m14s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 1m8s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 4m17s
wai-vector vector graphics / linux-aarch64 (pull_request) Successful in 1m51s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 2m6s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 7m38s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m45s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 50s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 20m3s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 43s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 4m27s
wai-vector vector graphics / macos-arm64 (pull_request) Successful in 1m48s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 56m44s
wai-pack / wai-pack · macos (pull_request) Successful in 3m34s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 55m49s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 8m46s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 11m58s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 5m39s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m18s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m8s
wai-pack / wai-pack · linux (pull_request) Successful in 1m16s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 3m55s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 16s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m19s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m30s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 56m7s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m10s
02cb302e33
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!199
No description provided.