The two pull requests that added wai-ops, wai-verify, the operator corpus, the
independent certifier and load step 8 wrote no changelog entry. This is it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Neither test file was named by any step, so no job ran them. They join the
release step of the cargo-class job on every platform leg.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The check bounded a refused layer's peak by twice the envelope's length. The
manifest reader now builds its tree at the size counted, within the bound SPEC
§2 states, and that read is the larger part of what a refusal takes, so the old
bound failed and a peak could no longer show a unit decoded after the read. The
check now measures reading the same envelope and bounds what the refusal
allocates beyond it. Falsified: one unit's output allocated before the refusal
fails it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai-conformance.yml gains codec-wrappers on the macOS runner: fuzz smoke, the
text decode limits and the C entry points, built with the codecs feature, which
no job built before. The step fails when a test binary ran no test.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
SPEC §2 gains the reader limits for wai.text.zstd and wai.text.xz: 2^27 decoded
bytes and 2^27 bytes of window or dictionary, with their refusal reasons.
SECURITY.md now states what the manifest readers and the text decoders bound
and which tests measure it, in place of the two gaps it listed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai.text.zstd and wai.text.xz decoded the whole stream into memory, so a few
kilobytes could ask for any amount. Both decoders now write at most 2^27 bytes
(text_decoded_too_long) into a buffer that is never sized past that, and give
the decoder at most 2^27 bytes of window or dictionary (text_window_too_large),
refused from the stream's declaration. A zstd frame that declares a longer
content size is refused before anything is decoded. The writers refuse what a
reader may refuse.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
SPEC §2 states the value limit (2^22, manifest_too_many_values) beside the
length and nesting limits, and what the two bound together. staged_verify,
claim_verify, http_verify and pack_verify refuse past it and check both edges
in memory; the HTTP corpus gains parse_head cases at the limit and one past it
(pad_values), verified by wai_http_vectors and http_verify.py alike.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
read_manifest and read_manifest_v2 count the manifest's values in the first
pass (refusing past 2^22, manifest_too_many_values), then build one JSON
tree at the sizes counted and move its members into the manifest types, so
no member is held twice as serde's flatten holds it. Every reference reader
(Wai, WaiMulti, the HTTP head) reads through them; the writers refuse what
they refuse.
tests/manifest_parse_memory.rs measures the peak with a counting allocator
against 128 bytes a value plus one a byte; tests/manifest_reader_equivalence.rs
holds the reader to serde's derived reader over every committed envelope and
1488 mutations.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
check_manifest_text: one pass refusing a member named twice and more than
2^22 values (manifest_too_many_values); the readers and writers use it.
The memory probe is scratch and will become the measured test.
Co-Authored-By: Claude Opus 5.5 <[email protected]>