Malformed-input campaigns; fix to the spec, not the seed.

Fuzz campaigns (+ auto-coverage)

Intent — Campaigns that feed malformed and adversarial inputs to the tool to find crashes and corruption, with coverage collected automatically, plus an RCA discipline that fixes to the spec, not the failing seed.

SummaryMalformed-input campaigns; fix to the spec, not the seed.
TargetProduct · Regression tests
Formregression
Movesensor — detects the error after the fact
Model
EnforcementHard (deterministic) — a repeatable campaign body; coverage tracked against a baseline

Its place in the environment — the canonical mechanism for COMPLETE · Establish completion on re-derived evidence. The variants and known uses that fold under it are gathered on the construction-kit page.

Motivation — the failure it kills

Real-world documents are malformed in ways no hand-written test anticipates: a truncated stream, an odd encoding, a structure right at the edge of what the spec allows. A fuzzer finds the crash or corruption on inputs you would never think to write. The failure is crashes / corruption on adversarial or spec-edge inputs, and it hides across an input space far too large to enumerate.

Why it's not just "property tests" (or "more example inputs")

Property tests check invariants over structured, generated inputs; fuzzing throws malformed, adversarial bytes to find crashes and spec-edge failures the structured generators don't reach. And the payoff is multiplied by an RCA discipline: fix to the stable point in the format spec, not to the failing seed, so the fix passes every spec-allowed input, not just the one that crashed. Structured generation is a good tool, and it does find bugs, until the corruption lives in bytes no generator would produce. Adversarial campaigns reach that space, and fixing to the spec closes the whole class the seed exposed rather than the one seed. Auto-coverage tracks what the campaign actually reached so gains are measurable, not assumed.

Two moves sharpen this beyond random bytes, and they are the depth of this entry — the producer- dialect corpus (real independent producers of a format supply the adversarial input, so the campaign occupies the whole spec-allowed producer space instead of a random slice) and fuzz + model-based engineering (the structured model becomes the oracle, so you fuzz against a stable point in the specification and the fix generalizes to every legal input). Both are detailed below.

Mechanism

Fuzz / campaign harnesses run the tool against generated malformed inputs. The host test-runner auto-appends coverage collection when a fuzz/campaign filter is in play, aggregated against a baseline. On a finding, the RCA discipline mandates root-cause analysis to the stable spec point rather than patching the seed.

Where the inputs come from — the producer-dialect corpus

Random and adversarial bytes are the crude generator; the sharp one is a producer-dialect corpus. The insight: the failure space that matters is not pure randomness — it is producer diversity. A document format has one specification but many independent writers, and each writer emits its own accent within the grammar. A different office suite, a different PDF writer, a document-conversion tool, a from-code generator — each produces unusual-but-valid object orderings, obscure-but-permitted structures, features the specification allows and your own writer never uses. Those are exactly the spec-legal-but-rare paths a from-scratch byte generator will almost never reach.

The deepest form — fuzz + model-based engineering (the model as oracle)

The synthesis that makes fuzzing precise: let the structured model itself be the fuzzer's oracle. Plain fuzzing has a coarse oracle — "never crash, never corrupt" — because it has no declared notion of what a correct answer looks like on a wild input. When the tool has an explicit structured model of the domain, that model already names a stable point in the specification: a closed set of legal outcome classes, an invariant predicate, a state-transition table. Point the wild inputs at the model's own entry surface, and judge the outcome against that declared set.

The producer-dialect corpus and the model-as-oracle compose: feed the producer's wild dialect to the model's entry point and classify the result against the model's declared outcome set. Wild input, rich oracle, and a fix that holds for the whole format — all at once.

Prerequisites

Consequences & costs

Known uses

Related mechanisms