clock-lib 0.4.0

Monotonic and wall-clock time readings for Rust, with a mockable clock for deterministic testing. Simple Tier-1 API, zero dependencies, no unsafe.
Documentation
# v0.2.1 — Hardening Pass

A polish release behind the 0.2.0 API. No public surface changes — every existing program keeps working — but the supply chain, build determinism, and lint posture all tighten up to match the project's full engineering bar.

## Highlights

- **`#![forbid(unsafe_code)]` at the crate root.** The "no `unsafe` in `clock-lib`" promise is now enforced by the compiler at the strongest possible level: downstream code cannot opt the crate out of this guarantee.
- **Stricter lint stack.** `#![deny(warnings)]` and `#![deny(clippy::unreachable)]` join the existing `clippy::unwrap_used`, `expect_used`, `todo`, `unimplemented`, `dbg_macro`, and `print_*` denies. A warning is a build failure.
- **Reproducible builds.** The Rust toolchain is pinned in [`rust-toolchain.toml`]../../rust-toolchain.toml, and [`Cargo.lock`]../../Cargo.lock is committed for deterministic dependency resolution across environments.
- **Supply-chain checks in CI.** [`cargo audit`]https://crates.io/crates/cargo-audit scans the dependency tree against the RustSec advisory database on every push, and [`cargo deny`]https://crates.io/crates/cargo-deny enforces a [license allowlist, yanked-crate ban, and wildcard ban]../../deny.toml.
- **Cross-platform line-ending normalization.** A new [`.gitattributes`]../../.gitattributes pins source files to LF so Windows checkouts no longer break `cargo fmt --check`.
- **CI runtime refreshed.** `actions/checkout` upgraded to `v5`. The Security audit job uses pre-built binaries via `taiki-e/install-action`, avoiding both Node.js 20 deprecation warnings and tooling MSRV friction.
- **Test naming aligned with REPS.** Every integration test now follows the `test_<subject>_<condition>_<expected>` convention.

## Compatibility

- **MSRV:** Rust 1.85 (unchanged)
- **Edition:** 2024 (unchanged)
- **Public API:** unchanged &mdash; no migration required from 0.2.0.

## Upgrading From 0.2.0

```toml
[dependencies]
clock-lib = "0.2"
```

That's it. The cargo resolver picks up `0.2.1` automatically and nothing in your code needs to change.

## What's Next

- **0.3.0 &mdash; the `Clock` trait.** `SystemClock` for production, `ManualClock` for deterministic, sleep-free tests. The mockable-clock pattern that makes `clock-lib` valuable in test suites.
- **0.4.0 &mdash; performance verification.** Criterion benchmarks with committed baselines proving the abstraction is zero-cost over raw `std::time`.
- **0.5.0 &mdash; `no_std` hardening and the 1.0 release candidate.**