diff --git a/apps/lightcraft/src/native_menu.rs b/apps/lightcraft/src/native_menu.rs
--- a/apps/lightcraft/src/native_menu.rs
+++ b/apps/lightcraft/src/native_menu.rs
@@ -489,9 +489,7 @@ impl NativeMenu {
             // events never reach `shortcuts::handle`, so this is the one guard for AppKit's
             // accelerators and clicks: while the blocking library window or a quit/settings notice
             // owns input, a queued command is dropped (Quit stays for the existing confirmation).
-            let (cmd, params) = if key == QUIT {
-                (key, serde_json::json!({}))
-            } else if key == "app.about" || key == SETTINGS {
+            let (cmd, params) = if key == QUIT || key == "app.about" || key == SETTINGS {
                 (key, serde_json::json!({}))
             } else if let Some(it) = self.items.get(&key) {
                 (it.cmd.clone(), it.params.clone())
diff --git a/crates/engine/src/cmd/export.rs b/crates/engine/src/cmd/export.rs
--- a/crates/engine/src/cmd/export.rs
+++ b/crates/engine/src/cmd/export.rs
@@ -38,7 +38,7 @@ impl Session {
         }
         // the preset's depth is judged against the format written, known only now (`path`); a
         // depth the call passes itself is the caller's, and validated as such
-        if !p.get("bitDepth").is_some_and(|d| !d.is_null()) {
+        if p.get("bitDepth").is_none_or(|d| d.is_null()) {
             crate::export::ExportOptions::drop_unfit_depth(&mut out, fallback);
         }
         Ok(out)
diff --git a/crates/ui-egui/src/panels/rules_move.rs b/crates/ui-egui/src/panels/rules_move.rs
--- a/crates/ui-egui/src/panels/rules_move.rs
+++ b/crates/ui-egui/src/panels/rules_move.rs
@@ -154,7 +154,7 @@ pub fn move_node(rs: &mut RuleSet, from: &[usize], dest: &[usize]) -> Option<Vec
     }
     let mut chain = from.get(..from.len().checked_sub(1)?)?.to_vec();
     // (a group the row is going into stays, however empty it is for now)
-    while !chain.is_empty() && !(dest.len() > chain.len() && dest.starts_with(&chain)) && list_at(&next, &chain).is_some_and(|l| l.rules.is_empty()) {
+    while !(chain.is_empty() || dest.len() > chain.len() && dest.starts_with(&chain)) && list_at(&next, &chain).is_some_and(|l| l.rules.is_empty()) {
         remove_at(&mut next, &chain)?;
         if !shift_after_removal(&mut dest, &chain) {
             return None;
