diff --git a/docs/dev/traceability.md b/docs/dev/traceability.md index b3c7739..1c302c3 100644 --- a/docs/dev/traceability.md +++ b/docs/dev/traceability.md @@ -36,14 +36,14 @@ _None._ |---|---| | FR-CAT-1 | [`core/dr-catalog/src/scan.rs:1`](../../core/dr-catalog/src/scan.rs#L1), [`core/dr-catalog/src/walk.rs:108`](../../core/dr-catalog/src/walk.rs#L108), [`core/dr-catalog/src/walk.rs:161`](../../core/dr-catalog/src/walk.rs#L161), [`core/dr-catalog/src/walk.rs:1`](../../core/dr-catalog/src/walk.rs#L1), [`core/dr-sync/src/scan.rs:129`](../../core/dr-sync/src/scan.rs#L129), [`core/dr-types/src/lib.rs:206`](../../core/dr-types/src/lib.rs#L206), [`core/dr-types/src/lib.rs:275`](../../core/dr-types/src/lib.rs#L275), [`core/dr-types/src/lib.rs:308`](../../core/dr-types/src/lib.rs#L308), [`platform/dr-plat/src/storage.rs:1`](../../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../../platform/dr-plat/src/storage.rs#L216), [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1) | | FR-CAT-10 | [`core/dr-ingest/src/layout.rs:1`](../../core/dr-ingest/src/layout.rs#L1), [`core/dr-ingest/src/lib.rs:1`](../../core/dr-ingest/src/lib.rs#L1), [`core/dr-ingest/src/lib.rs:733`](../../core/dr-ingest/src/lib.rs#L733), [`core/dr-types/src/settings.rs:377`](../../core/dr-types/src/settings.rs#L377), [`platform/dr-plat/src/storage.rs:287`](../../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:586`](../../platform/dr-plat/src/storage.rs#L586), [`platform/dr-plat/src/volumes.rs:1`](../../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../../platform/dr-plat/src/volumes.rs#L62), [`ui/dr-ui/src/cards.rs:1`](../../ui/dr-ui/src/cards.rs#L1), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:345`](../../ui/dr-ui/src/import.rs#L345), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1946`](../../ui/dr-ui/src/lib.rs#L1946), [`ui/dr-ui/ui/import.slint:6`](../../ui/dr-ui/ui/import.slint#L6), [`ui/dr-ui/ui/library.slint:1370`](../../ui/dr-ui/ui/library.slint#L1370), [`ui/dr-ui/ui/library.slint:1424`](../../ui/dr-ui/ui/library.slint#L1424), [`ui/dr-ui/ui/library.slint:1686`](../../ui/dr-ui/ui/library.slint#L1686) | -| FR-CAT-11 | [`core/dr-catalog/src/dedup.rs:1`](../../core/dr-catalog/src/dedup.rs#L1), [`core/dr-ingest/src/lib.rs:1`](../../core/dr-ingest/src/lib.rs#L1), [`core/dr-ingest/src/lib.rs:392`](../../core/dr-ingest/src/lib.rs#L392), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1946`](../../ui/dr-ui/src/lib.rs#L1946), [`ui/dr-ui/src/library/filters.rs:12`](../../ui/dr-ui/src/library/filters.rs#L12), [`ui/dr-ui/src/library/thumbnails_gen.rs:601`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L601), [`ui/dr-ui/ui/import.slint:6`](../../ui/dr-ui/ui/import.slint#L6) | +| FR-CAT-11 | [`core/dr-catalog/src/dedup.rs:1`](../../core/dr-catalog/src/dedup.rs#L1), [`core/dr-ingest/src/lib.rs:1`](../../core/dr-ingest/src/lib.rs#L1), [`core/dr-ingest/src/lib.rs:392`](../../core/dr-ingest/src/lib.rs#L392), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1946`](../../ui/dr-ui/src/lib.rs#L1946), [`ui/dr-ui/src/library/filters.rs:12`](../../ui/dr-ui/src/library/filters.rs#L12), [`ui/dr-ui/src/library/thumbnails_gen.rs:608`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L608), [`ui/dr-ui/ui/import.slint:6`](../../ui/dr-ui/ui/import.slint#L6) | | FR-CAT-11a | [`core/dr-catalog/src/duplicates.rs:1`](../../core/dr-catalog/src/duplicates.rs#L1), [`core/dr-catalog/src/error.rs:110`](../../core/dr-catalog/src/error.rs#L110), [`core/dr-catalog/src/faces.rs:1662`](../../core/dr-catalog/src/faces.rs#L1662), [`core/dr-catalog/src/faces.rs:1680`](../../core/dr-catalog/src/faces.rs#L1680), [`ui/dr-ui/src/duplicates.rs:1`](../../ui/dr-ui/src/duplicates.rs#L1), [`ui/dr-ui/src/duplicates_ui.rs:1`](../../ui/dr-ui/src/duplicates_ui.rs#L1), [`ui/dr-ui/src/duplicates_ui.rs:79`](../../ui/dr-ui/src/duplicates_ui.rs#L79), [`ui/dr-ui/src/lib.rs:1976`](../../ui/dr-ui/src/lib.rs#L1976), [`ui/dr-ui/src/lib.rs:3613`](../../ui/dr-ui/src/lib.rs#L3613), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:671`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L671), [`ui/dr-ui/ui/app.slint:83`](../../ui/dr-ui/ui/app.slint#L83), [`ui/dr-ui/ui/collections.slint:897`](../../ui/dr-ui/ui/collections.slint#L897), [`ui/dr-ui/ui/duplicates.slint:1`](../../ui/dr-ui/ui/duplicates.slint#L1), [`ui/dr-ui/ui/settings.slint:108`](../../ui/dr-ui/ui/settings.slint#L108), [`ui/dr-ui/ui/settings.slint:512`](../../ui/dr-ui/ui/settings.slint#L512) | | FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:140`](../../core/dr-pipeline/src/sidecar.rs#L140) | | FR-CAT-13 | [`core/dr-catalog/src/rating.rs:276`](../../core/dr-catalog/src/rating.rs#L276), [`core/dr-catalog/src/schema.rs:875`](../../core/dr-catalog/src/schema.rs#L875), [`core/dr-sync/src/scan.rs:40`](../../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library/scan.rs:336`](../../ui/dr-ui/src/library/scan.rs#L336), [`ui/dr-ui/src/library/xmp.rs:10`](../../ui/dr-ui/src/library/xmp.rs#L10), [`ui/dr-ui/src/library/xmp.rs:133`](../../ui/dr-ui/src/library/xmp.rs#L133), [`ui/dr-ui/src/library/xmp.rs:26`](../../ui/dr-ui/src/library/xmp.rs#L26), [`ui/dr-ui/src/library_ui/controller.rs:336`](../../ui/dr-ui/src/library_ui/controller.rs#L336), [`ui/dr-ui/src/library_ui/controller.rs:427`](../../ui/dr-ui/src/library_ui/controller.rs#L427), [`ui/dr-ui/src/library_ui/controller.rs:578`](../../ui/dr-ui/src/library_ui/controller.rs#L578), [`ui/dr-ui/src/library_ui/grid.rs:216`](../../ui/dr-ui/src/library_ui/grid.rs#L216), [`ui/dr-ui/src/library_ui/open.rs:502`](../../ui/dr-ui/src/library_ui/open.rs#L502), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:118`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L118), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:671`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L671), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:700`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L700), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:756`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L756), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:855`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L855), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:664`](../../ui/dr-ui/ui/app.slint#L664), [`ui/dr-ui/ui/settings.slint:210`](../../ui/dr-ui/ui/settings.slint#L210), [`ui/dr-ui/ui/settings.slint:989`](../../ui/dr-ui/ui/settings.slint#L989) | | FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1249`](../../core/dr-catalog/src/schema.rs#L1249), [`core/dr-catalog/src/trash.rs:1`](../../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:549`](../../core/dr-sync-nextcloud/src/lib.rs#L549), [`core/dr-sync/src/lib.rs:155`](../../core/dr-sync/src/lib.rs#L155), [`core/dr-sync/src/scan.rs:618`](../../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:440`](../../core/dr-thumbs/src/lib.rs#L440), [`core/dr-types/src/place.rs:91`](../../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui/trash.rs:84`](../../ui/dr-ui/src/collections_ui/trash.rs#L84), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:819`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L819), [`ui/dr-ui/src/duplicates.rs:1`](../../ui/dr-ui/src/duplicates.rs#L1), [`ui/dr-ui/src/duplicates_ui.rs:1`](../../ui/dr-ui/src/duplicates_ui.rs#L1), [`ui/dr-ui/src/library/cells.rs:154`](../../ui/dr-ui/src/library/cells.rs#L154), [`ui/dr-ui/src/library/cells.rs:188`](../../ui/dr-ui/src/library/cells.rs#L188), [`ui/dr-ui/src/library/filters.rs:12`](../../ui/dr-ui/src/library/filters.rs#L12), [`ui/dr-ui/src/library/filters.rs:29`](../../ui/dr-ui/src/library/filters.rs#L29), [`ui/dr-ui/src/library/filters.rs:59`](../../ui/dr-ui/src/library/filters.rs#L59), [`ui/dr-ui/src/library_ui/controller.rs:1025`](../../ui/dr-ui/src/library_ui/controller.rs#L1025), [`ui/dr-ui/src/library_ui/controller.rs:272`](../../ui/dr-ui/src/library_ui/controller.rs#L272), [`ui/dr-ui/src/trash.rs:1`](../../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:1283`](../../ui/dr-ui/ui/collections.slint#L1283), [`ui/dr-ui/ui/collections.slint:802`](../../ui/dr-ui/ui/collections.slint#L802), [`ui/dr-ui/ui/duplicates.slint:1`](../../ui/dr-ui/ui/duplicates.slint#L1) | | FR-CAT-1a | [`core/dr-catalog/src/walk.rs:1`](../../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:59`](../../core/dr-types/src/lib.rs#L59), [`platform/dr-plat/src/storage.rs:1`](../../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:46`](../../platform/dr-plat/src/storage.rs#L46) | | FR-CAT-2 | [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/schema.rs:1`](../../core/dr-catalog/src/schema.rs#L1) | -| FR-CAT-3 | [`core/dr-catalog/src/jobs.rs:1`](../../core/dr-catalog/src/jobs.rs#L1), [`core/dr-catalog/src/walk.rs:65`](../../core/dr-catalog/src/walk.rs#L65), [`core/dr-sync/src/scan.rs:105`](../../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs:473`](../../ui/dr-ui/src/import.rs#L473), [`ui/dr-ui/src/import.rs:503`](../../ui/dr-ui/src/import.rs#L503), [`ui/dr-ui/src/library/sweep.rs:590`](../../ui/dr-ui/src/library/sweep.rs#L590), [`ui/dr-ui/src/library_ui/controller.rs:206`](../../ui/dr-ui/src/library_ui/controller.rs#L206), [`ui/dr-ui/src/library_ui/grid.rs:582`](../../ui/dr-ui/src/library_ui/grid.rs#L582), [`ui/dr-ui/src/library_ui/sync.rs:377`](../../ui/dr-ui/src/library_ui/sync.rs#L377), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:696`](../../ui/dr-ui/src/repairs.rs#L696), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495), [`ui/dr-ui/ui/library.slint:803`](../../ui/dr-ui/ui/library.slint#L803), [`ui/dr-ui/ui/settings.slint:375`](../../ui/dr-ui/ui/settings.slint#L375), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | +| FR-CAT-3 | [`core/dr-catalog/src/jobs.rs:1`](../../core/dr-catalog/src/jobs.rs#L1), [`core/dr-catalog/src/walk.rs:65`](../../core/dr-catalog/src/walk.rs#L65), [`core/dr-sync/src/scan.rs:105`](../../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs:473`](../../ui/dr-ui/src/import.rs#L473), [`ui/dr-ui/src/import.rs:503`](../../ui/dr-ui/src/import.rs#L503), [`ui/dr-ui/src/library/sweep.rs:615`](../../ui/dr-ui/src/library/sweep.rs#L615), [`ui/dr-ui/src/library_ui/controller.rs:206`](../../ui/dr-ui/src/library_ui/controller.rs#L206), [`ui/dr-ui/src/library_ui/grid.rs:582`](../../ui/dr-ui/src/library_ui/grid.rs#L582), [`ui/dr-ui/src/library_ui/sync.rs:377`](../../ui/dr-ui/src/library_ui/sync.rs#L377), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:696`](../../ui/dr-ui/src/repairs.rs#L696), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495), [`ui/dr-ui/ui/library.slint:803`](../../ui/dr-ui/ui/library.slint#L803), [`ui/dr-ui/ui/settings.slint:375`](../../ui/dr-ui/ui/settings.slint#L375), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | | FR-CAT-4 | [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/query.rs:1`](../../core/dr-catalog/src/query.rs#L1), [`core/dr-catalog/src/schema.rs:603`](../../core/dr-catalog/src/schema.rs#L603), [`ui/dr-ui/src/library/filters.rs:39`](../../ui/dr-ui/src/library/filters.rs#L39), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library_ui/layout.rs:1`](../../ui/dr-ui/src/library_ui/layout.rs#L1), [`ui/dr-ui/src/library_ui/mod.rs:1`](../../ui/dr-ui/src/library_ui/mod.rs#L1), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495) | | FR-CAT-5 | [`core/dr-catalog/src/keywords.rs:1`](../../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/name_dates.rs:1`](../../core/dr-catalog/src/name_dates.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/rating.rs:396`](../../core/dr-catalog/src/rating.rs#L396), [`core/dr-catalog/src/rating.rs:411`](../../core/dr-catalog/src/rating.rs#L411), [`core/dr-catalog/src/rating.rs:422`](../../core/dr-catalog/src/rating.rs#L422), [`core/dr-catalog/src/rating.rs:449`](../../core/dr-catalog/src/rating.rs#L449), [`core/dr-catalog/src/rating.rs:52`](../../core/dr-catalog/src/rating.rs#L52), [`core/dr-catalog/src/rating.rs:827`](../../core/dr-catalog/src/rating.rs#L827), [`core/dr-catalog/src/rating.rs:851`](../../core/dr-catalog/src/rating.rs#L851), [`core/dr-catalog/src/rating.rs:870`](../../core/dr-catalog/src/rating.rs#L870), [`core/dr-catalog/src/schema.rs:1164`](../../core/dr-catalog/src/schema.rs#L1164), [`core/dr-catalog/src/schema.rs:1751`](../../core/dr-catalog/src/schema.rs#L1751), [`core/dr-catalog/src/schema.rs:359`](../../core/dr-catalog/src/schema.rs#L359), [`core/dr-decode/src/lib.rs:308`](../../core/dr-decode/src/lib.rs#L308), [`core/dr-decode/src/lib.rs:314`](../../core/dr-decode/src/lib.rs#L314), [`core/dr-decode/src/lib.rs:324`](../../core/dr-decode/src/lib.rs#L324), [`core/dr-decode/src/lib.rs:451`](../../core/dr-decode/src/lib.rs#L451), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:1093`](../../core/dr-pipeline/src/sidecar.rs#L1093), [`core/dr-pipeline/src/sidecar.rs:174`](../../core/dr-pipeline/src/sidecar.rs#L174), [`core/dr-pipeline/src/sidecar.rs:193`](../../core/dr-pipeline/src/sidecar.rs#L193), [`core/dr-pipeline/src/sidecar.rs:2876`](../../core/dr-pipeline/src/sidecar.rs#L2876), [`core/dr-pipeline/src/sidecar.rs:2894`](../../core/dr-pipeline/src/sidecar.rs#L2894), [`core/dr-pipeline/src/sidecar.rs:590`](../../core/dr-pipeline/src/sidecar.rs#L590), [`ui/dr-ui/src/collections_ui/controller.rs:16`](../../ui/dr-ui/src/collections_ui/controller.rs#L16), [`ui/dr-ui/src/collections_ui/controller.rs:209`](../../ui/dr-ui/src/collections_ui/controller.rs#L209), [`ui/dr-ui/src/collections_ui/controller.rs:418`](../../ui/dr-ui/src/collections_ui/controller.rs#L418), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:150`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L150), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:264`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L264), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:323`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L323), [`ui/dr-ui/src/decoder_seam.rs:185`](../../ui/dr-ui/src/decoder_seam.rs#L185), [`ui/dr-ui/src/library/cells.rs:202`](../../ui/dr-ui/src/library/cells.rs#L202), [`ui/dr-ui/src/library/scan.rs:527`](../../ui/dr-ui/src/library/scan.rs#L527), [`ui/dr-ui/src/library/scan.rs:917`](../../ui/dr-ui/src/library/scan.rs#L917), [`ui/dr-ui/src/library_ui/controller.rs:858`](../../ui/dr-ui/src/library_ui/controller.rs#L858), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1154`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1154), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1178`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1178), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:118`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L118), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1195`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1195), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1401`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1401), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1412`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1412), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1425`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1425), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1440`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1440), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1449`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1449), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:97`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L97), [`ui/dr-ui/tests/status_is_not_colour_alone.rs:177`](../../ui/dr-ui/tests/status_is_not_colour_alone.rs#L177), [`ui/dr-ui/tests/status_is_not_colour_alone.rs:215`](../../ui/dr-ui/tests/status_is_not_colour_alone.rs#L215), [`ui/dr-ui/ui/app.slint:1678`](../../ui/dr-ui/ui/app.slint#L1678), [`ui/dr-ui/ui/app.slint:2877`](../../ui/dr-ui/ui/app.slint#L2877), [`ui/dr-ui/ui/develop.slint:142`](../../ui/dr-ui/ui/develop.slint#L142), [`ui/dr-ui/ui/develop.slint:48`](../../ui/dr-ui/ui/develop.slint#L48), [`ui/dr-ui/ui/labels.slint:19`](../../ui/dr-ui/ui/labels.slint#L19), [`ui/dr-ui/ui/labels.slint:1`](../../ui/dr-ui/ui/labels.slint#L1), [`ui/dr-ui/ui/labels.slint:40`](../../ui/dr-ui/ui/labels.slint#L40), [`ui/dr-ui/ui/labels.slint:74`](../../ui/dr-ui/ui/labels.slint#L74), [`ui/dr-ui/ui/library.slint:1640`](../../ui/dr-ui/ui/library.slint#L1640), [`ui/dr-ui/ui/library.slint:1643`](../../ui/dr-ui/ui/library.slint#L1643), [`ui/dr-ui/ui/library.slint:1794`](../../ui/dr-ui/ui/library.slint#L1794), [`ui/dr-ui/ui/library.slint:1818`](../../ui/dr-ui/ui/library.slint#L1818), [`ui/dr-ui/ui/library.slint:1875`](../../ui/dr-ui/ui/library.slint#L1875), [`ui/dr-ui/ui/library.slint:21`](../../ui/dr-ui/ui/library.slint#L21), [`ui/dr-ui/ui/library.slint:3235`](../../ui/dr-ui/ui/library.slint#L3235), [`ui/dr-ui/ui/library.slint:3242`](../../ui/dr-ui/ui/library.slint#L3242), [`ui/dr-ui/ui/library.slint:3262`](../../ui/dr-ui/ui/library.slint#L3262), [`ui/dr-ui/ui/library.slint:3351`](../../ui/dr-ui/ui/library.slint#L3351), [`ui/dr-ui/ui/library.slint:3967`](../../ui/dr-ui/ui/library.slint#L3967), [`ui/dr-ui/ui/library.slint:467`](../../ui/dr-ui/ui/library.slint#L467), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495), [`ui/dr-ui/ui/library.slint:5095`](../../ui/dr-ui/ui/library.slint#L5095), [`ui/dr-ui/ui/library.slint:5111`](../../ui/dr-ui/ui/library.slint#L5111), [`ui/dr-ui/ui/library.slint:522`](../../ui/dr-ui/ui/library.slint#L522), [`ui/dr-ui/ui/library.slint:643`](../../ui/dr-ui/ui/library.slint#L643), [`ui/dr-ui/ui/library.slint:687`](../../ui/dr-ui/ui/library.slint#L687), [`ui/dr-ui/ui/library.slint:693`](../../ui/dr-ui/ui/library.slint#L693), [`ui/dr-ui/ui/library.slint:697`](../../ui/dr-ui/ui/library.slint#L697) | | FR-CAT-6 | [`core/dr-catalog/src/collections.rs:1`](../../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/keywords.rs:1`](../../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/query.rs:1`](../../core/dr-catalog/src/query.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/rating.rs:449`](../../core/dr-catalog/src/rating.rs#L449), [`core/dr-catalog/src/rating.rs:880`](../../core/dr-catalog/src/rating.rs#L880), [`core/dr-catalog/src/schema.rs:1164`](../../core/dr-catalog/src/schema.rs#L1164), [`core/dr-types/src/place.rs:138`](../../core/dr-types/src/place.rs#L138), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`core/dr-types/src/selector.rs:1`](../../core/dr-types/src/selector.rs#L1), [`core/dr-types/src/settings.rs:64`](../../core/dr-types/src/settings.rs#L64), [`core/dr-types/src/time.rs:67`](../../core/dr-types/src/time.rs#L67), [`core/dr-types/src/time.rs:90`](../../core/dr-types/src/time.rs#L90), [`ui/dr-ui/src/library/filters.rs:156`](../../ui/dr-ui/src/library/filters.rs#L156), [`ui/dr-ui/src/library/filters.rs:357`](../../ui/dr-ui/src/library/filters.rs#L357), [`ui/dr-ui/src/library/filters.rs:442`](../../ui/dr-ui/src/library/filters.rs#L442), [`ui/dr-ui/src/library/filters.rs:64`](../../ui/dr-ui/src/library/filters.rs#L64), [`ui/dr-ui/src/library/spans.rs:262`](../../ui/dr-ui/src/library/spans.rs#L262), [`ui/dr-ui/src/library_ui/controller.rs:431`](../../ui/dr-ui/src/library_ui/controller.rs#L431), [`ui/dr-ui/src/library_ui/controller.rs:546`](../../ui/dr-ui/src/library_ui/controller.rs#L546), [`ui/dr-ui/src/library_ui/filter_bar.rs:256`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L256), [`ui/dr-ui/src/library_ui/filter_bar.rs:351`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L351), [`ui/dr-ui/src/library_ui/filter_bar.rs:406`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L406), [`ui/dr-ui/src/library_ui/filter_bar.rs:841`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L841), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:85`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L85), [`ui/dr-ui/ui/app.slint:660`](../../ui/dr-ui/ui/app.slint#L660), [`ui/dr-ui/ui/library.slint:113`](../../ui/dr-ui/ui/library.slint#L113), [`ui/dr-ui/ui/library.slint:1962`](../../ui/dr-ui/ui/library.slint#L1962), [`ui/dr-ui/ui/library.slint:1999`](../../ui/dr-ui/ui/library.slint#L1999), [`ui/dr-ui/ui/library.slint:2736`](../../ui/dr-ui/ui/library.slint#L2736), [`ui/dr-ui/ui/library.slint:3262`](../../ui/dr-ui/ui/library.slint#L3262), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495), [`ui/dr-ui/ui/library.slint:5095`](../../ui/dr-ui/ui/library.slint#L5095), [`ui/dr-ui/ui/library.slint:643`](../../ui/dr-ui/ui/library.slint#L643), [`ui/dr-ui/ui/library.slint:701`](../../ui/dr-ui/ui/library.slint#L701), [`ui/dr-ui/ui/library.slint:723`](../../ui/dr-ui/ui/library.slint#L723), [`ui/dr-ui/ui/settings.slint:202`](../../ui/dr-ui/ui/settings.slint#L202), [`ui/dr-ui/ui/widgets.slint:271`](../../ui/dr-ui/ui/widgets.slint#L271) | @@ -59,7 +59,7 @@ _None._ | FR-CULL-3 | [`core/dr-gpu/src/focus.rs:154`](../../core/dr-gpu/src/focus.rs#L154), [`core/dr-gpu/src/focus.rs:186`](../../core/dr-gpu/src/focus.rs#L186), [`core/dr-gpu/src/focus.rs:1`](../../core/dr-gpu/src/focus.rs#L1), [`core/dr-gpu/src/focus.rs:317`](../../core/dr-gpu/src/focus.rs#L317), [`core/dr-gpu/src/raw_histogram.rs:129`](../../core/dr-gpu/src/raw_histogram.rs#L129), [`core/dr-gpu/src/raw_histogram.rs:1`](../../core/dr-gpu/src/raw_histogram.rs#L1), [`core/dr-gpu/src/raw_histogram.rs:272`](../../core/dr-gpu/src/raw_histogram.rs#L272), [`core/dr-gpu/src/raw_histogram.rs:407`](../../core/dr-gpu/src/raw_histogram.rs#L407), [`core/dr-gpu/src/shaders/focus_peak.wgsl:1`](../../core/dr-gpu/src/shaders/focus_peak.wgsl#L1), [`core/dr-gpu/src/shaders/raw_histogram.wgsl:1`](../../core/dr-gpu/src/shaders/raw_histogram.wgsl#L1), [`ui/dr-ui/src/develop/render.rs:1639`](../../ui/dr-ui/src/develop/render.rs#L1639), [`ui/dr-ui/src/develop/render.rs:1703`](../../ui/dr-ui/src/develop/render.rs#L1703), [`ui/dr-ui/src/develop/render.rs:1726`](../../ui/dr-ui/src/develop/render.rs#L1726), [`ui/dr-ui/src/develop/render.rs:410`](../../ui/dr-ui/src/develop/render.rs#L410), [`ui/dr-ui/src/develop/render.rs:423`](../../ui/dr-ui/src/develop/render.rs#L423), [`ui/dr-ui/src/develop/render.rs:468`](../../ui/dr-ui/src/develop/render.rs#L468), [`ui/dr-ui/src/develop/render.rs:479`](../../ui/dr-ui/src/develop/render.rs#L479), [`ui/dr-ui/src/develop/render.rs:485`](../../ui/dr-ui/src/develop/render.rs#L485), [`ui/dr-ui/src/develop/render.rs:502`](../../ui/dr-ui/src/develop/render.rs#L502), [`ui/dr-ui/src/develop/session.rs:150`](../../ui/dr-ui/src/develop/session.rs#L150), [`ui/dr-ui/src/develop/session.rs:170`](../../ui/dr-ui/src/develop/session.rs#L170), [`ui/dr-ui/src/develop/session.rs:176`](../../ui/dr-ui/src/develop/session.rs#L176), [`ui/dr-ui/src/develop_ui.rs:1509`](../../ui/dr-ui/src/develop_ui.rs#L1509), [`ui/dr-ui/src/histogram.rs:1`](../../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/histogram.rs:208`](../../ui/dr-ui/src/histogram.rs#L208), [`ui/dr-ui/src/histogram.rs:228`](../../ui/dr-ui/src/histogram.rs#L228), [`ui/dr-ui/src/histogram.rs:272`](../../ui/dr-ui/src/histogram.rs#L272), [`ui/dr-ui/src/histogram.rs:544`](../../ui/dr-ui/src/histogram.rs#L544), [`ui/dr-ui/src/histogram.rs:565`](../../ui/dr-ui/src/histogram.rs#L565), [`ui/dr-ui/src/histogram.rs:593`](../../ui/dr-ui/src/histogram.rs#L593), [`ui/dr-ui/src/histogram.rs:621`](../../ui/dr-ui/src/histogram.rs#L621), [`ui/dr-ui/src/histogram.rs:658`](../../ui/dr-ui/src/histogram.rs#L658), [`ui/dr-ui/src/lib.rs:1364`](../../ui/dr-ui/src/lib.rs#L1364), [`ui/dr-ui/src/lib.rs:2307`](../../ui/dr-ui/src/lib.rs#L2307), [`ui/dr-ui/src/lib.rs:2444`](../../ui/dr-ui/src/lib.rs#L2444), [`ui/dr-ui/src/lib.rs:2487`](../../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:496`](../../ui/dr-ui/src/lib.rs#L496), [`ui/dr-ui/src/peaking.rs:1`](../../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:182`](../../ui/dr-ui/ui/app.slint#L182), [`ui/dr-ui/ui/app.slint:1933`](../../ui/dr-ui/ui/app.slint#L1933), [`ui/dr-ui/ui/app.slint:3344`](../../ui/dr-ui/ui/app.slint#L3344), [`ui/dr-ui/ui/peaking.slint:1`](../../ui/dr-ui/ui/peaking.slint#L1), [`ui/dr-ui/ui/peaking.slint:25`](../../ui/dr-ui/ui/peaking.slint#L25), [`ui/dr-ui/ui/peaking.slint:56`](../../ui/dr-ui/ui/peaking.slint#L56), [`ui/dr-ui/ui/peaking.slint:91`](../../ui/dr-ui/ui/peaking.slint#L91) | | FR-CULL-4 | [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-pipeline/src/sidecar.rs:174`](../../core/dr-pipeline/src/sidecar.rs#L174), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`ui/dr-ui/src/library/filters.rs:64`](../../ui/dr-ui/src/library/filters.rs#L64), [`ui/dr-ui/src/library/sidecar.rs:12`](../../ui/dr-ui/src/library/sidecar.rs#L12), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1035`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1035), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1311`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1311), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:464`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L464), [`ui/dr-ui/ui/app.slint:1686`](../../ui/dr-ui/ui/app.slint#L1686), [`ui/dr-ui/ui/app.slint:2846`](../../ui/dr-ui/ui/app.slint#L2846), [`ui/dr-ui/ui/develop.slint:168`](../../ui/dr-ui/ui/develop.slint#L168), [`ui/dr-ui/ui/develop.slint:55`](../../ui/dr-ui/ui/develop.slint#L55), [`ui/dr-ui/ui/library.slint:1066`](../../ui/dr-ui/ui/library.slint#L1066), [`ui/dr-ui/ui/library.slint:1649`](../../ui/dr-ui/ui/library.slint#L1649), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495), [`ui/dr-ui/ui/library.slint:5128`](../../ui/dr-ui/ui/library.slint#L5128), [`ui/dr-ui/ui/library.slint:669`](../../ui/dr-ui/ui/library.slint#L669) | | FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:685`](../../core/dr-catalog/src/schema.rs#L685), [`ui/dr-ui/src/bursts.rs:1`](../../ui/dr-ui/src/bursts.rs#L1), [`ui/dr-ui/src/library/cells.rs:21`](../../ui/dr-ui/src/library/cells.rs#L21), [`ui/dr-ui/src/library/cells.rs:872`](../../ui/dr-ui/src/library/cells.rs#L872), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1085`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1085), [`ui/dr-ui/ui/library.slint:495`](../../ui/dr-ui/ui/library.slint#L495) | -| FR-CULL-8 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1009`](../../core/dr-catalog/src/schema.rs#L1009), [`core/dr-catalog/src/schema.rs:1050`](../../core/dr-catalog/src/schema.rs#L1050), [`core/dr-catalog/src/schema.rs:753`](../../core/dr-catalog/src/schema.rs#L753), [`core/dr-face/src/align.rs:296`](../../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:134`](../../ui/dr-ui/src/derived_sync.rs#L134), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:447`](../../ui/dr-ui/src/faces.rs#L447), [`ui/dr-ui/src/faces.rs:463`](../../ui/dr-ui/src/faces.rs#L463), [`ui/dr-ui/src/faces.rs:585`](../../ui/dr-ui/src/faces.rs#L585), [`ui/dr-ui/src/identity_ui.rs:1472`](../../ui/dr-ui/src/identity_ui.rs#L1472), [`ui/dr-ui/src/identity_ui.rs:617`](../../ui/dr-ui/src/identity_ui.rs#L617), [`ui/dr-ui/src/lib.rs:1895`](../../ui/dr-ui/src/lib.rs#L1895), [`ui/dr-ui/src/lib.rs:3284`](../../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/library/sweep.rs:264`](../../ui/dr-ui/src/library/sweep.rs#L264), [`ui/dr-ui/src/library/sweep.rs:538`](../../ui/dr-ui/src/library/sweep.rs#L538), [`ui/dr-ui/src/library_ui/controller.rs:441`](../../ui/dr-ui/src/library_ui/controller.rs#L441), [`ui/dr-ui/src/library_ui/controller.rs:534`](../../ui/dr-ui/src/library_ui/controller.rs#L534), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:174`](../../ui/dr-ui/src/settings_ui.rs#L174), [`ui/dr-ui/src/settings_ui.rs:537`](../../ui/dr-ui/src/settings_ui.rs#L537), [`ui/dr-ui/ui/app.slint:677`](../../ui/dr-ui/ui/app.slint#L677), [`ui/dr-ui/ui/settings.slint:101`](../../ui/dr-ui/ui/settings.slint#L101), [`ui/dr-ui/ui/settings.slint:407`](../../ui/dr-ui/ui/settings.slint#L407), [`ui/dr-ui/ui/settings.slint:469`](../../ui/dr-ui/ui/settings.slint#L469), [`ui/dr-ui/ui/settings.slint:83`](../../ui/dr-ui/ui/settings.slint#L83), [`ui/dr-ui/ui/settings.slint:95`](../../ui/dr-ui/ui/settings.slint#L95) | +| FR-CULL-8 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1009`](../../core/dr-catalog/src/schema.rs#L1009), [`core/dr-catalog/src/schema.rs:1050`](../../core/dr-catalog/src/schema.rs#L1050), [`core/dr-catalog/src/schema.rs:753`](../../core/dr-catalog/src/schema.rs#L753), [`core/dr-face/src/align.rs:296`](../../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:134`](../../ui/dr-ui/src/derived_sync.rs#L134), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:447`](../../ui/dr-ui/src/faces.rs#L447), [`ui/dr-ui/src/faces.rs:463`](../../ui/dr-ui/src/faces.rs#L463), [`ui/dr-ui/src/faces.rs:585`](../../ui/dr-ui/src/faces.rs#L585), [`ui/dr-ui/src/identity_ui.rs:1472`](../../ui/dr-ui/src/identity_ui.rs#L1472), [`ui/dr-ui/src/identity_ui.rs:617`](../../ui/dr-ui/src/identity_ui.rs#L617), [`ui/dr-ui/src/lib.rs:1895`](../../ui/dr-ui/src/lib.rs#L1895), [`ui/dr-ui/src/lib.rs:3284`](../../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/library/sweep.rs:285`](../../ui/dr-ui/src/library/sweep.rs#L285), [`ui/dr-ui/src/library/sweep.rs:563`](../../ui/dr-ui/src/library/sweep.rs#L563), [`ui/dr-ui/src/library_ui/controller.rs:441`](../../ui/dr-ui/src/library_ui/controller.rs#L441), [`ui/dr-ui/src/library_ui/controller.rs:534`](../../ui/dr-ui/src/library_ui/controller.rs#L534), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:174`](../../ui/dr-ui/src/settings_ui.rs#L174), [`ui/dr-ui/src/settings_ui.rs:537`](../../ui/dr-ui/src/settings_ui.rs#L537), [`ui/dr-ui/ui/app.slint:677`](../../ui/dr-ui/ui/app.slint#L677), [`ui/dr-ui/ui/settings.slint:101`](../../ui/dr-ui/ui/settings.slint#L101), [`ui/dr-ui/ui/settings.slint:407`](../../ui/dr-ui/ui/settings.slint#L407), [`ui/dr-ui/ui/settings.slint:469`](../../ui/dr-ui/ui/settings.slint#L469), [`ui/dr-ui/ui/settings.slint:83`](../../ui/dr-ui/ui/settings.slint#L83), [`ui/dr-ui/ui/settings.slint:95`](../../ui/dr-ui/ui/settings.slint#L95) | | FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:956`](../../core/dr-catalog/src/schema.rs#L956), [`core/dr-face/src/classify.rs:1`](../../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:133`](../../core/dr-types/src/place.rs#L133), [`ui/dr-ui/src/faces.rs:167`](../../ui/dr-ui/src/faces.rs#L167), [`ui/dr-ui/src/faces.rs:1822`](../../ui/dr-ui/src/faces.rs#L1822), [`ui/dr-ui/src/faces.rs:309`](../../ui/dr-ui/src/faces.rs#L309), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library/filters.rs:136`](../../ui/dr-ui/src/library/filters.rs#L136), [`ui/dr-ui/src/library/filters.rs:763`](../../ui/dr-ui/src/library/filters.rs#L763), [`ui/dr-ui/src/library/filters.rs:806`](../../ui/dr-ui/src/library/filters.rs#L806), [`ui/dr-ui/src/library/filters.rs:844`](../../ui/dr-ui/src/library/filters.rs#L844), [`ui/dr-ui/src/repairs.rs:580`](../../ui/dr-ui/src/repairs.rs#L580), [`ui/dr-ui/ui/identity.slint:276`](../../ui/dr-ui/ui/identity.slint#L276), [`ui/dr-ui/ui/identity.slint:64`](../../ui/dr-ui/ui/identity.slint#L64), [`ui/dr-ui/ui/library.slint:1954`](../../ui/dr-ui/ui/library.slint#L1954), [`ui/dr-ui/ui/library.slint:757`](../../ui/dr-ui/ui/library.slint#L757) | | FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1050`](../../core/dr-catalog/src/schema.rs#L1050), [`core/dr-catalog/src/schema.rs:820`](../../core/dr-catalog/src/schema.rs#L820), [`core/dr-face/src/assign.rs:1`](../../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:585`](../../ui/dr-ui/src/faces.rs#L585), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:526`](../../ui/dr-ui/src/repairs.rs#L526), [`ui/dr-ui/ui/identity.slint:355`](../../ui/dr-ui/ui/identity.slint#L355) | | FR-DEV-1 | [`core/dr-pipeline/src/graph.rs:1`](../../core/dr-pipeline/src/graph.rs#L1), [`core/dr-pipeline/src/sidecar.rs:1`](../../core/dr-pipeline/src/sidecar.rs#L1) | @@ -107,7 +107,7 @@ _None._ | FR-EXP-6 | [`core/dr-catalog/src/albums.rs:1`](../../core/dr-catalog/src/albums.rs#L1), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/name.rs:1`](../../core/dr-export/src/name.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/albums_ui.rs:1`](../../ui/dr-ui/src/albums_ui.rs#L1), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/export.rs:621`](../../ui/dr-ui/src/export.rs#L621), [`ui/dr-ui/src/export.rs:959`](../../ui/dr-ui/src/export.rs#L959), [`ui/dr-ui/src/lib.rs:668`](../../ui/dr-ui/src/lib.rs#L668), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/ui/albums.slint:1`](../../ui/dr-ui/ui/albums.slint#L1) | | FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/develop_ui.rs:457`](../../ui/dr-ui/src/develop_ui.rs#L457), [`ui/dr-ui/src/export.rs:1518`](../../ui/dr-ui/src/export.rs#L1518), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:295`](../../ui/dr-ui/src/lib.rs#L295), [`ui/dr-ui/src/lib.rs:668`](../../ui/dr-ui/src/lib.rs#L668), [`ui/dr-ui/src/lib.rs:714`](../../ui/dr-ui/src/lib.rs#L714), [`ui/dr-ui/src/lib.rs:744`](../../ui/dr-ui/src/lib.rs#L744), [`ui/dr-ui/src/library_ui/controller.rs:1121`](../../ui/dr-ui/src/library_ui/controller.rs#L1121), [`ui/dr-ui/src/library_ui/controller.rs:1133`](../../ui/dr-ui/src/library_ui/controller.rs#L1133), [`ui/dr-ui/src/library_ui/controller.rs:1145`](../../ui/dr-ui/src/library_ui/controller.rs#L1145), [`ui/dr-ui/src/library_ui/controller.rs:790`](../../ui/dr-ui/src/library_ui/controller.rs#L790), [`ui/dr-ui/src/library_ui/controller.rs:890`](../../ui/dr-ui/src/library_ui/controller.rs#L890), [`ui/dr-ui/src/library_ui/controller.rs:947`](../../ui/dr-ui/src/library_ui/controller.rs#L947), [`ui/dr-ui/src/library_ui/sync.rs:101`](../../ui/dr-ui/src/library_ui/sync.rs#L101), [`ui/dr-ui/src/settings_ui.rs:394`](../../ui/dr-ui/src/settings_ui.rs#L394), [`ui/dr-ui/ui/app.slint:1094`](../../ui/dr-ui/ui/app.slint#L1094), [`ui/dr-ui/ui/app.slint:1528`](../../ui/dr-ui/ui/app.slint#L1528), [`ui/dr-ui/ui/app.slint:2606`](../../ui/dr-ui/ui/app.slint#L2606), [`ui/dr-ui/ui/app.slint:3510`](../../ui/dr-ui/ui/app.slint#L3510), [`ui/dr-ui/ui/app.slint:691`](../../ui/dr-ui/ui/app.slint#L691), [`ui/dr-ui/ui/app.slint:708`](../../ui/dr-ui/ui/app.slint#L708), [`ui/dr-ui/ui/app.slint:944`](../../ui/dr-ui/ui/app.slint#L944), [`ui/dr-ui/ui/export.slint:1`](../../ui/dr-ui/ui/export.slint#L1), [`ui/dr-ui/ui/export.slint:246`](../../ui/dr-ui/ui/export.slint#L246), [`ui/dr-ui/ui/library.slint:2035`](../../ui/dr-ui/ui/library.slint#L2035), [`ui/dr-ui/ui/library.slint:2044`](../../ui/dr-ui/ui/library.slint#L2044), [`ui/dr-ui/ui/library.slint:3210`](../../ui/dr-ui/ui/library.slint#L3210), [`ui/dr-ui/ui/library.slint:5240`](../../ui/dr-ui/ui/library.slint#L5240) | | FR-EXP-8 | [`core/dr-decode/src/lib.rs:373`](../../core/dr-decode/src/lib.rs#L373), [`core/dr-decode/src/lib.rs:397`](../../core/dr-decode/src/lib.rs#L397), [`core/dr-decode/src/lib.rs:411`](../../core/dr-decode/src/lib.rs#L411), [`core/dr-decode/src/lib.rs:76`](../../core/dr-decode/src/lib.rs#L76), [`core/dr-decode/src/lib.rs:84`](../../core/dr-decode/src/lib.rs#L84), [`core/dr-decode/src/lib.rs:87`](../../core/dr-decode/src/lib.rs#L87), [`core/dr-decode/src/locate.rs:1233`](../../core/dr-decode/src/locate.rs#L1233), [`core/dr-decode/src/locate.rs:1292`](../../core/dr-decode/src/locate.rs#L1292), [`core/dr-decode/src/locate.rs:359`](../../core/dr-decode/src/locate.rs#L359), [`core/dr-decode/src/locate.rs:556`](../../core/dr-decode/src/locate.rs#L556), [`core/dr-decode/src/locate.rs:640`](../../core/dr-decode/src/locate.rs#L640), [`core/dr-decode/src/locate.rs:653`](../../core/dr-decode/src/locate.rs#L653), [`core/dr-decode/src/locate.rs:736`](../../core/dr-decode/src/locate.rs#L736), [`core/dr-export/examples/export.rs:99`](../../core/dr-export/examples/export.rs#L99), [`core/dr-export/src/encode.rs:117`](../../core/dr-export/src/encode.rs#L117), [`core/dr-export/src/encode.rs:161`](../../core/dr-export/src/encode.rs#L161), [`core/dr-export/src/encode.rs:1`](../../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/encode.rs:206`](../../core/dr-export/src/encode.rs#L206), [`core/dr-export/src/encode.rs:235`](../../core/dr-export/src/encode.rs#L235), [`core/dr-export/src/encode.rs:311`](../../core/dr-export/src/encode.rs#L311), [`core/dr-export/src/encode.rs:325`](../../core/dr-export/src/encode.rs#L325), [`core/dr-export/src/encode.rs:408`](../../core/dr-export/src/encode.rs#L408), [`core/dr-export/src/encode.rs:456`](../../core/dr-export/src/encode.rs#L456), [`core/dr-export/src/encode.rs:70`](../../core/dr-export/src/encode.rs#L70), [`core/dr-export/src/encode.rs:795`](../../core/dr-export/src/encode.rs#L795), [`core/dr-export/src/encode.rs:809`](../../core/dr-export/src/encode.rs#L809), [`core/dr-export/src/encode.rs:850`](../../core/dr-export/src/encode.rs#L850), [`core/dr-export/src/encode.rs:898`](../../core/dr-export/src/encode.rs#L898), [`core/dr-export/src/exif.rs:1`](../../core/dr-export/src/exif.rs#L1), [`core/dr-export/src/lib.rs:140`](../../core/dr-export/src/lib.rs#L140), [`core/dr-export/src/metadata.rs:1`](../../core/dr-export/src/metadata.rs#L1), [`core/dr-export/src/metadata.rs:41`](../../core/dr-export/src/metadata.rs#L41), [`core/dr-export/src/metadata.rs:74`](../../core/dr-export/src/metadata.rs#L74), [`core/dr-types/src/lib.rs:658`](../../core/dr-types/src/lib.rs#L658), [`core/dr-types/src/settings.rs:671`](../../core/dr-types/src/settings.rs#L671), [`ui/dr-ui/src/decoder_seam.rs:257`](../../ui/dr-ui/src/decoder_seam.rs#L257), [`ui/dr-ui/src/develop/session.rs:37`](../../ui/dr-ui/src/develop/session.rs#L37), [`ui/dr-ui/src/develop/session.rs:494`](../../ui/dr-ui/src/develop/session.rs#L494), [`ui/dr-ui/src/develop/session.rs:701`](../../ui/dr-ui/src/develop/session.rs#L701), [`ui/dr-ui/src/export.rs:1127`](../../ui/dr-ui/src/export.rs#L1127), [`ui/dr-ui/src/export.rs:1173`](../../ui/dr-ui/src/export.rs#L1173), [`ui/dr-ui/src/export.rs:1201`](../../ui/dr-ui/src/export.rs#L1201), [`ui/dr-ui/src/export.rs:1238`](../../ui/dr-ui/src/export.rs#L1238), [`ui/dr-ui/src/export.rs:1344`](../../ui/dr-ui/src/export.rs#L1344), [`ui/dr-ui/src/export.rs:1362`](../../ui/dr-ui/src/export.rs#L1362), [`ui/dr-ui/src/export.rs:916`](../../ui/dr-ui/src/export.rs#L916), [`ui/dr-ui/src/lib.rs:295`](../../ui/dr-ui/src/lib.rs#L295), [`ui/dr-ui/src/lib.rs:319`](../../ui/dr-ui/src/lib.rs#L319), [`ui/dr-ui/src/lib.rs:700`](../../ui/dr-ui/src/lib.rs#L700), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1) | -| FR-EXP-9 | [`core/dr-decode/src/lib.rs:564`](../../core/dr-decode/src/lib.rs#L564), [`core/dr-export/src/lib.rs:132`](../../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1557`](../../core/dr-gpu/src/adjust.rs#L1557), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:257`](../../ui/dr-ui/src/decoder_seam.rs#L257), [`ui/dr-ui/src/develop/mask_ops.rs:1130`](../../ui/dr-ui/src/develop/mask_ops.rs#L1130), [`ui/dr-ui/src/develop/render.rs:681`](../../ui/dr-ui/src/develop/render.rs#L681), [`ui/dr-ui/src/develop/render.rs:723`](../../ui/dr-ui/src/develop/render.rs#L723), [`ui/dr-ui/src/lib.rs:668`](../../ui/dr-ui/src/lib.rs#L668), [`ui/dr-ui/src/library/sweep.rs:538`](../../ui/dr-ui/src/library/sweep.rs#L538), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | +| FR-EXP-9 | [`core/dr-decode/src/lib.rs:564`](../../core/dr-decode/src/lib.rs#L564), [`core/dr-export/src/lib.rs:132`](../../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1557`](../../core/dr-gpu/src/adjust.rs#L1557), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:257`](../../ui/dr-ui/src/decoder_seam.rs#L257), [`ui/dr-ui/src/develop/mask_ops.rs:1130`](../../ui/dr-ui/src/develop/mask_ops.rs#L1130), [`ui/dr-ui/src/develop/render.rs:681`](../../ui/dr-ui/src/develop/render.rs#L681), [`ui/dr-ui/src/develop/render.rs:723`](../../ui/dr-ui/src/develop/render.rs#L723), [`ui/dr-ui/src/lib.rs:668`](../../ui/dr-ui/src/lib.rs#L668), [`ui/dr-ui/src/library/sweep.rs:563`](../../ui/dr-ui/src/library/sweep.rs#L563), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | | FR-INF-1 | [`ui/dr-ui/src/lib.rs:1537`](../../ui/dr-ui/src/lib.rs#L1537), [`ui/dr-ui/ui/settings.slint:824`](../../ui/dr-ui/ui/settings.slint#L824) | | FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:2000`](../../ui/dr-ui/src/lib.rs#L2000), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1533`](../../ui/dr-ui/ui/app.slint#L1533), [`ui/dr-ui/ui/app.slint:592`](../../ui/dr-ui/ui/app.slint#L592), [`ui/dr-ui/ui/library.slint:2049`](../../ui/dr-ui/ui/library.slint#L2049), [`ui/dr-ui/ui/library.slint:5197`](../../ui/dr-ui/ui/library.slint#L5197), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | | FR-MRG-10 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`core/dr-pano/src/seam.rs:1`](../../core/dr-pano/src/seam.rs#L1) | @@ -124,15 +124,15 @@ _None._ | FR-NC-12 | [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:1124`](../../core/dr-sync-nextcloud/src/lib.rs#L1124), [`core/dr-sync-nextcloud/src/lib.rs:40`](../../core/dr-sync-nextcloud/src/lib.rs#L40), [`core/dr-sync-nextcloud/src/provider.rs:1`](../../core/dr-sync-nextcloud/src/provider.rs#L1), [`core/dr-sync/src/account.rs:1`](../../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:87`](../../core/dr-sync/src/account.rs#L87), [`core/dr-sync/src/lib.rs:238`](../../core/dr-sync/src/lib.rs#L238), [`core/dr-sync/src/lib.rs:51`](../../core/dr-sync/src/lib.rs#L51), [`core/dr-sync/src/provider.rs:120`](../../core/dr-sync/src/provider.rs#L120), [`core/dr-sync/src/provider.rs:1`](../../core/dr-sync/src/provider.rs#L1), [`core/dr-sync/src/provider.rs:53`](../../core/dr-sync/src/provider.rs#L53), [`core/dr-sync/src/reachability.rs:1`](../../core/dr-sync/src/reachability.rs#L1), [`ui/dr-ui/src/remote.rs:1`](../../ui/dr-ui/src/remote.rs#L1) | | FR-NC-13 | [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-folder/src/lib.rs:73`](../../core/dr-sync-folder/src/lib.rs#L73), [`core/dr-sync/src/provider.rs:120`](../../core/dr-sync/src/provider.rs#L120), [`ui/dr-ui/src/launch_ui.rs:425`](../../ui/dr-ui/src/launch_ui.rs#L425), [`ui/dr-ui/src/remote.rs:1`](../../ui/dr-ui/src/remote.rs#L1) | | FR-NC-2 | [`core/dr-sync/src/account.rs:1`](../../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:318`](../../core/dr-sync/src/account.rs#L318), [`core/dr-sync/src/account.rs:375`](../../core/dr-sync/src/account.rs#L375), [`core/dr-sync/src/account.rs:59`](../../core/dr-sync/src/account.rs#L59), [`platform/dr-plat/src/secrets.rs:82`](../../platform/dr-plat/src/secrets.rs#L82) | -| FR-NC-3 | [`core/dr-decode/src/locate.rs:1`](../../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../../core/dr-decode/src/preview.rs#L148), [`core/dr-sync/src/capability.rs:85`](../../core/dr-sync/src/capability.rs#L85), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:216`](../../ui/dr-ui/src/decoder_seam.rs#L216), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library/sweep.rs:590`](../../ui/dr-ui/src/library/sweep.rs#L590), [`ui/dr-ui/src/library_ui/grid.rs:582`](../../ui/dr-ui/src/library_ui/grid.rs#L582), [`ui/dr-ui/src/library_ui/mod.rs:1`](../../ui/dr-ui/src/library_ui/mod.rs#L1), [`ui/dr-ui/src/library_ui/sync.rs:377`](../../ui/dr-ui/src/library_ui/sync.rs#L377), [`ui/dr-ui/ui/library.slint:803`](../../ui/dr-ui/ui/library.slint#L803), [`ui/dr-ui/ui/settings.slint:375`](../../ui/dr-ui/ui/settings.slint#L375), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | +| FR-NC-3 | [`core/dr-decode/src/locate.rs:1`](../../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../../core/dr-decode/src/preview.rs#L148), [`core/dr-sync/src/capability.rs:85`](../../core/dr-sync/src/capability.rs#L85), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:216`](../../ui/dr-ui/src/decoder_seam.rs#L216), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library/sweep.rs:615`](../../ui/dr-ui/src/library/sweep.rs#L615), [`ui/dr-ui/src/library_ui/grid.rs:582`](../../ui/dr-ui/src/library_ui/grid.rs#L582), [`ui/dr-ui/src/library_ui/mod.rs:1`](../../ui/dr-ui/src/library_ui/mod.rs#L1), [`ui/dr-ui/src/library_ui/sync.rs:377`](../../ui/dr-ui/src/library_ui/sync.rs#L377), [`ui/dr-ui/ui/library.slint:803`](../../ui/dr-ui/ui/library.slint#L803), [`ui/dr-ui/ui/settings.slint:375`](../../ui/dr-ui/ui/settings.slint#L375), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | | FR-NC-4 | [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-nextcloud/src/propfind.rs:103`](../../core/dr-sync-nextcloud/src/propfind.rs#L103), [`core/dr-sync-nextcloud/src/propfind.rs:51`](../../core/dr-sync-nextcloud/src/propfind.rs#L51), [`core/dr-sync/src/capability.rs:6`](../../core/dr-sync/src/capability.rs#L6), [`core/dr-sync/src/lib.rs:238`](../../core/dr-sync/src/lib.rs#L238), [`core/dr-sync/src/scan.rs:129`](../../core/dr-sync/src/scan.rs#L129), [`ui/dr-ui/src/launch.rs:61`](../../ui/dr-ui/src/launch.rs#L61) | | FR-NC-5 | [`core/dr-sync-nextcloud/src/propfind.rs:51`](../../core/dr-sync-nextcloud/src/propfind.rs#L51), [`ui/dr-ui/src/import.rs:503`](../../ui/dr-ui/src/import.rs#L503) | | FR-NC-6 | [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1) | | FR-NC-6a | [`core/dr-catalog/src/cache.rs:1`](../../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-catalog/src/schema.rs:1221`](../../core/dr-catalog/src/schema.rs#L1221), [`core/dr-catalog/src/schema.rs:1706`](../../core/dr-catalog/src/schema.rs#L1706), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-types/src/selector.rs:1`](../../core/dr-types/src/selector.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/activity.rs:423`](../../ui/dr-ui/src/activity.rs#L423), [`ui/dr-ui/src/collections_ui/rename_menu.rs:75`](../../ui/dr-ui/src/collections_ui/rename_menu.rs#L75), [`ui/dr-ui/src/collections_ui/tree_sync.rs:116`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L116), [`ui/dr-ui/src/collections_ui/tree_sync.rs:392`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L392), [`ui/dr-ui/src/collections_ui/tree_sync.rs:43`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L43), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:560`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L560), [`ui/dr-ui/src/lib.rs:1710`](../../ui/dr-ui/src/lib.rs#L1710), [`ui/dr-ui/src/lib.rs:2379`](../../ui/dr-ui/src/lib.rs#L2379), [`ui/dr-ui/src/lib.rs:2839`](../../ui/dr-ui/src/lib.rs#L2839), [`ui/dr-ui/src/lib.rs:2851`](../../ui/dr-ui/src/lib.rs#L2851), [`ui/dr-ui/src/lib.rs:2896`](../../ui/dr-ui/src/lib.rs#L2896), [`ui/dr-ui/src/lib.rs:2961`](../../ui/dr-ui/src/lib.rs#L2961), [`ui/dr-ui/src/lib.rs:3196`](../../ui/dr-ui/src/lib.rs#L3196), [`ui/dr-ui/src/lib.rs:3197`](../../ui/dr-ui/src/lib.rs#L3197), [`ui/dr-ui/src/lib.rs:3236`](../../ui/dr-ui/src/lib.rs#L3236), [`ui/dr-ui/src/library/thumbnails_fetch.rs:119`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L119), [`ui/dr-ui/src/library/thumbnails_fetch.rs:394`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L394), [`ui/dr-ui/src/library/thumbnails_fetch.rs:607`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L607), [`ui/dr-ui/src/library/thumbnails_fetch.rs:624`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L624), [`ui/dr-ui/src/library/thumbnails_fetch.rs:638`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L638), [`ui/dr-ui/src/library/thumbnails_fetch.rs:792`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L792), [`ui/dr-ui/src/library/thumbnails_fetch.rs:807`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L807), [`ui/dr-ui/src/library/thumbnails_fetch.rs:96`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L96), [`ui/dr-ui/src/library_ui/controller.rs:379`](../../ui/dr-ui/src/library_ui/controller.rs#L379), [`ui/dr-ui/src/library_ui/controller.rs:390`](../../ui/dr-ui/src/library_ui/controller.rs#L390), [`ui/dr-ui/src/library_ui/controller.rs:405`](../../ui/dr-ui/src/library_ui/controller.rs#L405), [`ui/dr-ui/src/library_ui/controller.rs:414`](../../ui/dr-ui/src/library_ui/controller.rs#L414), [`ui/dr-ui/src/library_ui/controller.rs:422`](../../ui/dr-ui/src/library_ui/controller.rs#L422), [`ui/dr-ui/src/library_ui/controller.rs:558`](../../ui/dr-ui/src/library_ui/controller.rs#L558), [`ui/dr-ui/src/library_ui/controller.rs:568`](../../ui/dr-ui/src/library_ui/controller.rs#L568), [`ui/dr-ui/src/library_ui/controller.rs:583`](../../ui/dr-ui/src/library_ui/controller.rs#L583), [`ui/dr-ui/src/library_ui/controller.rs:630`](../../ui/dr-ui/src/library_ui/controller.rs#L630), [`ui/dr-ui/src/library_ui/controller.rs:645`](../../ui/dr-ui/src/library_ui/controller.rs#L645), [`ui/dr-ui/src/library_ui/controller.rs:673`](../../ui/dr-ui/src/library_ui/controller.rs#L673), [`ui/dr-ui/src/library_ui/controller.rs:747`](../../ui/dr-ui/src/library_ui/controller.rs#L747), [`ui/dr-ui/src/library_ui/controller.rs:778`](../../ui/dr-ui/src/library_ui/controller.rs#L778), [`ui/dr-ui/src/library_ui/controller.rs:790`](../../ui/dr-ui/src/library_ui/controller.rs#L790), [`ui/dr-ui/src/library_ui/filter_bar.rs:480`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L480), [`ui/dr-ui/src/library_ui/filter_bar.rs:500`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L500), [`ui/dr-ui/src/library_ui/offline.rs:196`](../../ui/dr-ui/src/library_ui/offline.rs#L196), [`ui/dr-ui/src/library_ui/offline.rs:20`](../../ui/dr-ui/src/library_ui/offline.rs#L20), [`ui/dr-ui/src/library_ui/offline.rs:261`](../../ui/dr-ui/src/library_ui/offline.rs#L261), [`ui/dr-ui/src/library_ui/offline.rs:407`](../../ui/dr-ui/src/library_ui/offline.rs#L407), [`ui/dr-ui/src/library_ui/offline.rs:528`](../../ui/dr-ui/src/library_ui/offline.rs#L528), [`ui/dr-ui/src/library_ui/offline.rs:93`](../../ui/dr-ui/src/library_ui/offline.rs#L93), [`ui/dr-ui/src/library_ui/window.rs:372`](../../ui/dr-ui/src/library_ui/window.rs#L372), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:121`](../../ui/dr-ui/src/settings_ui.rs#L121), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:508`](../../ui/dr-ui/src/settings_ui.rs#L508), [`ui/dr-ui/ui/app.slint:1418`](../../ui/dr-ui/ui/app.slint#L1418), [`ui/dr-ui/ui/app.slint:156`](../../ui/dr-ui/ui/app.slint#L156), [`ui/dr-ui/ui/app.slint:2009`](../../ui/dr-ui/ui/app.slint#L2009), [`ui/dr-ui/ui/app.slint:3473`](../../ui/dr-ui/ui/app.slint#L3473), [`ui/dr-ui/ui/app.slint:483`](../../ui/dr-ui/ui/app.slint#L483), [`ui/dr-ui/ui/collections.slint:1138`](../../ui/dr-ui/ui/collections.slint#L1138), [`ui/dr-ui/ui/collections.slint:1149`](../../ui/dr-ui/ui/collections.slint#L1149), [`ui/dr-ui/ui/collections.slint:1228`](../../ui/dr-ui/ui/collections.slint#L1228), [`ui/dr-ui/ui/collections.slint:1329`](../../ui/dr-ui/ui/collections.slint#L1329), [`ui/dr-ui/ui/collections.slint:1337`](../../ui/dr-ui/ui/collections.slint#L1337), [`ui/dr-ui/ui/collections.slint:290`](../../ui/dr-ui/ui/collections.slint#L290), [`ui/dr-ui/ui/collections.slint:447`](../../ui/dr-ui/ui/collections.slint#L447), [`ui/dr-ui/ui/collections.slint:456`](../../ui/dr-ui/ui/collections.slint#L456), [`ui/dr-ui/ui/collections.slint:459`](../../ui/dr-ui/ui/collections.slint#L459), [`ui/dr-ui/ui/collections.slint:505`](../../ui/dr-ui/ui/collections.slint#L505), [`ui/dr-ui/ui/collections.slint:55`](../../ui/dr-ui/ui/collections.slint#L55), [`ui/dr-ui/ui/collections.slint:764`](../../ui/dr-ui/ui/collections.slint#L764), [`ui/dr-ui/ui/collections.slint:94`](../../ui/dr-ui/ui/collections.slint#L94), [`ui/dr-ui/ui/collections.slint:978`](../../ui/dr-ui/ui/collections.slint#L978), [`ui/dr-ui/ui/icons.slint:263`](../../ui/dr-ui/ui/icons.slint#L263), [`ui/dr-ui/ui/settings.slint:121`](../../ui/dr-ui/ui/settings.slint#L121), [`ui/dr-ui/ui/settings.slint:635`](../../ui/dr-ui/ui/settings.slint#L635) | | FR-NC-6b | [`ui/dr-ui/src/library_ui/offline.rs:261`](../../ui/dr-ui/src/library_ui/offline.rs#L261), [`ui/dr-ui/src/memory.rs:1`](../../ui/dr-ui/src/memory.rs#L1) | -| FR-NC-6c | [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-folder/src/lib.rs:73`](../../core/dr-sync-folder/src/lib.rs#L73), [`core/dr-sync-folder/src/lib.rs:818`](../../core/dr-sync-folder/src/lib.rs#L818), [`core/dr-sync-folder/src/lib.rs:857`](../../core/dr-sync-folder/src/lib.rs#L857), [`core/dr-sync-folder/src/vfs.rs:1`](../../core/dr-sync-folder/src/vfs.rs#L1), [`core/dr-sync-nextcloud/src/desktop_client.rs:172`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L172), [`core/dr-sync-nextcloud/src/desktop_client.rs:35`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`core/dr-sync/src/capability.rs:41`](../../core/dr-sync/src/capability.rs#L41), [`core/dr-sync/src/error.rs:39`](../../core/dr-sync/src/error.rs#L39), [`core/dr-sync/src/lib.rs:178`](../../core/dr-sync/src/lib.rs#L178), [`core/dr-sync/src/types.rs:101`](../../core/dr-sync/src/types.rs#L101), [`core/dr-types/src/lib.rs:125`](../../core/dr-types/src/lib.rs#L125), [`core/dr-types/src/lib.rs:207`](../../core/dr-types/src/lib.rs#L207), [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/collections_ui/tree_sync.rs:116`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L116), [`ui/dr-ui/src/collections_ui/tree_sync.rs:392`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L392), [`ui/dr-ui/src/collections_ui/tree_sync.rs:43`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L43), [`ui/dr-ui/src/derived_sync.rs:1181`](../../ui/dr-ui/src/derived_sync.rs#L1181), [`ui/dr-ui/src/derived_sync.rs:669`](../../ui/dr-ui/src/derived_sync.rs#L669), [`ui/dr-ui/src/library/sidecar.rs:539`](../../ui/dr-ui/src/library/sidecar.rs#L539), [`ui/dr-ui/src/library/sweep.rs:713`](../../ui/dr-ui/src/library/sweep.rs#L713), [`ui/dr-ui/src/library/thumbnails_fetch.rs:216`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L216), [`ui/dr-ui/src/library/thumbnails_fetch.rs:306`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L306), [`ui/dr-ui/src/library_ui/offline.rs:20`](../../ui/dr-ui/src/library_ui/offline.rs#L20), [`ui/dr-ui/src/library_ui/offline.rs:310`](../../ui/dr-ui/src/library_ui/offline.rs#L310), [`ui/dr-ui/src/library_ui/offline.rs:93`](../../ui/dr-ui/src/library_ui/offline.rs#L93), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1155`](../../ui/dr-ui/src/repairs.rs#L1155), [`ui/dr-ui/ui/collections.slint:290`](../../ui/dr-ui/ui/collections.slint#L290), [`ui/dr-ui/ui/collections.slint:978`](../../ui/dr-ui/ui/collections.slint#L978), [`ui/dr-ui/ui/icons.slint:263`](../../ui/dr-ui/ui/icons.slint#L263) | +| FR-NC-6c | [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-folder/src/lib.rs:73`](../../core/dr-sync-folder/src/lib.rs#L73), [`core/dr-sync-folder/src/lib.rs:818`](../../core/dr-sync-folder/src/lib.rs#L818), [`core/dr-sync-folder/src/lib.rs:857`](../../core/dr-sync-folder/src/lib.rs#L857), [`core/dr-sync-folder/src/vfs.rs:1`](../../core/dr-sync-folder/src/vfs.rs#L1), [`core/dr-sync-nextcloud/src/desktop_client.rs:172`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L172), [`core/dr-sync-nextcloud/src/desktop_client.rs:35`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`core/dr-sync/src/capability.rs:41`](../../core/dr-sync/src/capability.rs#L41), [`core/dr-sync/src/error.rs:39`](../../core/dr-sync/src/error.rs#L39), [`core/dr-sync/src/lib.rs:178`](../../core/dr-sync/src/lib.rs#L178), [`core/dr-sync/src/types.rs:101`](../../core/dr-sync/src/types.rs#L101), [`core/dr-types/src/lib.rs:125`](../../core/dr-types/src/lib.rs#L125), [`core/dr-types/src/lib.rs:207`](../../core/dr-types/src/lib.rs#L207), [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/collections_ui/tree_sync.rs:116`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L116), [`ui/dr-ui/src/collections_ui/tree_sync.rs:392`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L392), [`ui/dr-ui/src/collections_ui/tree_sync.rs:43`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L43), [`ui/dr-ui/src/derived_sync.rs:1181`](../../ui/dr-ui/src/derived_sync.rs#L1181), [`ui/dr-ui/src/derived_sync.rs:669`](../../ui/dr-ui/src/derived_sync.rs#L669), [`ui/dr-ui/src/library/sidecar.rs:539`](../../ui/dr-ui/src/library/sidecar.rs#L539), [`ui/dr-ui/src/library/sweep.rs:738`](../../ui/dr-ui/src/library/sweep.rs#L738), [`ui/dr-ui/src/library/thumbnails_fetch.rs:216`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L216), [`ui/dr-ui/src/library/thumbnails_fetch.rs:306`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L306), [`ui/dr-ui/src/library_ui/offline.rs:20`](../../ui/dr-ui/src/library_ui/offline.rs#L20), [`ui/dr-ui/src/library_ui/offline.rs:310`](../../ui/dr-ui/src/library_ui/offline.rs#L310), [`ui/dr-ui/src/library_ui/offline.rs:93`](../../ui/dr-ui/src/library_ui/offline.rs#L93), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1155`](../../ui/dr-ui/src/repairs.rs#L1155), [`ui/dr-ui/ui/collections.slint:290`](../../ui/dr-ui/ui/collections.slint#L290), [`ui/dr-ui/ui/collections.slint:978`](../../ui/dr-ui/ui/collections.slint#L978), [`ui/dr-ui/ui/icons.slint:263`](../../ui/dr-ui/ui/icons.slint#L263) | | FR-NC-6d | [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-folder/src/vfs.rs:1`](../../core/dr-sync-folder/src/vfs.rs#L1) | -| FR-NC-7 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:120`](../../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library/sweep.rs:590`](../../ui/dr-ui/src/library/sweep.rs#L590), [`ui/dr-ui/src/library_ui/sync.rs:377`](../../ui/dr-ui/src/library_ui/sync.rs#L377), [`ui/dr-ui/ui/settings.slint:375`](../../ui/dr-ui/ui/settings.slint#L375) | +| FR-NC-7 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:120`](../../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library/sweep.rs:615`](../../ui/dr-ui/src/library/sweep.rs#L615), [`ui/dr-ui/src/library_ui/sync.rs:377`](../../ui/dr-ui/src/library_ui/sync.rs#L377), [`ui/dr-ui/ui/settings.slint:375`](../../ui/dr-ui/ui/settings.slint#L375) | | FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs:101`](../../ui/dr-ui/src/import.rs#L101), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1946`](../../ui/dr-ui/src/lib.rs#L1946), [`ui/dr-ui/ui/import.slint:6`](../../ui/dr-ui/ui/import.slint#L6) | | FR-NC-7b | [`core/dr-ingest/src/lib.rs:733`](../../core/dr-ingest/src/lib.rs#L733), [`core/dr-sync/src/upload.rs:1`](../../core/dr-sync/src/upload.rs#L1), [`ui/dr-ui/src/import.rs:101`](../../ui/dr-ui/src/import.rs#L101), [`ui/dr-ui/src/import.rs:126`](../../ui/dr-ui/src/import.rs#L126), [`ui/dr-ui/src/import.rs:345`](../../ui/dr-ui/src/import.rs#L345), [`ui/dr-ui/src/import.rs:599`](../../ui/dr-ui/src/import.rs#L599), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1946`](../../ui/dr-ui/src/lib.rs#L1946) | | FR-NC-8 | [`core/dr-catalog/src/rating.rs:1225`](../../core/dr-catalog/src/rating.rs#L1225), [`core/dr-catalog/src/rating.rs:210`](../../core/dr-catalog/src/rating.rs#L210), [`core/dr-catalog/src/rating.rs:72`](../../core/dr-catalog/src/rating.rs#L72), [`core/dr-catalog/src/schema.rs:330`](../../core/dr-catalog/src/schema.rs#L330), [`core/dr-pipeline/src/sidecar.rs:140`](../../core/dr-pipeline/src/sidecar.rs#L140), [`core/dr-pipeline/src/sidecar.rs:3066`](../../core/dr-pipeline/src/sidecar.rs#L3066), [`core/dr-pipeline/src/sidecar.rs:679`](../../core/dr-pipeline/src/sidecar.rs#L679), [`core/dr-pipeline/src/sidecar.rs:754`](../../core/dr-pipeline/src/sidecar.rs#L754), [`core/dr-pipeline/src/sidecar.rs:99`](../../core/dr-pipeline/src/sidecar.rs#L99), [`ui/dr-ui/src/lib.rs:2809`](../../ui/dr-ui/src/lib.rs#L2809), [`ui/dr-ui/src/library/sidecar.rs:12`](../../ui/dr-ui/src/library/sidecar.rs#L12), [`ui/dr-ui/src/library/sidecar.rs:274`](../../ui/dr-ui/src/library/sidecar.rs#L274), [`ui/dr-ui/src/library/sidecar.rs:581`](../../ui/dr-ui/src/library/sidecar.rs#L581), [`ui/dr-ui/src/library/thumbnails_fetch.rs:514`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L514), [`ui/dr-ui/src/library_ui/controller.rs:699`](../../ui/dr-ui/src/library_ui/controller.rs#L699), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336) | @@ -148,7 +148,7 @@ _None._ | FR-PLAT-WIN-2 | [`apps/darkroom-desktop/build.rs:1`](../../apps/darkroom-desktop/build.rs#L1), [`apps/darkroom-desktop/src/main.rs:6`](../../apps/darkroom-desktop/src/main.rs#L6), [`ui/dr-ui/src/launch_ui.rs:937`](../../ui/dr-ui/src/launch_ui.rs#L937) | | FR-PLAT-WIN-3 | [`apps/darkroom-desktop/src/main.rs:19`](../../apps/darkroom-desktop/src/main.rs#L19) | | FR-RAW-1 | [`core/dr-decode/src/lib.rs:266`](../../core/dr-decode/src/lib.rs#L266), [`core/dr-types/src/lib.rs:135`](../../core/dr-types/src/lib.rs#L135), [`core/dr-types/src/lib.rs:206`](../../core/dr-types/src/lib.rs#L206) | -| FR-RAW-2 | [`core/dr-decode/src/decoder.rs:1`](../../core/dr-decode/src/decoder.rs#L1), [`core/dr-decode/src/decoder.rs:26`](../../core/dr-decode/src/decoder.rs#L26), [`core/dr-decode/src/decoder.rs:59`](../../core/dr-decode/src/decoder.rs#L59), [`core/dr-decode/src/decoder.rs:95`](../../core/dr-decode/src/decoder.rs#L95), [`ui/dr-ui/src/decoder_seam.rs:185`](../../ui/dr-ui/src/decoder_seam.rs#L185), [`ui/dr-ui/src/decoder_seam.rs:1`](../../ui/dr-ui/src/decoder_seam.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:216`](../../ui/dr-ui/src/decoder_seam.rs#L216), [`ui/dr-ui/src/decoder_seam.rs:257`](../../ui/dr-ui/src/decoder_seam.rs#L257), [`ui/dr-ui/src/export.rs:1238`](../../ui/dr-ui/src/export.rs#L1238), [`ui/dr-ui/src/export.rs:973`](../../ui/dr-ui/src/export.rs#L973), [`ui/dr-ui/src/import.rs:96`](../../ui/dr-ui/src/import.rs#L96), [`ui/dr-ui/src/library/sweep.rs:301`](../../ui/dr-ui/src/library/sweep.rs#L301), [`ui/dr-ui/src/library/sweep.rs:629`](../../ui/dr-ui/src/library/sweep.rs#L629), [`ui/dr-ui/src/library/thumbnails_gen.rs:109`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L109), [`ui/dr-ui/src/merge.rs:119`](../../ui/dr-ui/src/merge.rs#L119), [`ui/dr-ui/src/repairs.rs:243`](../../ui/dr-ui/src/repairs.rs#L243) | +| FR-RAW-2 | [`core/dr-decode/src/decoder.rs:1`](../../core/dr-decode/src/decoder.rs#L1), [`core/dr-decode/src/decoder.rs:26`](../../core/dr-decode/src/decoder.rs#L26), [`core/dr-decode/src/decoder.rs:59`](../../core/dr-decode/src/decoder.rs#L59), [`core/dr-decode/src/decoder.rs:95`](../../core/dr-decode/src/decoder.rs#L95), [`ui/dr-ui/src/decoder_seam.rs:185`](../../ui/dr-ui/src/decoder_seam.rs#L185), [`ui/dr-ui/src/decoder_seam.rs:1`](../../ui/dr-ui/src/decoder_seam.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:216`](../../ui/dr-ui/src/decoder_seam.rs#L216), [`ui/dr-ui/src/decoder_seam.rs:257`](../../ui/dr-ui/src/decoder_seam.rs#L257), [`ui/dr-ui/src/export.rs:1238`](../../ui/dr-ui/src/export.rs#L1238), [`ui/dr-ui/src/export.rs:973`](../../ui/dr-ui/src/export.rs#L973), [`ui/dr-ui/src/import.rs:96`](../../ui/dr-ui/src/import.rs#L96), [`ui/dr-ui/src/library/sweep.rs:322`](../../ui/dr-ui/src/library/sweep.rs#L322), [`ui/dr-ui/src/library/sweep.rs:654`](../../ui/dr-ui/src/library/sweep.rs#L654), [`ui/dr-ui/src/library/thumbnails_gen.rs:109`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L109), [`ui/dr-ui/src/merge.rs:119`](../../ui/dr-ui/src/merge.rs#L119), [`ui/dr-ui/src/repairs.rs:243`](../../ui/dr-ui/src/repairs.rs#L243) | | FR-RAW-3 | [`core/dr-decode/src/lib.rs:162`](../../core/dr-decode/src/lib.rs#L162), [`core/dr-decode/src/lib.rs:564`](../../core/dr-decode/src/lib.rs#L564), [`core/dr-decode/src/locate.rs:1435`](../../core/dr-decode/src/locate.rs#L1435), [`core/dr-gpu/src/demosaic.rs:1063`](../../core/dr-gpu/src/demosaic.rs#L1063), [`core/dr-gpu/src/demosaic.rs:1409`](../../core/dr-gpu/src/demosaic.rs#L1409), [`core/dr-gpu/src/demosaic.rs:868`](../../core/dr-gpu/src/demosaic.rs#L868), [`core/dr-gpu/tests/hot_pixels.rs:1`](../../core/dr-gpu/tests/hot_pixels.rs#L1) | | FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:295`](../../ui/dr-ui/src/lib.rs#L295) | | FR-RAW-5 | [`core/dr-decode/src/lib.rs:190`](../../core/dr-decode/src/lib.rs#L190), [`core/dr-gpu/src/demosaic.rs:1204`](../../core/dr-gpu/src/demosaic.rs#L1204), [`core/dr-gpu/src/demosaic.rs:1283`](../../core/dr-gpu/src/demosaic.rs#L1283), [`core/dr-gpu/src/demosaic.rs:1407`](../../core/dr-gpu/src/demosaic.rs#L1407), [`core/dr-gpu/src/demosaic.rs:34`](../../core/dr-gpu/src/demosaic.rs#L34) | @@ -188,7 +188,7 @@ _None._ | NFR-R7 | [`core/dr-gpu/src/error.rs:1`](../../core/dr-gpu/src/error.rs#L1) | | NFR-R8 | [`core/dr-gpu/src/error.rs:1`](../../core/dr-gpu/src/error.rs#L1) | | NFR-RES-1 | [`core/dr-gpu/src/adjust.rs:1472`](../../core/dr-gpu/src/adjust.rs#L1472), [`core/dr-pipeline/src/history.rs:86`](../../core/dr-pipeline/src/history.rs#L86), [`ui/dr-ui/src/develop/render.rs:654`](../../ui/dr-ui/src/develop/render.rs#L654), [`ui/dr-ui/src/identity_ui.rs:125`](../../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:118`](../../ui/dr-ui/src/lib.rs#L118), [`ui/dr-ui/src/memory.rs:1`](../../ui/dr-ui/src/memory.rs#L1) | -| NFR-RES-2 | [`core/dr-gpu/src/adjust.rs:1419`](../../core/dr-gpu/src/adjust.rs#L1419), [`core/dr-gpu/src/demosaic.rs:122`](../../core/dr-gpu/src/demosaic.rs#L122), [`core/dr-gpu/src/demosaic.rs:169`](../../core/dr-gpu/src/demosaic.rs#L169), [`core/dr-gpu/src/demosaic.rs:451`](../../core/dr-gpu/src/demosaic.rs#L451), [`core/dr-gpu/tests/source_window.rs:1`](../../core/dr-gpu/tests/source_window.rs#L1), [`core/dr-pipeline/src/graph.rs:317`](../../core/dr-pipeline/src/graph.rs#L317), [`core/dr-pipeline/src/operation.rs:1794`](../../core/dr-pipeline/src/operation.rs#L1794), [`core/dr-pipeline/src/operation.rs:615`](../../core/dr-pipeline/src/operation.rs#L615), [`core/dr-pipeline/src/tiles.rs:1`](../../core/dr-pipeline/src/tiles.rs#L1), [`ui/dr-ui/src/develop/render.rs:1894`](../../ui/dr-ui/src/develop/render.rs#L1894), [`ui/dr-ui/src/develop/render.rs:1973`](../../ui/dr-ui/src/develop/render.rs#L1973), [`ui/dr-ui/src/develop/render.rs:216`](../../ui/dr-ui/src/develop/render.rs#L216), [`ui/dr-ui/src/develop/render.rs:23`](../../ui/dr-ui/src/develop/render.rs#L23), [`ui/dr-ui/src/develop/render.rs:770`](../../ui/dr-ui/src/develop/render.rs#L770), [`ui/dr-ui/src/develop/session.rs:130`](../../ui/dr-ui/src/develop/session.rs#L130), [`ui/dr-ui/src/develop/session.rs:343`](../../ui/dr-ui/src/develop/session.rs#L343), [`ui/dr-ui/src/develop/session.rs:370`](../../ui/dr-ui/src/develop/session.rs#L370), [`ui/dr-ui/src/faces.rs:463`](../../ui/dr-ui/src/faces.rs#L463), [`ui/dr-ui/src/library/sweep.rs:264`](../../ui/dr-ui/src/library/sweep.rs#L264), [`ui/dr-ui/src/repairs.rs:1155`](../../ui/dr-ui/src/repairs.rs#L1155), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1) | +| NFR-RES-2 | [`core/dr-gpu/src/adjust.rs:1419`](../../core/dr-gpu/src/adjust.rs#L1419), [`core/dr-gpu/src/demosaic.rs:122`](../../core/dr-gpu/src/demosaic.rs#L122), [`core/dr-gpu/src/demosaic.rs:169`](../../core/dr-gpu/src/demosaic.rs#L169), [`core/dr-gpu/src/demosaic.rs:451`](../../core/dr-gpu/src/demosaic.rs#L451), [`core/dr-gpu/tests/source_window.rs:1`](../../core/dr-gpu/tests/source_window.rs#L1), [`core/dr-pipeline/src/graph.rs:317`](../../core/dr-pipeline/src/graph.rs#L317), [`core/dr-pipeline/src/operation.rs:1794`](../../core/dr-pipeline/src/operation.rs#L1794), [`core/dr-pipeline/src/operation.rs:615`](../../core/dr-pipeline/src/operation.rs#L615), [`core/dr-pipeline/src/tiles.rs:1`](../../core/dr-pipeline/src/tiles.rs#L1), [`ui/dr-ui/src/develop/render.rs:1894`](../../ui/dr-ui/src/develop/render.rs#L1894), [`ui/dr-ui/src/develop/render.rs:1973`](../../ui/dr-ui/src/develop/render.rs#L1973), [`ui/dr-ui/src/develop/render.rs:216`](../../ui/dr-ui/src/develop/render.rs#L216), [`ui/dr-ui/src/develop/render.rs:23`](../../ui/dr-ui/src/develop/render.rs#L23), [`ui/dr-ui/src/develop/render.rs:770`](../../ui/dr-ui/src/develop/render.rs#L770), [`ui/dr-ui/src/develop/session.rs:130`](../../ui/dr-ui/src/develop/session.rs#L130), [`ui/dr-ui/src/develop/session.rs:343`](../../ui/dr-ui/src/develop/session.rs#L343), [`ui/dr-ui/src/develop/session.rs:370`](../../ui/dr-ui/src/develop/session.rs#L370), [`ui/dr-ui/src/faces.rs:463`](../../ui/dr-ui/src/faces.rs#L463), [`ui/dr-ui/src/library/sweep.rs:285`](../../ui/dr-ui/src/library/sweep.rs#L285), [`ui/dr-ui/src/repairs.rs:1155`](../../ui/dr-ui/src/repairs.rs#L1155), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1) | | NFR-RES-4 | [`core/dr-catalog/src/cache.rs:1`](../../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-catalog/src/schema.rs:1221`](../../core/dr-catalog/src/schema.rs#L1221), [`core/dr-gpu/src/lib.rs:97`](../../core/dr-gpu/src/lib.rs#L97), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`core/dr-thumbs/src/lib.rs:440`](../../core/dr-thumbs/src/lib.rs#L440) | | NFR-SEC-1 | [`core/dr-decode/src/error.rs:1`](../../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30) | | NFR-SEC-2 | [`core/dr-sync/src/account.rs:318`](../../core/dr-sync/src/account.rs#L318), [`platform/dr-plat/src/crash.rs:1`](../../platform/dr-plat/src/crash.rs#L1), [`platform/dr-plat/src/diagnostics.rs:1`](../../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/diagnostics/redact.rs:1`](../../platform/dr-plat/src/diagnostics/redact.rs#L1), [`platform/dr-plat/src/secrets.rs:82`](../../platform/dr-plat/src/secrets.rs#L82) | diff --git a/ui/dr-ui/src/decoder_seam.rs b/ui/dr-ui/src/decoder_seam.rs index f8fa749..e115b5f 100644 --- a/ui/dr-ui/src/decoder_seam.rs +++ b/ui/dr-ui/src/decoder_seam.rs @@ -199,7 +199,7 @@ fn the_catalog_scan_reads_headers_through_the_trait() { &mut found, )); - assert!(reached); + assert!(matches!(reached, crate::library::DateRead::Reached)); assert_eq!(found.len(), 1, "the stub's header was read"); assert_eq!(found[0].image_id, 7); assert_eq!(found[0].camera.as_deref(), Some("Stubco One")); diff --git a/ui/dr-ui/src/library/sweep.rs b/ui/dr-ui/src/library/sweep.rs index d4d688f..566489d 100644 --- a/ui/dr-ui/src/library/sweep.rs +++ b/ui/dr-ui/src/library/sweep.rs @@ -83,7 +83,7 @@ pub(super) fn flush_metadata( /// shards synced from another device, which carry pixels but no metadata. /// Read a header for its date. /// -/// Returns whether the file was **reached**, which the caller needs and cannot +/// Reports whether the file was **reached**, which the caller needs and cannot /// otherwise tell: a header that carried no EXIF and a fetch that never /// happened both leave `found` untouched, and recording the second as "this /// image has no date" would let one lock mark it dateless for good. @@ -92,7 +92,7 @@ pub(crate) async fn read_metadata_only( decoder: &dyn dr_decode::Decoder, req: &ThumbnailRequest, found: &mut Vec, -) -> bool { +) -> DateRead { let id = RemoteId::Path(RemotePath::new(&req.path)); // Retried, because one failure here is usually a lock rather than a @@ -108,7 +108,16 @@ pub(crate) async fn read_metadata_only( match backend.get(&id, Some(0..decoder.header_bytes())).await { Ok(header) => { collect_metadata(backend, decoder, &id, &header, req, found).await; - return true; + return DateRead::Reached; + } + // Not retried, unlike a lock. A dead server answers the second + // attempt exactly as it answered the first, after the same 15 s + // connect timeout — three of those per image turned a window of + // cached-but-undated cells into minutes of "reading dates" + // against nothing, with no banner, because nothing said why. + Err(e) if e.indicates_offline() => { + log::debug!("reading date for {}: {e}", req.path); + return DateRead::Offline(e.to_string()); } Err(e) if e.is_transient() && attempt < ATTEMPTS => { // Backing off at all matters more than the exact interval: the @@ -121,11 +130,23 @@ pub(crate) async fn read_metadata_only( // timeline rather than breaking anything, and the next sweep // retries it regardless. log::debug!("reading date for {} ({attempt} attempts): {e}", req.path); - return false; + return DateRead::Failed; } } } - false + DateRead::Failed +} + +/// What one header read for a date came to. +#[derive(Debug, PartialEq, Eq)] +pub(crate) enum DateRead { + /// The header arrived. Whatever EXIF it held is in `found`. + Reached, + /// This file could not be read; the next pass tries it again. + Failed, + /// The server could not be reached, so no read after this one will be + /// either. The caller stops rather than paying a timeout per image. + Offline(String), } /// Write capture metadata read during the thumbnail pass. @@ -381,8 +402,12 @@ pub fn spawn_sweep(conn: Connection, catalog_path: PathBuf) -> Receiver reached.push(req.image_id), + DateRead::Failed => {} + // The other lanes find the same, each after + // one timeout rather than one per image. + DateRead::Offline(_) => break, } } (found, reached) @@ -901,6 +926,130 @@ pub(super) fn thumbnails_outstanding( mod tests { use super::*; + /// A backend whose every read fails the same way, counting the attempts. + struct Refusing { + error: fn() -> dr_sync::RemoteError, + gets: std::sync::atomic::AtomicUsize, + caps: dr_sync::Capabilities, + } + + #[async_trait::async_trait] + impl RemoteBackend for Refusing { + fn capabilities(&self) -> &dr_sync::Capabilities { + &self.caps + } + fn name(&self) -> &str { + "refusing" + } + async fn list( + &self, + _dir: &RemotePath, + _since: Option<&dr_sync::Validator>, + ) -> Result, dr_sync::RemoteError> { + Err((self.error)()) + } + async fn dir_validator( + &self, + _dir: &RemotePath, + ) -> Result { + Err((self.error)()) + } + async fn delta( + &self, + _c: &dr_sync::Cursor, + ) -> Result<(Vec, dr_sync::Cursor), dr_sync::RemoteError> { + Err((self.error)()) + } + async fn get( + &self, + _id: &RemoteId, + _r: Option>, + ) -> Result, dr_sync::RemoteError> { + self.gets.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + Err((self.error)()) + } + async fn put( + &self, + _p: &RemotePath, + _b: Vec, + _c: Option, + ) -> Result { + Err((self.error)()) + } + async fn delete( + &self, + _id: &RemoteId, + _c: Option, + ) -> Result<(), dr_sync::RemoteError> { + Err((self.error)()) + } + async fn move_to( + &self, + _f: &RemoteId, + _t: &RemotePath, + ) -> Result<(), dr_sync::RemoteError> { + Err((self.error)()) + } + async fn create_dir(&self, _p: &RemotePath) -> Result<(), dr_sync::RemoteError> { + Err((self.error)()) + } + } + + fn read_date_against(error: fn() -> dr_sync::RemoteError) -> (DateRead, usize) { + let backend = Refusing { + error, + gets: Default::default(), + caps: dr_sync::Capabilities::minimal(), + }; + let req = ThumbnailRequest { + row: 0, + path: "a.CR2".into(), + file_id: Some(1), + size: 0, + image_id: 1, + thumb_size: dr_thumbs::ThumbSize::Grid, + needs_metadata: true, + full_resolution: false, + }; + let rt = crate::net_runtime::build().unwrap(); + let outcome = rt.block_on(read_metadata_only( + &backend, + dr_decode::default(), + &req, + &mut Vec::new(), + )); + ( + outcome, + backend.gets.load(std::sync::atomic::Ordering::SeqCst), + ) + } + + #[test] + fn a_date_read_against_a_dead_server_asks_once_and_says_so() { + // Each attempt waited out a 15 s connect timeout, three per image, for + // every cached-but-undated cell in the window — minutes of "reading + // dates" with no banner, because the caller could not tell a dead + // server from a missing file. + let (outcome, gets) = + read_date_against(|| dr_sync::RemoteError::Network("connection refused".into())); + + assert!(matches!(outcome, DateRead::Offline(_)), "{outcome:?}"); + assert_eq!(gets, 1, "retrying a dead server buys another timeout"); + } + + #[test] + fn a_date_read_that_hits_a_lock_still_retries() { + // The reason the retry exists: Nextcloud answers a read with 423 under + // our own concurrency, and the same range succeeds moments later. + let (outcome, gets) = read_date_against(|| dr_sync::RemoteError::Server { + status: 423, + detail: "locked".into(), + }); + + assert_eq!(outcome, DateRead::Failed); + assert_eq!(gets, 3); + } + #[test] fn a_header_gives_the_size_the_photograph_is_seen_at() { let mut md = dr_decode::Metadata { diff --git a/ui/dr-ui/src/library/thumbnails_gen.rs b/ui/dr-ui/src/library/thumbnails_gen.rs index f2b4cd3..8cb910f 100644 --- a/ui/dr-ui/src/library/thumbnails_gen.rs +++ b/ui/dr-ui/src/library/thumbnails_gen.rs @@ -9,7 +9,7 @@ use dr_thumbs::ThumbStore; use std::path::PathBuf; use std::sync::mpsc::Receiver; -use super::sweep::{flush_metadata, read_metadata_only, MetadataFound}; +use super::sweep::{flush_metadata, read_metadata_only, DateRead, MetadataFound}; #[cfg(test)] use super::sweep::{thumbnails_outstanding, SWEEP_THUMB_SIZE}; use super::thumbnails_fetch::{ThumbnailRequest, MAX_PREVIEW_BYTES}; @@ -226,7 +226,14 @@ pub fn spawn_thumbnails( if tx.send(ThumbnailMessage::DateProgress).is_err() { break; } - read_metadata_only(&*backend, decoder, &req, &mut found).await; + if let DateRead::Offline(reason) = + read_metadata_only(&*backend, decoder, &req, &mut found).await + { + // Said once, as the fetch loop does, so the banner goes + // up and the bar stops rather than sweeping for ever. + let _ = tx.send(ThumbnailMessage::Offline { reason }); + break; + } if found.len() >= FLUSH_EVERY { flush_metadata(&catalog_path, &mut found, &tx);