Files
ucobs/CHANGELOG.md
swaitsandClaude Opus 4.6 f805386bb8
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
chore: audit cleanup, CI, cargo-deny, encode fuzz target (0.3.4)
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>
2026-04-01 13:01:19 -06:00

123 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.