diff --git a/crates/engine/src/faces_index.rs b/crates/engine/src/faces_index.rs
--- a/crates/engine/src/faces_index.rs
+++ b/crates/engine/src/faces_index.rs
@@ -600,6 +600,8 @@ impl FacesState {
         self.in_flight.clear();
         self.retry_at = None;
         self.saved_at = None;
+        self.task = None;
+        self.peak = 0;
         self.epoch = self.epoch.wrapping_add(1);
     }
 
diff --git a/crates/engine/src/tests/face_recognize.rs b/crates/engine/src/tests/face_recognize.rs
--- a/crates/engine/src/tests/face_recognize.rs
+++ b/crates/engine/src/tests/face_recognize.rs
@@ -524,6 +524,24 @@ fn face_scan_row_follows_pending_photos() {
     let _ = std::fs::remove_dir_all(&d);
 }
 
+#[test]
+fn face_scan_row_starts_over_in_another_library() {
+    // issue #2995: the scan's whole was kept from the library opened before, so a smaller one showed most of it done
+    let d = temp("peak-library");
+    let (mut s, _) = setup(&d, 64);
+    s.faces.peak = 442_717;
+    s.open_library(d.join("other"), true).unwrap();
+    let id = s.catalog.photos().map(|p| p.id).max().unwrap();
+    set_regions(&mut s, id, vec![region(0.1, None)]);
+    let last = s.execute("faces.pump", &json!({})).unwrap();
+    let pending = last["pendingPhotos"].as_u64().unwrap();
+    assert!(pending > 0, "{last}");
+    assert_eq!(last["peak"].as_u64().unwrap(), pending, "{last}");
+    let rows = s.activity.list().into_iter().filter(|t| t.kind == "faces").collect::<Vec<_>>();
+    assert_eq!(rows.iter().map(|t| (t.total, t.done)).collect::<Vec<_>>(), vec![(pending, 0)]);
+    let _ = std::fs::remove_dir_all(&d);
+}
+
 fn face_names(s: &Session, id: PhotoId) -> Vec<Option<String>> {
     s.catalog.photo(id).unwrap().meta.regions.iter().map(|r| r.name.clone()).collect()
 }
diff --git a/docs/whats-new.md b/docs/whats-new.md
--- a/docs/whats-new.md
+++ b/docs/whats-new.md
@@ -1,5 +1,12 @@
 # What's new in LightCraft
 
+## 2026-10-25
+
+### The face scan's progress starts over in another library
+- Opening another library while the face scan was running kept the old library's photo count as the progress bar's
+  whole, so a smaller library's scan looked almost done from the start (#2995). The scan's row and bar now start over
+  with each library.
+
 ## 2026-10-24
 
 ### Relative-date filters and smart albums follow the clock
