CI / Test (1.93) (push) Canceled after 0s
CI / Test (stable) (push) Canceled after 0s
CI / Test (1.83, legacy-msrv) (push) Canceled after 0s
CI / Clippy (push) Canceled after 0s
CI / Format (push) Canceled after 0s
CI / Doc (push) Canceled after 0s
CI / Cargo Deny (push) Canceled after 0s
Simplify encoder exit branch (−41 B code size), add GitHub Actions CI with MSRV matrix, cargo-deny with permissive-only license policy, encode-only fuzz target, and feature coverage across test gates. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
123 lines
4.7 KiB
Markdown
123 lines
4.7 KiB
Markdown
# Changelog
|
||
|
||
## 0.3.4 — 2026-04-01
|
||
|
||
### Changed
|
||
|
||
- **Encode shrunk by 41 bytes** — simplified branch structure in encoder exit
|
||
path. 388 B encode, 392 B decode, 780 B total (was 821 B). Zero benchmark
|
||
regressions.
|
||
- **Clarified decode invariant** — added inline comment explaining the subtle
|
||
trailing-0x01 COBS rule (end-of-data marker vs zero byte).
|
||
- **Clippy cleanup** — `saturating_sub` in proptest (cosmetic, test-only).
|
||
|
||
### Added
|
||
|
||
- **GitHub Actions CI** — tests on stable + MSRV 1.93 + 1.83/legacy-msrv,
|
||
clippy, fmt, doc, and cargo-deny.
|
||
- **`cargo-deny` integration** — `deny.toml` with permissive-only license
|
||
policy, advisory checks, source auditing. Added `just test-deny` gate.
|
||
- **Encode-only fuzz target** — `fuzz_encode` exercises buffer-too-small
|
||
paths and validates output properties independently of decode.
|
||
- **Feature coverage** — `just test-unit` and `just test-clippy` now test
|
||
both default and `legacy-msrv` features. `just test-doc` builds with
|
||
`--all-features`.
|
||
|
||
### Fixed
|
||
|
||
- **README accuracy** — overhead description changed from "exactly" to
|
||
"at most ... plus 1", added miri to test mentions, updated code size
|
||
numbers.
|
||
- **CLAUDE.md rewrite** — updated stale API signatures, LOC count, roadmap,
|
||
dev-deps list, and development commands.
|
||
|
||
## 0.3.3 — 2026-04-01
|
||
|
||
### Fixed
|
||
|
||
- **Fix compilation for downstream users** — `#[mutants::skip]` attribute was
|
||
not gated behind `cfg(test)`, causing unresolved module error when ucobs is
|
||
used as a dependency.
|
||
|
||
## 0.3.2 — 2026-04-01 (yanked)
|
||
|
||
### Testing
|
||
|
||
- **Mutation testing: 100% kill rate** — 89 mutants tested, 59 caught, 30
|
||
unviable (type system rejects them), 0 missed. Uses `cargo-mutants` v27
|
||
with nextest. Added `mutants` crate for `#[mutants::skip]` annotations.
|
||
- **111 tests** (was 106): added block-boundary interop verification against
|
||
corncobs, exact-fit and too-small decode buffer sizing for the batch zero
|
||
path.
|
||
|
||
## 0.3.1 — 2026-03-31
|
||
|
||
### Performance
|
||
|
||
- **Decode: rewritten with shrinking-slice pattern** — decode zeros is 14%
|
||
faster (25,018 vs 29,114 instructions at 4 KB), decode nonzero flipped from
|
||
5% behind corncobs to 2% ahead, decode mixed closed from 8% behind to tied.
|
||
ucobs now wins or ties 16 of 18 benchmarks.
|
||
- **Encode zeros: 6% faster** — zero fast path moved before `split_at` calls,
|
||
eliminating per-byte overhead. Now tied with cobs (previously 6% behind).
|
||
- **Code size reduced** — 821 B total (was 869 B). Encode 429 B, decode 392 B.
|
||
|
||
### Changed
|
||
|
||
- **Replaced criterion with iai-callgrind** — benchmarks now measure
|
||
deterministic instruction counts via Valgrind instead of wall-clock time.
|
||
Zero run-to-run variance. Requires `valgrind` installed.
|
||
- **Expanded benchmark coverage** — 9 payload sizes (0–4096 B) × 3 patterns
|
||
× 3 crates × encode/decode = 162 benchmarks, all running in ~2 minutes.
|
||
- **Code size measurement** added to `just bench` via `just bench-size`.
|
||
- **Mutation testing** added via `cargo-mutants` (`just test-mutants`).
|
||
- Added `mise.toml` for dev tool management.
|
||
|
||
## 0.3.0 — 2026-03-31
|
||
|
||
### Performance
|
||
|
||
- **Encode nonzero/mixed: ~2x faster** — uses const `copy_from_slice` (memcpy at
|
||
runtime) via Rust 1.93's stabilization of const slice methods. Sub-slice scan
|
||
pattern helps LLVM eliminate bounds checks.
|
||
- **Encode zeros: ~50% faster** — fast path skips scan loop overhead for leading
|
||
zero bytes.
|
||
- **Decode zeros: ~4x faster** — batch consecutive `0x01` codes and fill zeros
|
||
via `fill(0)` (memset) instead of per-byte iteration.
|
||
- Encode now wins or ties corncobs on nonzero/mixed workloads.
|
||
- Decode zeros now leads all competitors by 3x.
|
||
|
||
### Added
|
||
|
||
- `legacy-msrv` feature flag — enables compilation on Rust 1.83+ (e.g. Xtensa
|
||
toolchain) by replacing const `copy_from_slice` with a manual byte loop.
|
||
All other optimizations (sub-slice scan, zero fast path, decode batch fill)
|
||
work without this feature on any supported Rust version.
|
||
|
||
### Changed
|
||
|
||
- **MSRV bumped from 1.83 to 1.93** — required for const `copy_from_slice`.
|
||
Use the `legacy-msrv` feature for older toolchains.
|
||
- Dev-dependencies updated: `cobs` 0.3 to 0.5, `criterion` 0.5 to 0.8,
|
||
`rand` 0.8 to 0.10.
|
||
|
||
## 0.2.0 — 2026-03-30
|
||
|
||
### Added
|
||
|
||
- `const fn` encode — encode data at compile time with zero runtime cost.
|
||
- Comprehensive documentation with 7 usage examples (basic, buffer sizing,
|
||
framing, stream parsing, compile-time encoding, error handling).
|
||
- Initial encode/decode throughput optimizations.
|
||
|
||
### Changed
|
||
|
||
- MSRV set to 1.83.
|
||
|
||
## 0.1.0 — 2026-03-29
|
||
|
||
- Initial release.
|
||
- `no_std`, zero-alloc, `unsafe`-free COBS encoder and decoder.
|
||
- 106 tests: canonical vectors, property-based (proptest), fuzz targets,
|
||
cross-crate interop with `corncobs` and `cobs`.
|