[workspace] resolver = "2" members = [ "core", "storage", "tests", "desktop/daemon", "desktop/ui", "desktop/platform-linux", "desktop/platform-windows", ] # Release profile is workspace-wide (section 5 of CLAUDE.md). Cargo rejects # [profile.*] in member manifests, so this lives here and nowhere else. # # The combination is deliberate: `z` optimises for size, LTO + codegen-units=1 # let the linker drop everything unreachable, and panic="abort" removes # unwinding tables entirely. Together they are what make the 5 MB stripped # daemon budget (section 5) reachable. scripts/ci.sh enforces the size gate. # Workspace-wide lints. These apply to every member crate. # # They are set here rather than in clippy.toml because they must apply to the # compilation — clippy.toml only accepts bare key=value pairs, and a `[lints]` # table there is rejected outright. crates.io-wide intent is the same: these # encode CLAUDE.md section 0 rule 5 (every fallible OS call handled, no # unwrap/expect outside tests) and the section 1.5.3 arithmetic care. [workspace.lints.rust] # Rustc lints only. NOTE: `integer_conversions` is NOT a rustc lint name and # cargo rejects it here as an unknown lint, so the u64 -> u32 truncation concern # is expressed as the clippy lint below, which is the check that actually exists. unsafe_code = "forbid" [workspace.lints.clippy] # Panicking in a release build leaves enforcement down. Section 1.5.4 requires # failing open with a log line, not aborting. panic = "deny" # `unwrap`/`expect` on an OS or I/O result is forbidden outside tests (section 0 # rule 5). unwrap_used = "deny" expect_used = "deny" # Silent u64 -> u32 truncation in usage counters and monotonic deltas is a real # bug class in this codebase, not a style issue: an overflow there would corrupt # a lock timer, which section 1.5.3 depends on. cast_possible_truncation = "deny" # Stack waste in the evaluator, which runs on every focus change. large_enum_variant = "warn" # Clarity over cleverness; section 5 budgets are measured, not guessed. too_many_arguments = "warn" [profile.release] opt-level = "z" lto = true codegen-units = 1 panic = "abort" strip = true # Debug builds keep debug assertions and overflow checks — the engine does # arithmetic on millisecond counters and monotonic deltas, and overflow in a # release build would corrupt a lock timer (section 1.5.3). [profile.dev] opt-level = 0 debug = true # Tests are compiled without panic=abort so that should_panic works. [profile.test] opt-level = 1