[package] name = "blocker-storage" version = "0.1.0" edition = "2021" description = "SQLite persistence for Blocker: schedules, lock state, and usage counters." license = "UNLICENSED" [dependencies] blocker-core = { path = "../core" } # rusqlite with bundled SQLite, per CLAUDE.md section 3. Bundled rather than # system-linked because the app ships to machines where libsqlite3 may be absent # or a different major version, and a storage-format mismatch that only shows up # on a user's machine is not a failure mode worth carrying. # # THIS CRATE IS NOT DEPENDENT ON BY blocker-core. # # That is the entire reason this crate exists separately. CLAUDE.md section 2 # requires the engine to be a pure function with no I/O, and the strongest # mechanical check for that is "blocker-core has zero dependencies" — a test # that reads Cargo.lock and fails on any entry. Keeping storage in its own crate # lets that test stay strict and automatic, instead of degrading into a source # grep that someone can route around. # # Both crates sit in the same layer: storage is shared by every platform and # contains no platform code, so this is a refinement of the section 2 diagram, # not a departure from it. rusqlite = { version = "0.37", features = ["bundled"] } [lints] workspace = true [lib] name = "blocker_storage" path = "src/lib.rs"