Phase 3b adds three read-only legacy formats, and they are in the
DEFAULT build: LHA/LZH, ARJ, and Unix compress (.Z). `stuffr formats`
lists eighteen formats where it listed fifteen. `--features legacy`
still exists for a `--no-default-features` build; it is no longer
required.
Behind them is the thing that made them possible: a fixture-driven
conformance path for read-only containers. The existing harness could
not run on one at all — it PANICKED, because its read block builds a
test archive by calling create(). No read-only container had ever
existed to reveal that. Eight adversarial doubles now prove each of its
properties can fail.
Two of the three formats are proven against something other than the
crate that decodes them: .Z's fixture is generated by /usr/bin/compress
and known by construction, LHA's expected contents are lhasa's output.
ARJ's fixture is hand-built from the published specification and has no
independent witness — stated plainly in its manifest, because a review
caught a spec deviation there that no test in this repository could see.
.Z carries a from-scratch incremental LZW decoder. The crate chosen for
it advertised streaming through `impl Read` and decodes its whole input
on the first read() call, which would allocate a decompression bomb
before --max-ratio saw a byte. That crate is now a dev-only oracle, so
.Z has two independent witnesses rather than one dependency.
Also fixed, and pre-existing: `cargo install stuffr-cli --features
c-backed` had never worked — stuffr-cli declared no features at all,
while the README printed that command as copyable. Every documented
install spelling now resolves, checked by installing.
Scope: ARC and ZOO moved to Phase 3c when the crate meant to supply
them proved disqualifying — it unconditionally pulled a rustc 1.95
floor, a vendored C++ build, and RAR, which this project excludes on
licence grounds. StuffIt's older methods and Amiga/MS LZX are 3c
candidates too, gated on evidence rather than appetite.