turbocow 0.3.0-beta.2

Compact, clone-on-write vectors, strings, maps and sets with inline + referenced storage — a superset of ecow.
Documentation
# Releasing turbocow

## CI (Codeberg + Forgejo Actions)

Workflows live in `.forgejo/workflows/`. Before they run:

1. **Enable Actions**: repo Settings → Units (Overview) → check "Enable Actions".
2. **Provide a runner**, then set every `runs-on:` in the workflows to its
   label (the placeholder is `docker`). turbocow's CI is heavy (3-arch Miri,
   multi-toolchain) and exceeds Codeberg's hosted *non-lazy* time caps
   (2–10 min). Options:
   - **Self-hosted `forgejo-runner`** (recommended): full control of image,
     caching and runtime. Settings → Actions → Runners → Create new Runner,
     then `forgejo-runner register` + `forgejo-runner daemon`. Use a
     Rust-capable image (or let the jobs `apt-get install clang`).
   - **Codeberg hosted `codeberg-*-lazy`** (24 h cap): zero infrastructure,
     slower, requires the repo be public + free-licensed.
3. **Secrets** (Settings → Actions → Secrets): add `CODECOV_TOKEN` if you keep
   `coverage.yml` — Forgejo's `GITHUB_TOKEN` is not a Codecov-usable token.
   Otherwise drop the upload step; the workflow still archives `lcov.info`.

Two repo-local quirks the workflows already neutralize:

- `.cargo/config.toml` pins clang + the `wild` linker for fast local builds;
  CI clears the `wild` link-arg and uses plain clang.
- `rust-toolchain.toml` pins a specific nightly; CI sets `RUSTUP_TOOLCHAIN`
  per job so the MSRV / beta / stable matrix is actually exercised.

## Testing

Beyond the unit/integration tests:

- **Differential proptests** (`tests/proptest_*.rs`) apply an `arbitrary`-decoded
  op sequence to each turbocow collection and to a `std` oracle (and, for the
  ecow-derived types, to `ecow` itself), asserting equivalence after every op.
  They run in plain `cargo test`. Tune with `PROPTEST_CASES=<n>`.
- **Fuzzing** (`fuzz/`) reuses the *same* model via `cargo-fuzz`:
  `cargo +nightly fuzz run <smallvec|ecovec|ecostring|map|set>`. A crash drops a
  reproducer under `fuzz/artifacts/`; the input replays in the proptest suite.
- **Miri replay** catches UB the above can't see at the value level. `cargo miri
  test --tests` runs the proptests too — cap them and disable isolation (proptest
  persists regression files to disk), e.g.
  `PROPTEST_CASES=16 MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-strict-provenance" cargo miri test --tests`.
  CI runs this across LE / BE / 32-bit.

## Publishing a version

1. Bump `version` in `Cargo.toml` and update `CHANGELOG.md`.
2. Confirm green CI on `master`.
3. `cargo publish --dry-run` (also run as the `package` CI job).
4. Tag the release: `git tag v<version> && git push origin v<version>`.
5. `cargo publish`.

The MSRV (1.85) should be verified against a real toolchain before publishing,
e.g. `RUSTUP_TOOLCHAIN=1.85.0 cargo +1.85.0 check` — the pinned nightly in
`rust-toolchain.toml` otherwise masks MSRV regressions locally.