# Dependency Upgrade Log

**Date:** 2026-01-18  |  **Project:** beads_rust  |  **Language:** Rust

## Summary
- **Updated:** 4  |  **Skipped:** 1  |  **Failed:** 0  |  **Needs attention:** 0

## Updates

### criterion: 0.7.0 -> 0.8.1
- **Breaking:** None documented; version bump aligns criterion-plot dependency
- **Migration:** None required
- **Tests:** Passed (649)

### rusqlite: 0.32.1 -> 0.38.0
- **Breaking:** `usize`/`u64` ToSql/FromSql disabled by default; statement cache optional; min SQLite 3.34.1
- **Migration:** Added `fallible_uint` feature flag to re-enable `usize` ToSql support
- **Tests:** Passed (649)

### unicode-width: 0.1.14 -> 0.2.2
- **Breaking:** Control characters now return `Some(1)` instead of `None`
- **Migration:** Code already uses `unwrap_or(0)` which handles the change gracefully
- **Tests:** Passed (649)

### indicatif: 0.17.11 -> 0.18.3
- **Breaking:** None found in project usage
- **Tests:** Passed (649)

---

## Skipped

### vergen-gix: 1.0.9 -> 9.1.0
- **Reason:** Blocked by Rust version constraint; vergen-gix 9.x may require newer Rust than 1.85
- **Action:** Investigate if project can bump rust-version in rust-toolchain.toml, or wait for compat release

---

## Transitive Updates (via cargo update)

These were automatically updated as dependencies of direct dependencies:
- hashlink: 0.9.1 -> 0.11.0 (rusqlite dependency)
- libsqlite3-sys: 0.30.1 -> 0.36.0 (rusqlite dependency)
- criterion-plot: 0.6.0 -> 0.8.1 (criterion dependency)
- Various gix-* crates (vergen-gix dependencies)

---

## Commands Used

```bash
# Check for outdated dependencies
cargo outdated

# Update specific package
cargo update -p rusqlite

# Run tests after each update
cargo test --lib
```

---
---

# Upgrade Session: 2026-02-19

**Date:** 2026-02-19  |  **Project:** beads_rust  |  **Language:** Rust

## Summary
- **Updated:** 24  |  **Replaced:** 1 (serde_yaml -> serde_yml)  |  **Skipped:** 4  |  **Failed:** 0

## Toolchain

### Rust nightly: unversioned -> nightly-2026-02-19
- **Change:** Pinned `rust-toolchain.toml` from generic `nightly` to `nightly-2026-02-19` (rustc 1.95.0-nightly, 2026-02-18)
- **Reason:** Reproducible builds; generic `nightly` channel was corrupted on this machine
- **Tests:** All pass

## Major Updates (Breaking Changes)

### schemars: 0.8 -> 1.0
- **Breaking:** `RootSchema` removed (replaced by `Schema`), `schema_name()` returns `Cow<'static, str>` instead of `String`, `schemars::gen` module renamed to `schemars::generate`, feature `chrono` renamed to `chrono04`, schemas now target JSON Schema draft 2020-12
- **Migration:** Updated Cargo.toml features, replaced `RootSchema` with `Schema` in `schema.rs`, updated manual `JsonSchema` impl in `model/mod.rs` to use new trait signatures
- **Files changed:** `Cargo.toml`, `src/model/mod.rs`, `src/cli/commands/schema.rs`
- **Tests:** Pass

### serde_yaml 0.9 -> serde_yml 0.0.12 (REPLACED)
- **Reason:** `serde_yaml` is deprecated and unmaintained; `serde_yml` is a maintained fork with compatible API
- **Migration:** Renamed all `serde_yaml::` references to `serde_yml::` across 4 source files. Fixed a `match_same_arms` clippy lint exposed by the reformatting
- **Files changed:** `Cargo.toml`, `src/error/mod.rs`, `src/config/mod.rs`, `src/cli/commands/config.rs`, `tests/conformance.rs`
- **Tests:** Pass

### crossterm: 0.28 -> 0.29
- **Breaking:** `KeyModifiers` display now uses `+` separators; new default `derive-more` feature
- **Impact:** This project only uses `crossterm::style::Stylize` -- no impact
- **Tests:** Pass

### rand: 0.9.2 -> 0.10
- **Breaking:** `Rng` extension trait renamed to `RngExt`, `StdRng` no longer implements `Clone`, `SeedableRng::from_os_rng()` removed
- **Migration:** Updated `use rand::Rng` to `use rand::RngExt` in `tests/bench_synthetic_scale.rs`
- **Files changed:** `Cargo.toml`, `tests/bench_synthetic_scale.rs`
- **Tests:** Pass

## Minor/Patch Updates (No Breaking Changes)

| Crate | From | To | Notes |
|-------|------|----|-------|
| clap | 4.5 | 4.5.60 | Semver-compatible |
| clap_complete | 4.5 | 4.5.66 | Semver-compatible |
| serde | 1.0 | 1.0.228 | Semver-compatible |
| serde_json | 1.0 | 1.0.149 | Semver-compatible |
| chrono | 0.4 | 0.4.43 | Semver-compatible |
| sha2 | 0.10 | 0.10.9 | Semver-compatible |
| anyhow | 1.0 | 1.0.102 | Semver-compatible |
| tracing | 0.1 | 0.1.44 | Semver-compatible |
| tracing-subscriber | 0.3 | 0.3.22 | Semver-compatible |
| indicatif | 0.18 | 0.18.4 | Semver-compatible |
| dunce | 1.0 | 1.0.5 | Semver-compatible |
| once_cell | 1.19 | 1.21 | Semver-compatible |
| regex | 1.11 | 1.12 | Semver-compatible |
| unicode-width | 0.2 | 0.2.2 | Semver-compatible |
| semver | 1.0 | 1.0.27 | Semver-compatible |
| tempfile | 3.10 | 3.25 | Semver-compatible |
| assert_cmd | 2.0 | 2.1 | Semver-compatible |
| predicates | 3.1 | 3.1.4 | Semver-compatible |
| criterion | 0.8 | 0.8.2 | Semver-compatible |
| walkdir | 2.4 | 2.5 | Semver-compatible |
| insta | 1.38 | 1.46 | Semver-compatible |
| proptest | 1.6 | 1.10 | Semver-compatible |

## Skipped

| Crate | Version | Reason |
|-------|---------|--------|
| rusqlite | 0.38 | Already at latest stable |
| thiserror | 2.0.18 | Already at latest stable |
| rich_rust | 0.2.0 | Already at latest stable |
| toon_rust | git:788589d | Git dependency, preserving pinned revision |

## Validation

- `cargo check --all-targets`: Pass
- `cargo clippy --all-targets -- -D warnings`: Pass
- `cargo fmt --check`: Pass
- `cargo test --lib`: 775 passed, 0 failed
- `cargo test --test conformance`: 320 passed, 0 failed, 26 ignored
- `cargo test` (full): 1 pre-existing failure in `e2e_close_blocked_requires_force` (unrelated to upgrades)
