Record in the catalog design how duplicate originals are proved

catalog.md said content_hash is computed only for import duplicate
detection and reconnection, and left "the same image catalogued twice"
as unspecified. FR-CAT-11a now handles the within-root case: it proves a
group by content_hash where every copy has one, otherwise by first and
last megabyte digests kept in dedup_probes, a table created on first use
rather than by migration (core/dr-catalog/src/duplicates.rs:296). The
cross-root case stays open, and the bullet now says which half is done.
This commit is contained in:
2026-09-26 07:49:19 -04:00
parent a76e3bdd02
commit 9e099a07ab
+10 -2
View File
@@ -249,6 +249,13 @@ what you actually have.
only when something needs it: import duplicate detection (FR-CAT-11), or reconnecting a moved source only when something needs it: import duplicate detection (FR-CAT-11), or reconnecting a moved source
(FR-CAT-9). Never during a routine scan. (FR-CAT-9). Never during a routine scan.
Consolidating the duplicates a library already holds (FR-CAT-11a, 0.16.0) does not wait for it. It
proves a group the same by `content_hash` where every copy has one, and otherwise by a digest of
each copy's first and last megabyte, read by range through the backend and kept in `dedup_probes`
keyed on the size and mtime it was taken at, so a second review reads nothing.
`dedup_probes` is created on first use rather than by a migration, because a schema bump would make
an older build refuse this catalog's snapshot at sync (`core/dr-catalog/src/duplicates.rs`).
--- ---
## 4. The library view ## 4. The library view
@@ -711,8 +718,9 @@ because if the SQLite path proves troublesome, this is the fallback with a known
membership needs to be *stable* — for manual ordering, or for a pinned set that must not shift membership needs to be *stable* — for manual ordering, or for a pinned set that must not shift
under the user — it needs materialising with an invalidation rule. Deferred until there is a under the user — it needs materialising with an invalidation rule. Deferred until there is a
concrete need. concrete need.
- **Multi-root capture-time collisions.** FR-CAT-11 detects duplicates on import; the same image - **Multi-root capture-time collisions.** FR-CAT-11 detects duplicates on import, and FR-CAT-11a
catalogued under two roots is a related but distinct case, not yet specified. consolidates the copies one root holds in several folders; the same image catalogued under two
roots is a related but distinct case, not yet specified.
- **Timeline granularity selection.** Which bucket size the UI picks for a given zoom is a UI - **Timeline granularity selection.** Which bucket size the UI picks for a given zoom is a UI
concern, but the catalog should probably suggest one from the query's date span rather than have concern, but the catalog should probably suggest one from the query's date span rather than have
the UI guess. the UI guess.