From 4f31123b0c19a534e9d656fb10158a80869ccdf2 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Fri, 11 Sep 2026 20:31:06 +0200 Subject: [PATCH] Let the user choose which SCRFD finds their faces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit faces.md §12.3 measured what the cheapest detector costs: the small faces in every group shot, and a dog embedded a dozen times. Which trade is right depends on the machine doing the sweep — a desktop left overnight and a tablet on a battery want different answers — so the detector is now a per-device setting, Fast / Balanced / Thorough on the settings page beside the indexing button, persisted with the rest of the settings file. A detector is half of a model id. Every face, marker, shard and calibration is keyed on faces.model_id precisely so that a model change is a new id and a re-index rather than a silent change under existing data, and a detector change is a model change: it decides which faces exist and where the landmarks that align them land. So each choice names its own pipeline. 500M keeps the bare "w600k_mbf" every existing library was written under, so an upgrade disturbs nothing; the others are qualified. Choosing one restarts coverage from zero under the new id, the sweep re-detects, confirmed names carry across by box overlap, and the sync shards are keyed by the same id so a peer on another setting neither adopts nor pollutes them. The library controller carries the id into the sync the same way it carries the cache budget, because the sync starts from places that have no settings in reach. All three shape-fixed exports ship — APK, Arch, Flatpak — since a tablet has no other way to obtain the one it was not installed with; the APK grows by twenty megabytes for the choice. --- apps/darkroom-android/src/lib.rs | 19 ++- core/dr-types/src/lib.rs | 4 +- core/dr-types/src/settings.rs | 127 ++++++++++++++++++ docs/faces.md | 12 +- docs/traceability.md | 112 +++++++-------- models/face/README.md | 19 ++- models/face/scrfd_10g_640.onnx | 3 + models/face/scrfd_2.5g_640.onnx | 3 + packaging/PKGBUILD | 2 +- packaging/flatpak/paris.tourolle.darkroom.yml | 2 +- tools/fix-face-model-shapes.sh | 2 + ui/dr-ui/src/derived_sync.rs | 25 +++- ui/dr-ui/src/identity_ui.rs | 88 ++++++++---- ui/dr-ui/src/lib.rs | 55 ++++++-- ui/dr-ui/src/library.rs | 11 +- ui/dr-ui/src/library_ui.rs | 23 ++++ ui/dr-ui/src/settings_ui.rs | 44 +++++- ui/dr-ui/ui/app.slint | 9 ++ ui/dr-ui/ui/identity.slint | 2 +- ui/dr-ui/ui/settings.slint | 28 +++- 20 files changed, 468 insertions(+), 122 deletions(-) create mode 100644 models/face/scrfd_10g_640.onnx create mode 100644 models/face/scrfd_2.5g_640.onnx diff --git a/apps/darkroom-android/src/lib.rs b/apps/darkroom-android/src/lib.rs index 89579ae..42031cc 100644 --- a/apps/darkroom-android/src/lib.rs +++ b/apps/darkroom-android/src/lib.rs @@ -269,11 +269,13 @@ fn android_main(app: slint::android::AndroidApp) { /// thousand of them is an ANR by definition — the system puts "DarkRoom isn't /// responding" over a window that has never painted, and offers to kill it. /// -/// This copies **41 MB** on the first launch after an install: 24.9 MB of scene +/// This copied **41 MB** on the first launch after an install: 24.9 MB of scene /// model, 13.6 MB of embedder, 2.5 MB of detector, each read whole out of the -/// APK and written to `/data`. v0.10.0 added the scene model, which is 60% of +/// APK and written to `/data`. v0.10.0 added the scene model, which was 60% of /// that total; v0.10.0 is the release the ANR appeared in, and the 8,010 minor /// faults in its report are what 41 MB of freshly touched pages looks like. +/// The two further detectors the settings page offers since have made it +/// 61 MB, which is the same argument with a larger number. /// /// So it runs on a worker (NFR-ARCH-1: nothing blocking on the UI executor) and /// this function returns as soon as the thread is running. Nothing on the @@ -317,8 +319,15 @@ fn unpack_bundled_models(app: &slint::android::AndroidApp) { // decodes to 150 anonymous channels — `library::scene_model` wants the // vocabulary and the category descriptor beside it, and requires all three // before it reports the tab available. - const BUNDLED: [(&std::ffi::CStr, &str); 5] = [ + // + // Three detectors, because which one runs is a setting + // (`FaceDetector`, docs/faces.md §12.3) and a tablet has no other way to + // obtain the one it was not shipped with. Twenty megabytes of APK for + // the choice; the embedder is the same for all three. + const BUNDLED: [(&std::ffi::CStr, &str); 7] = [ (c"models/scrfd_500m_640.onnx", "scrfd_500m_640.onnx"), + (c"models/scrfd_2.5g_640.onnx", "scrfd_2.5g_640.onnx"), + (c"models/scrfd_10g_640.onnx", "scrfd_10g_640.onnx"), (c"models/arcface_mbf_b1.onnx", "arcface_mbf_b1.onnx"), (c"models/yolo26s-sem-ade20k.onnx", "yolo26s-sem-ade20k.onnx"), ( @@ -334,8 +343,8 @@ fn unpack_bundled_models(app: &slint::android::AndroidApp) { for (asset_path, name) in BUNDLED { let dest = dir.join(name); - // Already unpacked. Not re-read on every launch: this is 41 MB of - // copying across the five entries, and the file does not change without + // Already unpacked. Not re-read on every launch: this is 61 MB of + // copying across the seven entries, and the file does not change without // the APK changing, at which point the install wiped it anyway. It // matters more now than it did — a launch that skips every entry here // costs nothing at all, which is what makes the second launch after an diff --git a/core/dr-types/src/lib.rs b/core/dr-types/src/lib.rs index 6bcf9c5..b162920 100644 --- a/core/dr-types/src/lib.rs +++ b/core/dr-types/src/lib.rs @@ -19,8 +19,8 @@ pub use place::{Place, PlaceScope, Screen, StoredFilter}; pub use selector::{ColourLabel, DateSelector, FlagState, Selector, Tier}; pub use settings::{ CacheSettings, CollisionPolicy, ColourSpace, DevelopSettings, ExportFormat, ExportSettings, - ExportTarget, GroupNavigation, ImportSettings, LibrarySettings, OutputSharpening, ScreenSize, - Settings, SizingMode, + ExportTarget, FaceDetector, GroupNavigation, ImportSettings, LibrarySettings, OutputSharpening, + ScreenSize, Settings, SizingMode, }; pub use time::{ civil_from_unix, civil_from_unix_at, format_date, parse_date, unix_from_civil, Civil, diff --git a/core/dr-types/src/settings.rs b/core/dr-types/src/settings.rs index ec59839..a4c87fa 100644 --- a/core/dr-types/src/settings.rs +++ b/core/dr-types/src/settings.rs @@ -157,6 +157,96 @@ pub struct FaceSettings { /// dropped by this, whatever their size: those are the user's judgements and /// a display preference does not overrule them (FR-CULL-12). pub min_group_size: u32, + /// Which graph finds the faces. See [`FaceDetector`]. + pub detector: FaceDetector, +} + +/// TRACES: FR-CULL-8 +/// Which SCRFD graph the indexing pass detects with. +/// +/// Three exports of one architecture, differing only in how much computation +/// they spend, and docs/faces.md §12.3 is the measurement that made this a +/// choice rather than a constant: over the same photographs the cheapest one +/// misses the small faces in a group and reports a dog a dozen times, the +/// middle one finds 14% more faces for 12% more time, and the largest a +/// further 12% for three times the cost. Which of those is the right trade +/// depends on the machine doing the sweep — a desktop left running overnight +/// and a tablet on a battery want different answers — so it is a setting, +/// per device, like the rest of this file. +/// +/// # A detector is half of a model id +/// +/// Every face row, run marker, sync shard and calibration is keyed by +/// `faces.model_id` (catalog.md §10.1), and the schema's whole reason for +/// carrying that column is that *a model change is a new id and a re-index* +/// rather than a silent change under existing data. A detector change is a +/// model change: it decides which faces exist and where the landmarks that +/// align them land. So each variant names its own pipeline, and choosing +/// another one puts every image back in the queue and shows the People screen +/// for the new pipeline — empty until the sweep has run, with confirmed names +/// carried across by `record_detections`' box overlap. +/// +/// The first variant's id is the bare embedder name, because that is the id +/// every library indexed before this setting existed was written under; +/// making it `scrfd_500m+w600k_mbf` would have told those libraries they had +/// never been indexed. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum FaceDetector { + /// 2.5 GFLOPs. The measured sweet spot: nearly the same speed, and a + /// cleaner set of faces. + #[serde(rename = "scrfd_2.5g")] + Scrfd2_5g, + /// 10 GFLOPs. The most faces, at three times the time per image. + #[serde(rename = "scrfd_10g")] + Scrfd10g, + /// 500 MFLOPs. What every library was indexed with until now. + /// + /// Last, because `other` has to be: a file written by a build that knows + /// a fourth detector loads as this one rather than throwing every other + /// setting away with it. [`FaceDetector::ALL`] is the display order. + #[default] + #[serde(rename = "scrfd_500m", other)] + Scrfd500m, +} + +impl FaceDetector { + /// In the order the settings page offers them: cheapest first. + pub const ALL: [FaceDetector; 3] = [ + FaceDetector::Scrfd500m, + FaceDetector::Scrfd2_5g, + FaceDetector::Scrfd10g, + ]; + + /// The shape-fixed export's file name, as `tools/fix-face-model-shapes.sh` + /// writes it and every packager installs it. + pub fn file_name(self) -> &'static str { + match self { + FaceDetector::Scrfd500m => "scrfd_500m_640.onnx", + FaceDetector::Scrfd2_5g => "scrfd_2.5g_640.onnx", + FaceDetector::Scrfd10g => "scrfd_10g_640.onnx", + } + } + + /// The `faces.model_id` this detector's pipeline writes under. + /// + /// The embedder is the same `w600k_mbf` in every case; see the type note + /// for why the first is bare and the others are qualified. + pub fn model_id(self) -> &'static str { + match self { + FaceDetector::Scrfd500m => "w600k_mbf", + FaceDetector::Scrfd2_5g => "scrfd_2.5g+w600k_mbf", + FaceDetector::Scrfd10g => "scrfd_10g+w600k_mbf", + } + } + + /// What the picker calls it. + pub fn label(self) -> &'static str { + match self { + FaceDetector::Scrfd500m => "Fast", + FaceDetector::Scrfd2_5g => "Balanced", + FaceDetector::Scrfd10g => "Thorough", + } + } } impl FaceSettings { @@ -195,6 +285,7 @@ impl Default for FaceSettings { // a setting, so an existing library regroups identically until the // user moves it. min_group_size: 2, + detector: FaceDetector::default(), } } } @@ -1537,6 +1628,42 @@ mod tests { assert_eq!(s.faces, FaceSettings::default()); } + /// The detector every existing library was indexed with must keep the id + /// those libraries were written under, or an upgrade would report every + /// one of them un-indexed. + #[test] + fn the_default_detector_keeps_the_legacy_model_id() { + assert_eq!(FaceDetector::default(), FaceDetector::Scrfd500m); + assert_eq!(FaceDetector::default().model_id(), "w600k_mbf"); + } + + /// Two pipelines must never share an id: the whole point of the column is + /// that their faces are not interchangeable. + #[test] + fn every_detector_has_its_own_model_id_and_file() { + let ids: std::collections::HashSet<_> = + FaceDetector::ALL.iter().map(|d| d.model_id()).collect(); + assert_eq!(ids.len(), FaceDetector::ALL.len()); + let files: std::collections::HashSet<_> = + FaceDetector::ALL.iter().map(|d| d.file_name()).collect(); + assert_eq!(files.len(), FaceDetector::ALL.len()); + } + + #[test] + fn the_detector_round_trips_and_an_unknown_one_falls_back() { + let mut s = Settings::default(); + s.faces.detector = FaceDetector::Scrfd10g; + let text = serde_json::to_string(&s).unwrap(); + assert!(text.contains(r#""detector":"scrfd_10g""#)); + let back: Settings = serde_json::from_str(&text).unwrap(); + assert_eq!(back.faces.detector, FaceDetector::Scrfd10g); + + let newer = r#"{"faces":{"detector":"scrfd_99g"}}"#; + let s: Settings = + serde_json::from_str(newer).expect("unknown detector should not refuse the file"); + assert_eq!(s.faces.detector, FaceDetector::Scrfd500m); + } + #[test] fn sanitise_leaves_a_real_destination_alone() { let mut s = Settings::default(); diff --git a/docs/faces.md b/docs/faces.md index aac9133..e1f2097 100644 --- a/docs/faces.md +++ b/docs/faces.md @@ -1099,9 +1099,15 @@ is not a desktop-only feature (NFR-RES-2). It loads in tract with the same fix a (`--input input.1=1,3,640,640`; its outputs are declared dynamic and tract infers them) and decodes through the same nine-output path unchanged. Same licence, same `buffalo_m` release page. -What a swap has to deal with: `face_index` is keyed on the *embedder's* `model_id`, so a new -detector re-queues nothing. The images already indexed under `500M` keep their faces and their -dogs until something re-detects them — that is a re-index policy question, not a detector one. +**Which detector runs is a setting** — `FaceSettings::detector`, per device, on the settings page +beside the indexing button as Fast / Balanced / Thorough. All three files ship. Each detector is +its own `faces.model_id` (`w600k_mbf` for `500M`, unchanged, so nothing already indexed is +disturbed; `scrfd_2.5g+w600k_mbf` and `scrfd_10g+w600k_mbf` for the others), which is the +mechanism §2.1 always intended for a model change: the coverage figure restarts at zero under the +new id, the sweep re-detects, `record_detections` carries confirmed names across by box overlap and +drops the previous pipeline's marker for each image it revisits, and the sync shards are keyed by +the same id so a peer on another setting neither adopts nor pollutes them. The default stays `500M` +so that an upgrade changes nothing until the user chooses; the recommendation is `2.5G`. --- diff --git a/docs/traceability.md b/docs/traceability.md index 3cde85b..5ca9843 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -10,7 +10,7 @@ Denominators are parsed from [`requirements.md`](requirements.md) at run time, n | Metric | Value | |---|---| | Source files scanned | 350 | -| TRACES tags found | 1368 | +| TRACES tags found | 1377 | | Requirements defined | 187 | | Requirements covered | 134 | | **Coverage** | **71.7%** (134/187) | @@ -34,89 +34,89 @@ _None._ | ID | Tagged in | |---|---| | FR-CAT-1 | [`core/dr-catalog/src/scan.rs:1`](../core/dr-catalog/src/scan.rs#L1), [`core/dr-catalog/src/walk.rs:109`](../core/dr-catalog/src/walk.rs#L109), [`core/dr-catalog/src/walk.rs:162`](../core/dr-catalog/src/walk.rs#L162), [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-sync/src/scan.rs:118`](../core/dr-sync/src/scan.rs#L118), [`core/dr-types/src/lib.rs:203`](../core/dr-types/src/lib.rs#L203), [`core/dr-types/src/lib.rs:272`](../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../core/dr-types/src/lib.rs#L305), [`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.rs:1`](../ui/dr-ui/src/library.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:206`](../core/dr-types/src/settings.rs#L206), [`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/import.rs:1`](../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:336`](../ui/dr-ui/src/import.rs#L336), [`ui/dr-ui/src/import_ui.rs:1`](../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1427`](../ui/dr-ui/src/lib.rs#L1427), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5), [`ui/dr-ui/ui/library.slint:1033`](../ui/dr-ui/ui/library.slint#L1033), [`ui/dr-ui/ui/library.slint:1254`](../ui/dr-ui/ui/library.slint#L1254), [`ui/dr-ui/ui/library.slint:979`](../ui/dr-ui/ui/library.slint#L979) | -| 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:1427`](../ui/dr-ui/src/lib.rs#L1427), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:2819`](../ui/dr-ui/src/library.rs#L2819), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | +| 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:297`](../core/dr-types/src/settings.rs#L297), [`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/import.rs:1`](../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:336`](../ui/dr-ui/src/import.rs#L336), [`ui/dr-ui/src/import_ui.rs:1`](../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1428`](../ui/dr-ui/src/lib.rs#L1428), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5), [`ui/dr-ui/ui/library.slint:1033`](../ui/dr-ui/ui/library.slint#L1033), [`ui/dr-ui/ui/library.slint:1254`](../ui/dr-ui/ui/library.slint#L1254), [`ui/dr-ui/ui/library.slint:979`](../ui/dr-ui/ui/library.slint#L979) | +| 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:1428`](../ui/dr-ui/src/lib.rs#L1428), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:2819`](../ui/dr-ui/src/library.rs#L2819), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | | FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:122`](../core/dr-pipeline/src/sidecar.rs#L122) | | FR-CAT-13 | [`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) | -| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:886`](../core/dr-catalog/src/schema.rs#L886), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:457`](../core/dr-sync-nextcloud/src/lib.rs#L457), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:604`](../core/dr-sync/src/scan.rs#L604), [`core/dr-sync/src/scan.rs:82`](../core/dr-sync/src/scan.rs#L82), [`core/dr-thumbs/src/lib.rs:376`](../core/dr-thumbs/src/lib.rs#L376), [`core/dr-types/src/place.rs:91`](../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1435`](../ui/dr-ui/src/collections_ui.rs#L1435), [`ui/dr-ui/src/collections_ui.rs:2341`](../ui/dr-ui/src/collections_ui.rs#L2341), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:200`](../ui/dr-ui/src/library.rs#L200), [`ui/dr-ui/src/library.rs:249`](../ui/dr-ui/src/library.rs#L249), [`ui/dr-ui/src/library.rs:4607`](../ui/dr-ui/src/library.rs#L4607), [`ui/dr-ui/src/library.rs:4641`](../ui/dr-ui/src/library.rs#L4641), [`ui/dr-ui/src/library_ui.rs:238`](../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:832`](../ui/dr-ui/src/library_ui.rs#L832), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:745`](../ui/dr-ui/ui/collections.slint#L745) | +| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:886`](../core/dr-catalog/src/schema.rs#L886), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:457`](../core/dr-sync-nextcloud/src/lib.rs#L457), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:604`](../core/dr-sync/src/scan.rs#L604), [`core/dr-sync/src/scan.rs:82`](../core/dr-sync/src/scan.rs#L82), [`core/dr-thumbs/src/lib.rs:376`](../core/dr-thumbs/src/lib.rs#L376), [`core/dr-types/src/place.rs:91`](../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1435`](../ui/dr-ui/src/collections_ui.rs#L1435), [`ui/dr-ui/src/collections_ui.rs:2341`](../ui/dr-ui/src/collections_ui.rs#L2341), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:200`](../ui/dr-ui/src/library.rs#L200), [`ui/dr-ui/src/library.rs:249`](../ui/dr-ui/src/library.rs#L249), [`ui/dr-ui/src/library.rs:4610`](../ui/dr-ui/src/library.rs#L4610), [`ui/dr-ui/src/library.rs:4644`](../ui/dr-ui/src/library.rs#L4644), [`ui/dr-ui/src/library_ui.rs:238`](../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:854`](../ui/dr-ui/src/library_ui.rs#L854), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:745`](../ui/dr-ui/ui/collections.slint#L745) | | FR-CAT-1a | [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:56`](../core/dr-types/src/lib.rs#L56), [`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:66`](../core/dr-catalog/src/walk.rs#L66), [`core/dr-sync/src/scan.rs:94`](../core/dr-sync/src/scan.rs#L94), [`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:463`](../ui/dr-ui/src/import.rs#L463), [`ui/dr-ui/src/import.rs:488`](../ui/dr-ui/src/import.rs#L488), [`ui/dr-ui/src/library.rs:3292`](../ui/dr-ui/src/library.rs#L3292), [`ui/dr-ui/src/library.rs:4050`](../ui/dr-ui/src/library.rs#L4050), [`ui/dr-ui/src/library_ui.rs:177`](../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4230`](../ui/dr-ui/src/library_ui.rs#L4230), [`ui/dr-ui/src/library_ui.rs:5729`](../ui/dr-ui/src/library_ui.rs#L5729), [`ui/dr-ui/ui/app.slint:375`](../ui/dr-ui/ui/app.slint#L375), [`ui/dr-ui/ui/settings.slint:395`](../ui/dr-ui/ui/settings.slint#L395), [`ui/dr-ui/ui/settings.slint:73`](../ui/dr-ui/ui/settings.slint#L73) | +| FR-CAT-3 | [`core/dr-catalog/src/jobs.rs:1`](../core/dr-catalog/src/jobs.rs#L1), [`core/dr-catalog/src/walk.rs:66`](../core/dr-catalog/src/walk.rs#L66), [`core/dr-sync/src/scan.rs:94`](../core/dr-sync/src/scan.rs#L94), [`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:463`](../ui/dr-ui/src/import.rs#L463), [`ui/dr-ui/src/import.rs:488`](../ui/dr-ui/src/import.rs#L488), [`ui/dr-ui/src/library.rs:3292`](../ui/dr-ui/src/library.rs#L3292), [`ui/dr-ui/src/library.rs:4050`](../ui/dr-ui/src/library.rs#L4050), [`ui/dr-ui/src/library_ui.rs:177`](../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4253`](../ui/dr-ui/src/library_ui.rs#L4253), [`ui/dr-ui/src/library_ui.rs:5752`](../ui/dr-ui/src/library_ui.rs#L5752), [`ui/dr-ui/ui/app.slint:375`](../ui/dr-ui/ui/app.slint#L375), [`ui/dr-ui/ui/settings.slint:402`](../ui/dr-ui/ui/settings.slint#L402), [`ui/dr-ui/ui/settings.slint:73`](../ui/dr-ui/ui/settings.slint#L73) | | 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:374`](../core/dr-catalog/src/schema.rs#L374), [`ui/dr-ui/src/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library.rs:230`](../ui/dr-ui/src/library.rs#L230), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1) | -| 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/rating.rs:1`](../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/schema.rs:1304`](../core/dr-catalog/src/schema.rs#L1304), [`core/dr-catalog/src/schema.rs:801`](../core/dr-catalog/src/schema.rs#L801), [`core/dr-decode/src/lib.rs:285`](../core/dr-decode/src/lib.rs#L285), [`core/dr-decode/src/lib.rs:404`](../core/dr-decode/src/lib.rs#L404), [`core/dr-pipeline/src/sidecar.rs:139`](../core/dr-pipeline/src/sidecar.rs#L139), [`ui/dr-ui/src/collections_ui.rs:1731`](../ui/dr-ui/src/collections_ui.rs#L1731), [`ui/dr-ui/src/collections_ui.rs:1837`](../ui/dr-ui/src/collections_ui.rs#L1837), [`ui/dr-ui/src/collections_ui.rs:1886`](../ui/dr-ui/src/collections_ui.rs#L1886), [`ui/dr-ui/src/collections_ui.rs:275`](../ui/dr-ui/src/collections_ui.rs#L275), [`ui/dr-ui/src/collections_ui.rs:484`](../ui/dr-ui/src/collections_ui.rs#L484), [`ui/dr-ui/src/collections_ui.rs:87`](../ui/dr-ui/src/collections_ui.rs#L87), [`ui/dr-ui/src/library.rs:4655`](../ui/dr-ui/src/library.rs#L4655), [`ui/dr-ui/src/library_ui.rs:707`](../ui/dr-ui/src/library_ui.rs#L707), [`ui/dr-ui/src/library_ui.rs:7688`](../ui/dr-ui/src/library_ui.rs#L7688), [`ui/dr-ui/src/library_ui.rs:7699`](../ui/dr-ui/src/library_ui.rs#L7699), [`ui/dr-ui/src/library_ui.rs:7712`](../ui/dr-ui/src/library_ui.rs#L7712), [`ui/dr-ui/src/library_ui.rs:7727`](../ui/dr-ui/src/library_ui.rs#L7727), [`ui/dr-ui/src/library_ui.rs:7736`](../ui/dr-ui/src/library_ui.rs#L7736), [`ui/dr-ui/ui/app.slint:296`](../ui/dr-ui/ui/app.slint#L296), [`ui/dr-ui/ui/app.slint:561`](../ui/dr-ui/ui/app.slint#L561), [`ui/dr-ui/ui/library.slint:1360`](../ui/dr-ui/ui/library.slint#L1360), [`ui/dr-ui/ui/library.slint:1384`](../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1437`](../ui/dr-ui/ui/library.slint#L1437), [`ui/dr-ui/ui/library.slint:19`](../ui/dr-ui/ui/library.slint#L19), [`ui/dr-ui/ui/library.slint:4201`](../ui/dr-ui/ui/library.slint#L4201) | -| 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/schema.rs:801`](../core/dr-catalog/src/schema.rs#L801), [`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.rs:254`](../ui/dr-ui/src/library.rs#L254), [`ui/dr-ui/src/library.rs:5131`](../ui/dr-ui/src/library.rs#L5131), [`ui/dr-ui/src/library_ui.rs:384`](../ui/dr-ui/src/library_ui.rs#L384), [`ui/dr-ui/src/library_ui.rs:464`](../ui/dr-ui/src/library_ui.rs#L464), [`ui/dr-ui/src/library_ui.rs:6451`](../ui/dr-ui/src/library_ui.rs#L6451), [`ui/dr-ui/src/library_ui.rs:6504`](../ui/dr-ui/src/library_ui.rs#L6504), [`ui/dr-ui/src/library_ui.rs:7828`](../ui/dr-ui/src/library_ui.rs#L7828), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:561`](../ui/dr-ui/ui/app.slint#L561), [`ui/dr-ui/ui/app.slint:837`](../ui/dr-ui/ui/app.slint#L837), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1547`](../ui/dr-ui/ui/library.slint#L1547), [`ui/dr-ui/ui/library.slint:4201`](../ui/dr-ui/ui/library.slint#L4201), [`ui/dr-ui/ui/settings.slint:158`](../ui/dr-ui/ui/settings.slint#L158) | -| FR-CAT-7 | [`core/dr-catalog/src/collections.rs:1`](../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-types/src/selector.rs:1`](../core/dr-types/src/selector.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1117`](../ui/dr-ui/src/collections_ui.rs#L1117), [`ui/dr-ui/src/collections_ui.rs:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1225`](../ui/dr-ui/src/collections_ui.rs#L1225), [`ui/dr-ui/src/collections_ui.rs:1704`](../ui/dr-ui/src/collections_ui.rs#L1704), [`ui/dr-ui/src/collections_ui.rs:1750`](../ui/dr-ui/src/collections_ui.rs#L1750), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2000`](../ui/dr-ui/src/collections_ui.rs#L2000), [`ui/dr-ui/src/collections_ui.rs:2065`](../ui/dr-ui/src/collections_ui.rs#L2065), [`ui/dr-ui/src/collections_ui.rs:2125`](../ui/dr-ui/src/collections_ui.rs#L2125), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:2755`](../ui/dr-ui/src/collections_ui.rs#L2755), [`ui/dr-ui/src/collections_ui.rs:2801`](../ui/dr-ui/src/collections_ui.rs#L2801), [`ui/dr-ui/src/collections_ui.rs:2903`](../ui/dr-ui/src/collections_ui.rs#L2903), [`ui/dr-ui/src/collections_ui.rs:2959`](../ui/dr-ui/src/collections_ui.rs#L2959), [`ui/dr-ui/src/collections_ui.rs:3120`](../ui/dr-ui/src/collections_ui.rs#L3120), [`ui/dr-ui/src/collections_ui.rs:3142`](../ui/dr-ui/src/collections_ui.rs#L3142), [`ui/dr-ui/src/collections_ui.rs:3208`](../ui/dr-ui/src/collections_ui.rs#L3208), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3328`](../ui/dr-ui/src/collections_ui.rs#L3328), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3633`](../ui/dr-ui/src/collections_ui.rs#L3633), [`ui/dr-ui/src/collections_ui.rs:383`](../ui/dr-ui/src/collections_ui.rs#L383), [`ui/dr-ui/src/collections_ui.rs:514`](../ui/dr-ui/src/collections_ui.rs#L514), [`ui/dr-ui/src/collections_ui.rs:718`](../ui/dr-ui/src/collections_ui.rs#L718), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:4936`](../ui/dr-ui/src/library.rs#L4936), [`ui/dr-ui/src/library.rs:4962`](../ui/dr-ui/src/library.rs#L4962), [`ui/dr-ui/src/library.rs:5017`](../ui/dr-ui/src/library.rs#L5017), [`ui/dr-ui/src/library_ui.rs:2694`](../ui/dr-ui/src/library_ui.rs#L2694), [`ui/dr-ui/src/library_ui.rs:4092`](../ui/dr-ui/src/library_ui.rs#L4092), [`ui/dr-ui/src/library_ui.rs:4843`](../ui/dr-ui/src/library_ui.rs#L4843), [`ui/dr-ui/ui/app.slint:299`](../ui/dr-ui/ui/app.slint#L299), [`ui/dr-ui/ui/app.slint:3062`](../ui/dr-ui/ui/app.slint#L3062), [`ui/dr-ui/ui/app.slint:556`](../ui/dr-ui/ui/app.slint#L556), [`ui/dr-ui/ui/app.slint:585`](../ui/dr-ui/ui/app.slint#L585), [`ui/dr-ui/ui/collections.slint:4`](../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/collections.slint:587`](../ui/dr-ui/ui/collections.slint#L587), [`ui/dr-ui/ui/library.slint:1327`](../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:2902`](../ui/dr-ui/ui/library.slint#L2902), [`ui/dr-ui/ui/library.slint:4179`](../ui/dr-ui/ui/library.slint#L4179), [`ui/dr-ui/ui/library.slint:4257`](../ui/dr-ui/ui/library.slint#L4257), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | -| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:550`](../core/dr-catalog/src/schema.rs#L550), [`core/dr-pipeline/src/coverage.rs:1`](../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/graph.rs:587`](../core/dr-pipeline/src/graph.rs#L587), [`core/dr-pipeline/src/graph.rs:640`](../core/dr-pipeline/src/graph.rs#L640), [`core/dr-pipeline/src/ops/curve.rs:137`](../core/dr-pipeline/src/ops/curve.rs#L137), [`core/dr-pipeline/src/ops/curve.rs:656`](../core/dr-pipeline/src/ops/curve.rs#L656), [`core/dr-pipeline/src/sidecar.rs:1288`](../core/dr-pipeline/src/sidecar.rs#L1288), [`core/dr-pipeline/src/sidecar.rs:2114`](../core/dr-pipeline/src/sidecar.rs#L2114), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`core/dr-pipeline/src/state.rs:1`](../core/dr-pipeline/src/state.rs#L1), [`core/dr-pipeline/src/state.rs:75`](../core/dr-pipeline/src/state.rs#L75), [`core/dr-pipeline/tests/tone_curve.rs:34`](../core/dr-pipeline/tests/tone_curve.rs#L34), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:45`](../core/dr-sync/src/scan.rs#L45), [`core/dr-sync/src/scan.rs:912`](../core/dr-sync/src/scan.rs#L912), [`ui/dr-ui/src/develop.rs:2131`](../ui/dr-ui/src/develop.rs#L2131), [`ui/dr-ui/src/develop.rs:5378`](../ui/dr-ui/src/develop.rs#L5378), [`ui/dr-ui/src/develop.rs:5407`](../ui/dr-ui/src/develop.rs#L5407), [`ui/dr-ui/src/develop.rs:6522`](../ui/dr-ui/src/develop.rs#L6522), [`ui/dr-ui/src/develop.rs:6576`](../ui/dr-ui/src/develop.rs#L6576), [`ui/dr-ui/src/develop.rs:6678`](../ui/dr-ui/src/develop.rs#L6678), [`ui/dr-ui/src/export.rs:799`](../ui/dr-ui/src/export.rs#L799), [`ui/dr-ui/src/lib.rs:1205`](../ui/dr-ui/src/lib.rs#L1205), [`ui/dr-ui/src/lib.rs:1721`](../ui/dr-ui/src/lib.rs#L1721), [`ui/dr-ui/src/lib.rs:2269`](../ui/dr-ui/src/lib.rs#L2269), [`ui/dr-ui/src/lib.rs:2407`](../ui/dr-ui/src/lib.rs#L2407), [`ui/dr-ui/src/lib.rs:744`](../ui/dr-ui/src/lib.rs#L744), [`ui/dr-ui/src/library.rs:1376`](../ui/dr-ui/src/library.rs#L1376), [`ui/dr-ui/src/library.rs:1411`](../ui/dr-ui/src/library.rs#L1411), [`ui/dr-ui/src/library.rs:2219`](../ui/dr-ui/src/library.rs#L2219), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500), [`ui/dr-ui/src/library.rs:547`](../ui/dr-ui/src/library.rs#L547), [`ui/dr-ui/src/library.rs:584`](../ui/dr-ui/src/library.rs#L584), [`ui/dr-ui/src/library.rs:7361`](../ui/dr-ui/src/library.rs#L7361), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:845`](../ui/dr-ui/src/library.rs#L845), [`ui/dr-ui/src/library_ui.rs:1259`](../ui/dr-ui/src/library_ui.rs#L1259), [`ui/dr-ui/src/library_ui.rs:6052`](../ui/dr-ui/src/library_ui.rs#L6052), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1) | -| FR-CAT-9 | [`core/dr-catalog/src/cache.rs:1`](../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/scan.rs:1`](../core/dr-catalog/src/scan.rs#L1), [`core/dr-catalog/src/schema.rs:858`](../core/dr-catalog/src/schema.rs#L858), [`core/dr-catalog/src/walk.rs:1022`](../core/dr-catalog/src/walk.rs#L1022), [`core/dr-catalog/src/walk.rs:162`](../core/dr-catalog/src/walk.rs#L162), [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-catalog/src/walk.rs:435`](../core/dr-catalog/src/walk.rs#L435), [`core/dr-catalog/src/walk.rs:728`](../core/dr-catalog/src/walk.rs#L728), [`core/dr-sync-nextcloud/src/desktop_client.rs:30`](../core/dr-sync-nextcloud/src/desktop_client.rs#L30), [`core/dr-sync/src/error.rs:113`](../core/dr-sync/src/error.rs#L113), [`core/dr-sync/src/reachability.rs:1`](../core/dr-sync/src/reachability.rs#L1), [`core/dr-sync/src/scan.rs:200`](../core/dr-sync/src/scan.rs#L200), [`core/dr-sync/src/scan.rs:505`](../core/dr-sync/src/scan.rs#L505), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4667`](../ui/dr-ui/src/develop.rs#L4667), [`ui/dr-ui/src/develop.rs:4710`](../ui/dr-ui/src/develop.rs#L4710), [`ui/dr-ui/src/library.rs:1276`](../ui/dr-ui/src/library.rs#L1276), [`ui/dr-ui/src/library.rs:1329`](../ui/dr-ui/src/library.rs#L1329), [`ui/dr-ui/src/library.rs:1360`](../ui/dr-ui/src/library.rs#L1360), [`ui/dr-ui/src/library.rs:1411`](../ui/dr-ui/src/library.rs#L1411), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:1727`](../ui/dr-ui/src/library.rs#L1727), [`ui/dr-ui/src/library.rs:2179`](../ui/dr-ui/src/library.rs#L2179), [`ui/dr-ui/src/library.rs:2255`](../ui/dr-ui/src/library.rs#L2255), [`ui/dr-ui/src/library.rs:274`](../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5239`](../ui/dr-ui/src/library.rs#L5239), [`ui/dr-ui/src/library.rs:584`](../ui/dr-ui/src/library.rs#L584), [`ui/dr-ui/src/library.rs:829`](../ui/dr-ui/src/library.rs#L829), [`ui/dr-ui/src/library.rs:845`](../ui/dr-ui/src/library.rs#L845), [`ui/dr-ui/src/library.rs:899`](../ui/dr-ui/src/library.rs#L899), [`ui/dr-ui/src/library_ui.rs:1326`](../ui/dr-ui/src/library_ui.rs#L1326), [`ui/dr-ui/src/library_ui.rs:1917`](../ui/dr-ui/src/library_ui.rs#L1917), [`ui/dr-ui/src/library_ui.rs:1961`](../ui/dr-ui/src/library_ui.rs#L1961), [`ui/dr-ui/src/library_ui.rs:1977`](../ui/dr-ui/src/library_ui.rs#L1977), [`ui/dr-ui/src/library_ui.rs:2071`](../ui/dr-ui/src/library_ui.rs#L2071), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2934`](../ui/dr-ui/src/library_ui.rs#L2934), [`ui/dr-ui/src/library_ui.rs:317`](../ui/dr-ui/src/library_ui.rs#L317), [`ui/dr-ui/src/library_ui.rs:325`](../ui/dr-ui/src/library_ui.rs#L325), [`ui/dr-ui/src/library_ui.rs:3372`](../ui/dr-ui/src/library_ui.rs#L3372), [`ui/dr-ui/src/library_ui.rs:3594`](../ui/dr-ui/src/library_ui.rs#L3594), [`ui/dr-ui/src/library_ui.rs:3872`](../ui/dr-ui/src/library_ui.rs#L3872), [`ui/dr-ui/src/library_ui.rs:3960`](../ui/dr-ui/src/library_ui.rs#L3960), [`ui/dr-ui/src/library_ui.rs:4143`](../ui/dr-ui/src/library_ui.rs#L4143), [`ui/dr-ui/src/library_ui.rs:4257`](../ui/dr-ui/src/library_ui.rs#L4257), [`ui/dr-ui/src/library_ui.rs:517`](../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:580`](../ui/dr-ui/src/library_ui.rs#L580), [`ui/dr-ui/src/library_ui.rs:6549`](../ui/dr-ui/src/library_ui.rs#L6549), [`ui/dr-ui/src/library_ui.rs:6631`](../ui/dr-ui/src/library_ui.rs#L6631), [`ui/dr-ui/src/presets.rs:468`](../ui/dr-ui/src/presets.rs#L468), [`ui/dr-ui/src/presets.rs:480`](../ui/dr-ui/src/presets.rs#L480), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | +| 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/rating.rs:1`](../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/schema.rs:1304`](../core/dr-catalog/src/schema.rs#L1304), [`core/dr-catalog/src/schema.rs:801`](../core/dr-catalog/src/schema.rs#L801), [`core/dr-decode/src/lib.rs:285`](../core/dr-decode/src/lib.rs#L285), [`core/dr-decode/src/lib.rs:404`](../core/dr-decode/src/lib.rs#L404), [`core/dr-pipeline/src/sidecar.rs:139`](../core/dr-pipeline/src/sidecar.rs#L139), [`ui/dr-ui/src/collections_ui.rs:1731`](../ui/dr-ui/src/collections_ui.rs#L1731), [`ui/dr-ui/src/collections_ui.rs:1837`](../ui/dr-ui/src/collections_ui.rs#L1837), [`ui/dr-ui/src/collections_ui.rs:1886`](../ui/dr-ui/src/collections_ui.rs#L1886), [`ui/dr-ui/src/collections_ui.rs:275`](../ui/dr-ui/src/collections_ui.rs#L275), [`ui/dr-ui/src/collections_ui.rs:484`](../ui/dr-ui/src/collections_ui.rs#L484), [`ui/dr-ui/src/collections_ui.rs:87`](../ui/dr-ui/src/collections_ui.rs#L87), [`ui/dr-ui/src/library.rs:4658`](../ui/dr-ui/src/library.rs#L4658), [`ui/dr-ui/src/library_ui.rs:729`](../ui/dr-ui/src/library_ui.rs#L729), [`ui/dr-ui/src/library_ui.rs:7711`](../ui/dr-ui/src/library_ui.rs#L7711), [`ui/dr-ui/src/library_ui.rs:7722`](../ui/dr-ui/src/library_ui.rs#L7722), [`ui/dr-ui/src/library_ui.rs:7735`](../ui/dr-ui/src/library_ui.rs#L7735), [`ui/dr-ui/src/library_ui.rs:7750`](../ui/dr-ui/src/library_ui.rs#L7750), [`ui/dr-ui/src/library_ui.rs:7759`](../ui/dr-ui/src/library_ui.rs#L7759), [`ui/dr-ui/ui/app.slint:296`](../ui/dr-ui/ui/app.slint#L296), [`ui/dr-ui/ui/app.slint:561`](../ui/dr-ui/ui/app.slint#L561), [`ui/dr-ui/ui/library.slint:1360`](../ui/dr-ui/ui/library.slint#L1360), [`ui/dr-ui/ui/library.slint:1384`](../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1437`](../ui/dr-ui/ui/library.slint#L1437), [`ui/dr-ui/ui/library.slint:19`](../ui/dr-ui/ui/library.slint#L19), [`ui/dr-ui/ui/library.slint:4201`](../ui/dr-ui/ui/library.slint#L4201) | +| 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/schema.rs:801`](../core/dr-catalog/src/schema.rs#L801), [`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.rs:254`](../ui/dr-ui/src/library.rs#L254), [`ui/dr-ui/src/library.rs:5134`](../ui/dr-ui/src/library.rs#L5134), [`ui/dr-ui/src/library_ui.rs:384`](../ui/dr-ui/src/library_ui.rs#L384), [`ui/dr-ui/src/library_ui.rs:486`](../ui/dr-ui/src/library_ui.rs#L486), [`ui/dr-ui/src/library_ui.rs:6474`](../ui/dr-ui/src/library_ui.rs#L6474), [`ui/dr-ui/src/library_ui.rs:6527`](../ui/dr-ui/src/library_ui.rs#L6527), [`ui/dr-ui/src/library_ui.rs:7851`](../ui/dr-ui/src/library_ui.rs#L7851), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:561`](../ui/dr-ui/ui/app.slint#L561), [`ui/dr-ui/ui/app.slint:837`](../ui/dr-ui/ui/app.slint#L837), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1547`](../ui/dr-ui/ui/library.slint#L1547), [`ui/dr-ui/ui/library.slint:4201`](../ui/dr-ui/ui/library.slint#L4201), [`ui/dr-ui/ui/settings.slint:165`](../ui/dr-ui/ui/settings.slint#L165) | +| FR-CAT-7 | [`core/dr-catalog/src/collections.rs:1`](../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-types/src/selector.rs:1`](../core/dr-types/src/selector.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1117`](../ui/dr-ui/src/collections_ui.rs#L1117), [`ui/dr-ui/src/collections_ui.rs:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1225`](../ui/dr-ui/src/collections_ui.rs#L1225), [`ui/dr-ui/src/collections_ui.rs:1704`](../ui/dr-ui/src/collections_ui.rs#L1704), [`ui/dr-ui/src/collections_ui.rs:1750`](../ui/dr-ui/src/collections_ui.rs#L1750), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2000`](../ui/dr-ui/src/collections_ui.rs#L2000), [`ui/dr-ui/src/collections_ui.rs:2065`](../ui/dr-ui/src/collections_ui.rs#L2065), [`ui/dr-ui/src/collections_ui.rs:2125`](../ui/dr-ui/src/collections_ui.rs#L2125), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:2755`](../ui/dr-ui/src/collections_ui.rs#L2755), [`ui/dr-ui/src/collections_ui.rs:2801`](../ui/dr-ui/src/collections_ui.rs#L2801), [`ui/dr-ui/src/collections_ui.rs:2903`](../ui/dr-ui/src/collections_ui.rs#L2903), [`ui/dr-ui/src/collections_ui.rs:2959`](../ui/dr-ui/src/collections_ui.rs#L2959), [`ui/dr-ui/src/collections_ui.rs:3120`](../ui/dr-ui/src/collections_ui.rs#L3120), [`ui/dr-ui/src/collections_ui.rs:3142`](../ui/dr-ui/src/collections_ui.rs#L3142), [`ui/dr-ui/src/collections_ui.rs:3208`](../ui/dr-ui/src/collections_ui.rs#L3208), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3328`](../ui/dr-ui/src/collections_ui.rs#L3328), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3633`](../ui/dr-ui/src/collections_ui.rs#L3633), [`ui/dr-ui/src/collections_ui.rs:383`](../ui/dr-ui/src/collections_ui.rs#L383), [`ui/dr-ui/src/collections_ui.rs:514`](../ui/dr-ui/src/collections_ui.rs#L514), [`ui/dr-ui/src/collections_ui.rs:718`](../ui/dr-ui/src/collections_ui.rs#L718), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:4939`](../ui/dr-ui/src/library.rs#L4939), [`ui/dr-ui/src/library.rs:4965`](../ui/dr-ui/src/library.rs#L4965), [`ui/dr-ui/src/library.rs:5020`](../ui/dr-ui/src/library.rs#L5020), [`ui/dr-ui/src/library_ui.rs:2716`](../ui/dr-ui/src/library_ui.rs#L2716), [`ui/dr-ui/src/library_ui.rs:4115`](../ui/dr-ui/src/library_ui.rs#L4115), [`ui/dr-ui/src/library_ui.rs:4866`](../ui/dr-ui/src/library_ui.rs#L4866), [`ui/dr-ui/ui/app.slint:299`](../ui/dr-ui/ui/app.slint#L299), [`ui/dr-ui/ui/app.slint:3071`](../ui/dr-ui/ui/app.slint#L3071), [`ui/dr-ui/ui/app.slint:556`](../ui/dr-ui/ui/app.slint#L556), [`ui/dr-ui/ui/app.slint:585`](../ui/dr-ui/ui/app.slint#L585), [`ui/dr-ui/ui/collections.slint:4`](../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/collections.slint:587`](../ui/dr-ui/ui/collections.slint#L587), [`ui/dr-ui/ui/library.slint:1327`](../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:2902`](../ui/dr-ui/ui/library.slint#L2902), [`ui/dr-ui/ui/library.slint:4179`](../ui/dr-ui/ui/library.slint#L4179), [`ui/dr-ui/ui/library.slint:4257`](../ui/dr-ui/ui/library.slint#L4257), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | +| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:550`](../core/dr-catalog/src/schema.rs#L550), [`core/dr-pipeline/src/coverage.rs:1`](../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/graph.rs:587`](../core/dr-pipeline/src/graph.rs#L587), [`core/dr-pipeline/src/graph.rs:640`](../core/dr-pipeline/src/graph.rs#L640), [`core/dr-pipeline/src/ops/curve.rs:137`](../core/dr-pipeline/src/ops/curve.rs#L137), [`core/dr-pipeline/src/ops/curve.rs:656`](../core/dr-pipeline/src/ops/curve.rs#L656), [`core/dr-pipeline/src/sidecar.rs:1288`](../core/dr-pipeline/src/sidecar.rs#L1288), [`core/dr-pipeline/src/sidecar.rs:2114`](../core/dr-pipeline/src/sidecar.rs#L2114), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`core/dr-pipeline/src/state.rs:1`](../core/dr-pipeline/src/state.rs#L1), [`core/dr-pipeline/src/state.rs:75`](../core/dr-pipeline/src/state.rs#L75), [`core/dr-pipeline/tests/tone_curve.rs:34`](../core/dr-pipeline/tests/tone_curve.rs#L34), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:45`](../core/dr-sync/src/scan.rs#L45), [`core/dr-sync/src/scan.rs:912`](../core/dr-sync/src/scan.rs#L912), [`ui/dr-ui/src/develop.rs:2131`](../ui/dr-ui/src/develop.rs#L2131), [`ui/dr-ui/src/develop.rs:5378`](../ui/dr-ui/src/develop.rs#L5378), [`ui/dr-ui/src/develop.rs:5407`](../ui/dr-ui/src/develop.rs#L5407), [`ui/dr-ui/src/develop.rs:6522`](../ui/dr-ui/src/develop.rs#L6522), [`ui/dr-ui/src/develop.rs:6576`](../ui/dr-ui/src/develop.rs#L6576), [`ui/dr-ui/src/develop.rs:6678`](../ui/dr-ui/src/develop.rs#L6678), [`ui/dr-ui/src/export.rs:799`](../ui/dr-ui/src/export.rs#L799), [`ui/dr-ui/src/lib.rs:1205`](../ui/dr-ui/src/lib.rs#L1205), [`ui/dr-ui/src/lib.rs:1724`](../ui/dr-ui/src/lib.rs#L1724), [`ui/dr-ui/src/lib.rs:2272`](../ui/dr-ui/src/lib.rs#L2272), [`ui/dr-ui/src/lib.rs:2410`](../ui/dr-ui/src/lib.rs#L2410), [`ui/dr-ui/src/lib.rs:744`](../ui/dr-ui/src/lib.rs#L744), [`ui/dr-ui/src/library.rs:1376`](../ui/dr-ui/src/library.rs#L1376), [`ui/dr-ui/src/library.rs:1411`](../ui/dr-ui/src/library.rs#L1411), [`ui/dr-ui/src/library.rs:2219`](../ui/dr-ui/src/library.rs#L2219), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500), [`ui/dr-ui/src/library.rs:547`](../ui/dr-ui/src/library.rs#L547), [`ui/dr-ui/src/library.rs:584`](../ui/dr-ui/src/library.rs#L584), [`ui/dr-ui/src/library.rs:7364`](../ui/dr-ui/src/library.rs#L7364), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:845`](../ui/dr-ui/src/library.rs#L845), [`ui/dr-ui/src/library_ui.rs:1281`](../ui/dr-ui/src/library_ui.rs#L1281), [`ui/dr-ui/src/library_ui.rs:6075`](../ui/dr-ui/src/library_ui.rs#L6075), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1) | +| FR-CAT-9 | [`core/dr-catalog/src/cache.rs:1`](../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/scan.rs:1`](../core/dr-catalog/src/scan.rs#L1), [`core/dr-catalog/src/schema.rs:858`](../core/dr-catalog/src/schema.rs#L858), [`core/dr-catalog/src/walk.rs:1022`](../core/dr-catalog/src/walk.rs#L1022), [`core/dr-catalog/src/walk.rs:162`](../core/dr-catalog/src/walk.rs#L162), [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-catalog/src/walk.rs:435`](../core/dr-catalog/src/walk.rs#L435), [`core/dr-catalog/src/walk.rs:728`](../core/dr-catalog/src/walk.rs#L728), [`core/dr-sync-nextcloud/src/desktop_client.rs:30`](../core/dr-sync-nextcloud/src/desktop_client.rs#L30), [`core/dr-sync/src/error.rs:113`](../core/dr-sync/src/error.rs#L113), [`core/dr-sync/src/reachability.rs:1`](../core/dr-sync/src/reachability.rs#L1), [`core/dr-sync/src/scan.rs:200`](../core/dr-sync/src/scan.rs#L200), [`core/dr-sync/src/scan.rs:505`](../core/dr-sync/src/scan.rs#L505), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4667`](../ui/dr-ui/src/develop.rs#L4667), [`ui/dr-ui/src/develop.rs:4710`](../ui/dr-ui/src/develop.rs#L4710), [`ui/dr-ui/src/library.rs:1276`](../ui/dr-ui/src/library.rs#L1276), [`ui/dr-ui/src/library.rs:1329`](../ui/dr-ui/src/library.rs#L1329), [`ui/dr-ui/src/library.rs:1360`](../ui/dr-ui/src/library.rs#L1360), [`ui/dr-ui/src/library.rs:1411`](../ui/dr-ui/src/library.rs#L1411), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:1727`](../ui/dr-ui/src/library.rs#L1727), [`ui/dr-ui/src/library.rs:2179`](../ui/dr-ui/src/library.rs#L2179), [`ui/dr-ui/src/library.rs:2255`](../ui/dr-ui/src/library.rs#L2255), [`ui/dr-ui/src/library.rs:274`](../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5242`](../ui/dr-ui/src/library.rs#L5242), [`ui/dr-ui/src/library.rs:584`](../ui/dr-ui/src/library.rs#L584), [`ui/dr-ui/src/library.rs:829`](../ui/dr-ui/src/library.rs#L829), [`ui/dr-ui/src/library.rs:845`](../ui/dr-ui/src/library.rs#L845), [`ui/dr-ui/src/library.rs:899`](../ui/dr-ui/src/library.rs#L899), [`ui/dr-ui/src/library_ui.rs:1348`](../ui/dr-ui/src/library_ui.rs#L1348), [`ui/dr-ui/src/library_ui.rs:1939`](../ui/dr-ui/src/library_ui.rs#L1939), [`ui/dr-ui/src/library_ui.rs:1983`](../ui/dr-ui/src/library_ui.rs#L1983), [`ui/dr-ui/src/library_ui.rs:1999`](../ui/dr-ui/src/library_ui.rs#L1999), [`ui/dr-ui/src/library_ui.rs:2093`](../ui/dr-ui/src/library_ui.rs#L2093), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2956`](../ui/dr-ui/src/library_ui.rs#L2956), [`ui/dr-ui/src/library_ui.rs:317`](../ui/dr-ui/src/library_ui.rs#L317), [`ui/dr-ui/src/library_ui.rs:325`](../ui/dr-ui/src/library_ui.rs#L325), [`ui/dr-ui/src/library_ui.rs:3394`](../ui/dr-ui/src/library_ui.rs#L3394), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3894`](../ui/dr-ui/src/library_ui.rs#L3894), [`ui/dr-ui/src/library_ui.rs:3982`](../ui/dr-ui/src/library_ui.rs#L3982), [`ui/dr-ui/src/library_ui.rs:4166`](../ui/dr-ui/src/library_ui.rs#L4166), [`ui/dr-ui/src/library_ui.rs:4280`](../ui/dr-ui/src/library_ui.rs#L4280), [`ui/dr-ui/src/library_ui.rs:539`](../ui/dr-ui/src/library_ui.rs#L539), [`ui/dr-ui/src/library_ui.rs:602`](../ui/dr-ui/src/library_ui.rs#L602), [`ui/dr-ui/src/library_ui.rs:6572`](../ui/dr-ui/src/library_ui.rs#L6572), [`ui/dr-ui/src/library_ui.rs:6654`](../ui/dr-ui/src/library_ui.rs#L6654), [`ui/dr-ui/src/presets.rs:468`](../ui/dr-ui/src/presets.rs#L468), [`ui/dr-ui/src/presets.rs:480`](../ui/dr-ui/src/presets.rs#L480), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | | FR-CULL-1 | [`core/dr-decode/src/preview.rs:121`](../core/dr-decode/src/preview.rs#L121) | -| FR-CULL-10 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:413`](../core/dr-catalog/src/schema.rs#L413), [`core/dr-catalog/src/schema.rs:591`](../core/dr-catalog/src/schema.rs#L591), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`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:117`](../core/dr-types/src/settings.rs#L117), [`ui/dr-ui/src/develop.rs:121`](../ui/dr-ui/src/develop.rs#L121), [`ui/dr-ui/src/develop.rs:130`](../ui/dr-ui/src/develop.rs#L130), [`ui/dr-ui/src/develop.rs:196`](../ui/dr-ui/src/develop.rs#L196), [`ui/dr-ui/src/develop.rs:2392`](../ui/dr-ui/src/develop.rs#L2392), [`ui/dr-ui/src/develop.rs:715`](../ui/dr-ui/src/develop.rs#L715), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2379`](../ui/dr-ui/src/lib.rs#L2379), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | +| FR-CULL-10 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:413`](../core/dr-catalog/src/schema.rs#L413), [`core/dr-catalog/src/schema.rs:591`](../core/dr-catalog/src/schema.rs#L591), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`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:117`](../core/dr-types/src/settings.rs#L117), [`ui/dr-ui/src/develop.rs:121`](../ui/dr-ui/src/develop.rs#L121), [`ui/dr-ui/src/develop.rs:130`](../ui/dr-ui/src/develop.rs#L130), [`ui/dr-ui/src/develop.rs:196`](../ui/dr-ui/src/develop.rs#L196), [`ui/dr-ui/src/develop.rs:2392`](../ui/dr-ui/src/develop.rs#L2392), [`ui/dr-ui/src/develop.rs:715`](../ui/dr-ui/src/develop.rs#L715), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2382`](../ui/dr-ui/src/lib.rs#L2382), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | | FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/library.rs:295`](../ui/dr-ui/src/library.rs#L295), [`ui/dr-ui/src/library.rs:325`](../ui/dr-ui/src/library.rs#L325), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | | FR-CULL-12 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:413`](../core/dr-catalog/src/schema.rs#L413), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | | FR-CULL-2 | [`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), [`ui/dr-ui/src/import.rs:463`](../ui/dr-ui/src/import.rs#L463) | -| 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.rs:4094`](../ui/dr-ui/src/develop.rs#L4094), [`ui/dr-ui/src/develop.rs:4107`](../ui/dr-ui/src/develop.rs#L4107), [`ui/dr-ui/src/develop.rs:4152`](../ui/dr-ui/src/develop.rs#L4152), [`ui/dr-ui/src/develop.rs:4163`](../ui/dr-ui/src/develop.rs#L4163), [`ui/dr-ui/src/develop.rs:4169`](../ui/dr-ui/src/develop.rs#L4169), [`ui/dr-ui/src/develop.rs:4186`](../ui/dr-ui/src/develop.rs#L4186), [`ui/dr-ui/src/develop.rs:789`](../ui/dr-ui/src/develop.rs#L789), [`ui/dr-ui/src/develop.rs:809`](../ui/dr-ui/src/develop.rs#L809), [`ui/dr-ui/src/develop.rs:815`](../ui/dr-ui/src/develop.rs#L815), [`ui/dr-ui/src/develop.rs:8432`](../ui/dr-ui/src/develop.rs#L8432), [`ui/dr-ui/src/develop.rs:8496`](../ui/dr-ui/src/develop.rs#L8496), [`ui/dr-ui/src/develop.rs:8519`](../ui/dr-ui/src/develop.rs#L8519), [`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:1760`](../ui/dr-ui/src/lib.rs#L1760), [`ui/dr-ui/src/lib.rs:1857`](../ui/dr-ui/src/lib.rs#L1857), [`ui/dr-ui/src/lib.rs:1966`](../ui/dr-ui/src/lib.rs#L1966), [`ui/dr-ui/src/lib.rs:2007`](../ui/dr-ui/src/lib.rs#L2007), [`ui/dr-ui/src/lib.rs:3416`](../ui/dr-ui/src/lib.rs#L3416), [`ui/dr-ui/src/lib.rs:429`](../ui/dr-ui/src/lib.rs#L429), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:1899`](../ui/dr-ui/ui/app.slint#L1899), [`ui/dr-ui/ui/app.slint:2884`](../ui/dr-ui/ui/app.slint#L2884), [`ui/dr-ui/ui/app.slint:79`](../ui/dr-ui/ui/app.slint#L79), [`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-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.rs:4094`](../ui/dr-ui/src/develop.rs#L4094), [`ui/dr-ui/src/develop.rs:4107`](../ui/dr-ui/src/develop.rs#L4107), [`ui/dr-ui/src/develop.rs:4152`](../ui/dr-ui/src/develop.rs#L4152), [`ui/dr-ui/src/develop.rs:4163`](../ui/dr-ui/src/develop.rs#L4163), [`ui/dr-ui/src/develop.rs:4169`](../ui/dr-ui/src/develop.rs#L4169), [`ui/dr-ui/src/develop.rs:4186`](../ui/dr-ui/src/develop.rs#L4186), [`ui/dr-ui/src/develop.rs:789`](../ui/dr-ui/src/develop.rs#L789), [`ui/dr-ui/src/develop.rs:809`](../ui/dr-ui/src/develop.rs#L809), [`ui/dr-ui/src/develop.rs:815`](../ui/dr-ui/src/develop.rs#L815), [`ui/dr-ui/src/develop.rs:8432`](../ui/dr-ui/src/develop.rs#L8432), [`ui/dr-ui/src/develop.rs:8496`](../ui/dr-ui/src/develop.rs#L8496), [`ui/dr-ui/src/develop.rs:8519`](../ui/dr-ui/src/develop.rs#L8519), [`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:1763`](../ui/dr-ui/src/lib.rs#L1763), [`ui/dr-ui/src/lib.rs:1860`](../ui/dr-ui/src/lib.rs#L1860), [`ui/dr-ui/src/lib.rs:1969`](../ui/dr-ui/src/lib.rs#L1969), [`ui/dr-ui/src/lib.rs:2010`](../ui/dr-ui/src/lib.rs#L2010), [`ui/dr-ui/src/lib.rs:3419`](../ui/dr-ui/src/lib.rs#L3419), [`ui/dr-ui/src/lib.rs:429`](../ui/dr-ui/src/lib.rs#L429), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:1908`](../ui/dr-ui/ui/app.slint#L1908), [`ui/dr-ui/ui/app.slint:2893`](../ui/dr-ui/ui/app.slint#L2893), [`ui/dr-ui/ui/app.slint:79`](../ui/dr-ui/ui/app.slint#L79), [`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:139`](../core/dr-pipeline/src/sidecar.rs#L139), [`core/dr-xmp/src/lib.rs:442`](../core/dr-xmp/src/lib.rs#L442), [`ui/dr-ui/src/library.rs:254`](../ui/dr-ui/src/library.rs#L254), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500) | -| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:456`](../core/dr-catalog/src/schema.rs#L456), [`ui/dr-ui/src/bursts.rs:1`](../ui/dr-ui/src/bursts.rs#L1), [`ui/dr-ui/src/library.rs:210`](../ui/dr-ui/src/library.rs#L210), [`ui/dr-ui/src/library.rs:6020`](../ui/dr-ui/src/library.rs#L6020) | -| 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:524`](../core/dr-catalog/src/schema.rs#L524), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`core/dr-face/src/align.rs:291`](../core/dr-face/src/align.rs#L291), [`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/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:331`](../ui/dr-ui/src/faces.rs#L331), [`ui/dr-ui/src/faces.rs:347`](../ui/dr-ui/src/faces.rs#L347), [`ui/dr-ui/src/faces.rs:454`](../ui/dr-ui/src/faces.rs#L454), [`ui/dr-ui/src/identity_ui.rs:542`](../ui/dr-ui/src/identity_ui.rs#L542), [`ui/dr-ui/src/lib.rs:1379`](../ui/dr-ui/src/lib.rs#L1379), [`ui/dr-ui/src/library.rs:3293`](../ui/dr-ui/src/library.rs#L3293), [`ui/dr-ui/src/library.rs:3451`](../ui/dr-ui/src/library.rs#L3451), [`ui/dr-ui/src/library.rs:3698`](../ui/dr-ui/src/library.rs#L3698), [`ui/dr-ui/src/library.rs:3864`](../ui/dr-ui/src/library.rs#L3864), [`ui/dr-ui/src/library.rs:3900`](../ui/dr-ui/src/library.rs#L3900), [`ui/dr-ui/src/library.rs:3980`](../ui/dr-ui/src/library.rs#L3980), [`ui/dr-ui/ui/settings.slint:427`](../ui/dr-ui/ui/settings.slint#L427), [`ui/dr-ui/ui/settings.slint:82`](../ui/dr-ui/ui/settings.slint#L82) | +| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:456`](../core/dr-catalog/src/schema.rs#L456), [`ui/dr-ui/src/bursts.rs:1`](../ui/dr-ui/src/bursts.rs#L1), [`ui/dr-ui/src/library.rs:210`](../ui/dr-ui/src/library.rs#L210), [`ui/dr-ui/src/library.rs:6023`](../ui/dr-ui/src/library.rs#L6023) | +| 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:524`](../core/dr-catalog/src/schema.rs#L524), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`core/dr-face/src/align.rs:291`](../core/dr-face/src/align.rs#L291), [`core/dr-types/src/settings.rs:164`](../core/dr-types/src/settings.rs#L164), [`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:116`](../ui/dr-ui/src/derived_sync.rs#L116), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:331`](../ui/dr-ui/src/faces.rs#L331), [`ui/dr-ui/src/faces.rs:347`](../ui/dr-ui/src/faces.rs#L347), [`ui/dr-ui/src/faces.rs:454`](../ui/dr-ui/src/faces.rs#L454), [`ui/dr-ui/src/identity_ui.rs:548`](../ui/dr-ui/src/identity_ui.rs#L548), [`ui/dr-ui/src/lib.rs:1380`](../ui/dr-ui/src/lib.rs#L1380), [`ui/dr-ui/src/lib.rs:3594`](../ui/dr-ui/src/lib.rs#L3594), [`ui/dr-ui/src/library.rs:3293`](../ui/dr-ui/src/library.rs#L3293), [`ui/dr-ui/src/library.rs:3451`](../ui/dr-ui/src/library.rs#L3451), [`ui/dr-ui/src/library.rs:3698`](../ui/dr-ui/src/library.rs#L3698), [`ui/dr-ui/src/library.rs:3864`](../ui/dr-ui/src/library.rs#L3864), [`ui/dr-ui/src/library.rs:3900`](../ui/dr-ui/src/library.rs#L3900), [`ui/dr-ui/src/library.rs:3980`](../ui/dr-ui/src/library.rs#L3980), [`ui/dr-ui/src/library_ui.rs:394`](../ui/dr-ui/src/library_ui.rs#L394), [`ui/dr-ui/src/library_ui.rs:474`](../ui/dr-ui/src/library_ui.rs#L474), [`ui/dr-ui/src/settings_ui.rs:191`](../ui/dr-ui/src/settings_ui.rs#L191), [`ui/dr-ui/src/settings_ui.rs:507`](../ui/dr-ui/src/settings_ui.rs#L507), [`ui/dr-ui/ui/app.slint:882`](../ui/dr-ui/ui/app.slint#L882), [`ui/dr-ui/ui/settings.slint:434`](../ui/dr-ui/ui/settings.slint#L434), [`ui/dr-ui/ui/settings.slint:82`](../ui/dr-ui/ui/settings.slint#L82), [`ui/dr-ui/ui/settings.slint:94`](../ui/dr-ui/ui/settings.slint#L94) | | FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:591`](../core/dr-catalog/src/schema.rs#L591), [`core/dr-catalog/src/schema.rs:687`](../core/dr-catalog/src/schema.rs#L687), [`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:117`](../core/dr-types/src/settings.rs#L117), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:454`](../ui/dr-ui/src/faces.rs#L454), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/library.rs:3397`](../ui/dr-ui/src/library.rs#L3397), [`ui/dr-ui/src/library.rs:3980`](../ui/dr-ui/src/library.rs#L3980), [`ui/dr-ui/ui/identity.slint:314`](../ui/dr-ui/ui/identity.slint#L314) | | 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) | | FR-DEV-10 | [`core/dr-gpu/src/mask.rs:1015`](../core/dr-gpu/src/mask.rs#L1015), [`core/dr-gpu/src/mask.rs:1239`](../core/dr-gpu/src/mask.rs#L1239), [`core/dr-gpu/src/mask.rs:1471`](../core/dr-gpu/src/mask.rs#L1471), [`core/dr-gpu/src/mask.rs:421`](../core/dr-gpu/src/mask.rs#L421), [`core/dr-gpu/src/mask.rs:463`](../core/dr-gpu/src/mask.rs#L463), [`core/dr-gpu/src/mask.rs:58`](../core/dr-gpu/src/mask.rs#L58), [`core/dr-gpu/src/mask.rs:60`](../core/dr-gpu/src/mask.rs#L60), [`core/dr-gpu/src/mask.rs:822`](../core/dr-gpu/src/mask.rs#L822), [`core/dr-gpu/src/mask.rs:85`](../core/dr-gpu/src/mask.rs#L85), [`core/dr-gpu/src/mask.rs:901`](../core/dr-gpu/src/mask.rs#L901), [`core/dr-gpu/src/shaders/mask.wgsl:117`](../core/dr-gpu/src/shaders/mask.wgsl#L117), [`core/dr-gpu/src/shaders/mask.wgsl:59`](../core/dr-gpu/src/shaders/mask.wgsl#L59), [`core/dr-gpu/tests/range_masks.rs:119`](../core/dr-gpu/tests/range_masks.rs#L119), [`core/dr-gpu/tests/range_masks.rs:147`](../core/dr-gpu/tests/range_masks.rs#L147), [`core/dr-gpu/tests/range_masks.rs:175`](../core/dr-gpu/tests/range_masks.rs#L175), [`core/dr-gpu/tests/range_masks.rs:1`](../core/dr-gpu/tests/range_masks.rs#L1), [`core/dr-gpu/tests/range_masks.rs:94`](../core/dr-gpu/tests/range_masks.rs#L94), [`core/dr-pipeline/src/mask.rs:125`](../core/dr-pipeline/src/mask.rs#L125), [`core/dr-pipeline/src/mask.rs:2812`](../core/dr-pipeline/src/mask.rs#L2812), [`core/dr-pipeline/src/mask.rs:2825`](../core/dr-pipeline/src/mask.rs#L2825), [`core/dr-pipeline/src/mask.rs:2844`](../core/dr-pipeline/src/mask.rs#L2844), [`core/dr-pipeline/src/mask.rs:2858`](../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2868`](../core/dr-pipeline/src/mask.rs#L2868), [`core/dr-pipeline/src/mask.rs:709`](../core/dr-pipeline/src/mask.rs#L709), [`core/dr-pipeline/src/mask.rs:748`](../core/dr-pipeline/src/mask.rs#L748), [`core/dr-pipeline/src/mask.rs:808`](../core/dr-pipeline/src/mask.rs#L808), [`core/dr-pipeline/src/mask.rs:827`](../core/dr-pipeline/src/mask.rs#L827), [`core/dr-pipeline/src/mask.rs:851`](../core/dr-pipeline/src/mask.rs#L851), [`core/dr-pipeline/src/mask.rs:863`](../core/dr-pipeline/src/mask.rs#L863), [`core/dr-pipeline/src/mask.rs:875`](../core/dr-pipeline/src/mask.rs#L875), [`core/dr-pipeline/src/sidecar.rs:1224`](../core/dr-pipeline/src/sidecar.rs#L1224), [`core/dr-pipeline/src/sidecar.rs:1403`](../core/dr-pipeline/src/sidecar.rs#L1403), [`core/dr-pipeline/src/sidecar.rs:1490`](../core/dr-pipeline/src/sidecar.rs#L1490), [`core/dr-pipeline/src/sidecar.rs:1591`](../core/dr-pipeline/src/sidecar.rs#L1591), [`core/dr-pipeline/src/sidecar.rs:1798`](../core/dr-pipeline/src/sidecar.rs#L1798), [`core/dr-pipeline/tests/mask_sidecar.rs:1157`](../core/dr-pipeline/tests/mask_sidecar.rs#L1157), [`core/dr-pipeline/tests/mask_sidecar.rs:1186`](../core/dr-pipeline/tests/mask_sidecar.rs#L1186), [`core/dr-pipeline/tests/mask_sidecar.rs:1204`](../core/dr-pipeline/tests/mask_sidecar.rs#L1204), [`core/dr-pipeline/tests/mask_sidecar.rs:1234`](../core/dr-pipeline/tests/mask_sidecar.rs#L1234), [`ui/dr-ui/src/develop.rs:2294`](../ui/dr-ui/src/develop.rs#L2294), [`ui/dr-ui/src/develop.rs:3614`](../ui/dr-ui/src/develop.rs#L3614), [`ui/dr-ui/src/develop.rs:3641`](../ui/dr-ui/src/develop.rs#L3641), [`ui/dr-ui/src/develop.rs:3673`](../ui/dr-ui/src/develop.rs#L3673), [`ui/dr-ui/src/develop.rs:3697`](../ui/dr-ui/src/develop.rs#L3697), [`ui/dr-ui/src/develop.rs:3703`](../ui/dr-ui/src/develop.rs#L3703), [`ui/dr-ui/src/develop.rs:3710`](../ui/dr-ui/src/develop.rs#L3710), [`ui/dr-ui/src/develop.rs:3730`](../ui/dr-ui/src/develop.rs#L3730), [`ui/dr-ui/src/labels.rs:60`](../ui/dr-ui/src/labels.rs#L60), [`ui/dr-ui/src/masks_ui.rs:1102`](../ui/dr-ui/src/masks_ui.rs#L1102), [`ui/dr-ui/src/masks_ui.rs:719`](../ui/dr-ui/src/masks_ui.rs#L719) | | FR-DEV-12 | [`core/dr-pipeline/ops/colour_grading.yaml:1`](../core/dr-pipeline/ops/colour_grading.yaml#L1) | | FR-DEV-18 | [`core/dr-pipeline/src/ops/dehaze.rs:1`](../core/dr-pipeline/src/ops/dehaze.rs#L1), [`core/dr-pipeline/src/ops/dehaze.rs:221`](../core/dr-pipeline/src/ops/dehaze.rs#L221) | | FR-DEV-19a | [`ui/dr-ui/src/develop.rs:2897`](../ui/dr-ui/src/develop.rs#L2897), [`ui/dr-ui/src/develop.rs:2958`](../ui/dr-ui/src/develop.rs#L2958), [`ui/dr-ui/src/develop.rs:859`](../ui/dr-ui/src/develop.rs#L859), [`ui/dr-ui/src/labels.rs:70`](../ui/dr-ui/src/labels.rs#L70), [`ui/dr-ui/src/masks_ui.rs:1400`](../ui/dr-ui/src/masks_ui.rs#L1400), [`ui/dr-ui/src/masks_ui.rs:270`](../ui/dr-ui/src/masks_ui.rs#L270), [`ui/dr-ui/src/masks_ui.rs:988`](../ui/dr-ui/src/masks_ui.rs#L988), [`ui/dr-ui/ui/masks.slint:148`](../ui/dr-ui/ui/masks.slint#L148), [`ui/dr-ui/ui/masks.slint:173`](../ui/dr-ui/ui/masks.slint#L173), [`ui/dr-ui/ui/masks.slint:332`](../ui/dr-ui/ui/masks.slint#L332), [`ui/dr-ui/ui/masks.slint:730`](../ui/dr-ui/ui/masks.slint#L730), [`ui/dr-ui/ui/masks.slint:809`](../ui/dr-ui/ui/masks.slint#L809) | -| FR-DEV-19b | [`ui/dr-ui/src/develop.rs:3039`](../ui/dr-ui/src/develop.rs#L3039), [`ui/dr-ui/src/develop.rs:3582`](../ui/dr-ui/src/develop.rs#L3582), [`ui/dr-ui/src/develop.rs:868`](../ui/dr-ui/src/develop.rs#L868), [`ui/dr-ui/src/develop.rs:875`](../ui/dr-ui/src/develop.rs#L875), [`ui/dr-ui/src/labels.rs:64`](../ui/dr-ui/src/labels.rs#L64), [`ui/dr-ui/src/masks_ui.rs:1074`](../ui/dr-ui/src/masks_ui.rs#L1074), [`ui/dr-ui/src/masks_ui.rs:1293`](../ui/dr-ui/src/masks_ui.rs#L1293), [`ui/dr-ui/src/masks_ui.rs:1321`](../ui/dr-ui/src/masks_ui.rs#L1321), [`ui/dr-ui/src/masks_ui.rs:1664`](../ui/dr-ui/src/masks_ui.rs#L1664), [`ui/dr-ui/src/masks_ui.rs:829`](../ui/dr-ui/src/masks_ui.rs#L829), [`ui/dr-ui/ui/app.slint:2131`](../ui/dr-ui/ui/app.slint#L2131), [`ui/dr-ui/ui/app.slint:986`](../ui/dr-ui/ui/app.slint#L986), [`ui/dr-ui/ui/masks.slint:1078`](../ui/dr-ui/ui/masks.slint#L1078), [`ui/dr-ui/ui/masks.slint:421`](../ui/dr-ui/ui/masks.slint#L421), [`ui/dr-ui/ui/masks.slint:734`](../ui/dr-ui/ui/masks.slint#L734), [`ui/dr-ui/ui/masks.slint:802`](../ui/dr-ui/ui/masks.slint#L802), [`ui/dr-ui/ui/masks.slint:816`](../ui/dr-ui/ui/masks.slint#L816) | +| FR-DEV-19b | [`ui/dr-ui/src/develop.rs:3039`](../ui/dr-ui/src/develop.rs#L3039), [`ui/dr-ui/src/develop.rs:3582`](../ui/dr-ui/src/develop.rs#L3582), [`ui/dr-ui/src/develop.rs:868`](../ui/dr-ui/src/develop.rs#L868), [`ui/dr-ui/src/develop.rs:875`](../ui/dr-ui/src/develop.rs#L875), [`ui/dr-ui/src/labels.rs:64`](../ui/dr-ui/src/labels.rs#L64), [`ui/dr-ui/src/masks_ui.rs:1074`](../ui/dr-ui/src/masks_ui.rs#L1074), [`ui/dr-ui/src/masks_ui.rs:1293`](../ui/dr-ui/src/masks_ui.rs#L1293), [`ui/dr-ui/src/masks_ui.rs:1321`](../ui/dr-ui/src/masks_ui.rs#L1321), [`ui/dr-ui/src/masks_ui.rs:1664`](../ui/dr-ui/src/masks_ui.rs#L1664), [`ui/dr-ui/src/masks_ui.rs:829`](../ui/dr-ui/src/masks_ui.rs#L829), [`ui/dr-ui/ui/app.slint:2140`](../ui/dr-ui/ui/app.slint#L2140), [`ui/dr-ui/ui/app.slint:992`](../ui/dr-ui/ui/app.slint#L992), [`ui/dr-ui/ui/masks.slint:1078`](../ui/dr-ui/ui/masks.slint#L1078), [`ui/dr-ui/ui/masks.slint:421`](../ui/dr-ui/ui/masks.slint#L421), [`ui/dr-ui/ui/masks.slint:734`](../ui/dr-ui/ui/masks.slint#L734), [`ui/dr-ui/ui/masks.slint:802`](../ui/dr-ui/ui/masks.slint#L802), [`ui/dr-ui/ui/masks.slint:816`](../ui/dr-ui/ui/masks.slint#L816) | | FR-DEV-19c | [`core/dr-gpu/src/mask.rs:715`](../core/dr-gpu/src/mask.rs#L715), [`core/dr-gpu/tests/local_adjustments.rs:830`](../core/dr-gpu/tests/local_adjustments.rs#L830), [`core/dr-gpu/tests/local_adjustments.rs:887`](../core/dr-gpu/tests/local_adjustments.rs#L887), [`core/dr-gpu/tests/local_adjustments.rs:922`](../core/dr-gpu/tests/local_adjustments.rs#L922), [`core/dr-gpu/tests/local_adjustments.rs:967`](../core/dr-gpu/tests/local_adjustments.rs#L967), [`core/dr-pipeline/src/graph.rs:852`](../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/mask.rs:1763`](../core/dr-pipeline/src/mask.rs#L1763), [`core/dr-pipeline/src/mask.rs:1789`](../core/dr-pipeline/src/mask.rs#L1789), [`core/dr-pipeline/src/mask.rs:1804`](../core/dr-pipeline/src/mask.rs#L1804), [`core/dr-pipeline/src/mask.rs:1924`](../core/dr-pipeline/src/mask.rs#L1924), [`core/dr-pipeline/src/mask.rs:1972`](../core/dr-pipeline/src/mask.rs#L1972), [`core/dr-pipeline/src/mask.rs:2116`](../core/dr-pipeline/src/mask.rs#L2116), [`core/dr-pipeline/src/mask.rs:2353`](../core/dr-pipeline/src/mask.rs#L2353), [`core/dr-pipeline/src/operation.rs:1600`](../core/dr-pipeline/src/operation.rs#L1600), [`core/dr-pipeline/src/operation.rs:558`](../core/dr-pipeline/src/operation.rs#L558), [`core/dr-pipeline/src/operation.rs:741`](../core/dr-pipeline/src/operation.rs#L741), [`ui/dr-ui/src/develop.rs:2011`](../ui/dr-ui/src/develop.rs#L2011), [`ui/dr-ui/src/develop.rs:2271`](../ui/dr-ui/src/develop.rs#L2271), [`ui/dr-ui/src/develop.rs:2518`](../ui/dr-ui/src/develop.rs#L2518), [`ui/dr-ui/src/develop.rs:2642`](../ui/dr-ui/src/develop.rs#L2642), [`ui/dr-ui/src/develop.rs:4016`](../ui/dr-ui/src/develop.rs#L4016), [`ui/dr-ui/src/develop.rs:6693`](../ui/dr-ui/src/develop.rs#L6693), [`ui/dr-ui/src/develop.rs:6729`](../ui/dr-ui/src/develop.rs#L6729), [`ui/dr-ui/src/develop.rs:686`](../ui/dr-ui/src/develop.rs#L686), [`ui/dr-ui/src/develop.rs:695`](../ui/dr-ui/src/develop.rs#L695), [`ui/dr-ui/src/develop.rs:894`](../ui/dr-ui/src/develop.rs#L894), [`ui/dr-ui/src/develop.rs:903`](../ui/dr-ui/src/develop.rs#L903), [`ui/dr-ui/src/masks_ui.rs:1293`](../ui/dr-ui/src/masks_ui.rs#L1293), [`ui/dr-ui/src/masks_ui.rs:152`](../ui/dr-ui/src/masks_ui.rs#L152), [`ui/dr-ui/src/masks_ui.rs:1664`](../ui/dr-ui/src/masks_ui.rs#L1664), [`ui/dr-ui/src/masks_ui.rs:290`](../ui/dr-ui/src/masks_ui.rs#L290), [`ui/dr-ui/src/masks_ui.rs:316`](../ui/dr-ui/src/masks_ui.rs#L316), [`ui/dr-ui/src/masks_ui.rs:633`](../ui/dr-ui/src/masks_ui.rs#L633), [`ui/dr-ui/src/masks_ui.rs:911`](../ui/dr-ui/src/masks_ui.rs#L911), [`ui/dr-ui/src/masks_ui.rs:939`](../ui/dr-ui/src/masks_ui.rs#L939), [`ui/dr-ui/ui/icons.slint:339`](../ui/dr-ui/ui/icons.slint#L339), [`ui/dr-ui/ui/masks.slint:1043`](../ui/dr-ui/ui/masks.slint#L1043), [`ui/dr-ui/ui/masks.slint:180`](../ui/dr-ui/ui/masks.slint#L180), [`ui/dr-ui/ui/masks.slint:287`](../ui/dr-ui/ui/masks.slint#L287), [`ui/dr-ui/ui/masks.slint:485`](../ui/dr-ui/ui/masks.slint#L485), [`ui/dr-ui/ui/masks.slint:70`](../ui/dr-ui/ui/masks.slint#L70), [`ui/dr-ui/ui/masks.slint:742`](../ui/dr-ui/ui/masks.slint#L742), [`ui/dr-ui/ui/masks.slint:804`](../ui/dr-ui/ui/masks.slint#L804), [`ui/dr-ui/ui/masks.slint:890`](../ui/dr-ui/ui/masks.slint#L890) | | FR-DEV-2 | [`core/dr-pipeline/src/operation.rs:403`](../core/dr-pipeline/src/operation.rs#L403) | -| FR-DEV-3 | [`core/dr-gpu/src/adjust.rs:2217`](../core/dr-gpu/src/adjust.rs#L2217), [`core/dr-gpu/src/adjust.rs:651`](../core/dr-gpu/src/adjust.rs#L651), [`core/dr-gpu/src/adjust.rs:770`](../core/dr-gpu/src/adjust.rs#L770), [`core/dr-gpu/src/adjust.rs:84`](../core/dr-gpu/src/adjust.rs#L84), [`core/dr-gpu/tests/tone_curve.rs:1`](../core/dr-gpu/tests/tone_curve.rs#L1), [`core/dr-pipeline/src/coverage.rs:122`](../core/dr-pipeline/src/coverage.rs#L122), [`core/dr-pipeline/src/coverage.rs:1`](../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/detail.rs:434`](../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:524`](../core/dr-pipeline/src/detail.rs#L524), [`core/dr-pipeline/src/framing.rs:177`](../core/dr-pipeline/src/framing.rs#L177), [`core/dr-pipeline/src/framing.rs:234`](../core/dr-pipeline/src/framing.rs#L234), [`core/dr-pipeline/src/framing.rs:314`](../core/dr-pipeline/src/framing.rs#L314), [`core/dr-pipeline/src/framing.rs:498`](../core/dr-pipeline/src/framing.rs#L498), [`core/dr-pipeline/src/framing.rs:753`](../core/dr-pipeline/src/framing.rs#L753), [`core/dr-pipeline/src/graph.rs:1305`](../core/dr-pipeline/src/graph.rs#L1305), [`core/dr-pipeline/src/graph.rs:1336`](../core/dr-pipeline/src/graph.rs#L1336), [`core/dr-pipeline/src/graph.rs:1359`](../core/dr-pipeline/src/graph.rs#L1359), [`core/dr-pipeline/src/graph.rs:1397`](../core/dr-pipeline/src/graph.rs#L1397), [`core/dr-pipeline/src/graph.rs:1428`](../core/dr-pipeline/src/graph.rs#L1428), [`core/dr-pipeline/src/graph.rs:225`](../core/dr-pipeline/src/graph.rs#L225), [`core/dr-pipeline/src/graph.rs:306`](../core/dr-pipeline/src/graph.rs#L306), [`core/dr-pipeline/src/graph.rs:344`](../core/dr-pipeline/src/graph.rs#L344), [`core/dr-pipeline/src/graph.rs:350`](../core/dr-pipeline/src/graph.rs#L350), [`core/dr-pipeline/src/graph.rs:911`](../core/dr-pipeline/src/graph.rs#L911), [`core/dr-pipeline/src/lens.rs:93`](../core/dr-pipeline/src/lens.rs#L93), [`core/dr-pipeline/src/mask.rs:205`](../core/dr-pipeline/src/mask.rs#L205), [`core/dr-pipeline/src/neutral.rs:1`](../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:300`](../core/dr-pipeline/src/neutral.rs#L300), [`core/dr-pipeline/src/neutral.rs:316`](../core/dr-pipeline/src/neutral.rs#L316), [`core/dr-pipeline/src/neutral.rs:332`](../core/dr-pipeline/src/neutral.rs#L332), [`core/dr-pipeline/src/neutral.rs:354`](../core/dr-pipeline/src/neutral.rs#L354), [`core/dr-pipeline/src/neutral.rs:79`](../core/dr-pipeline/src/neutral.rs#L79), [`core/dr-pipeline/src/operation.rs:330`](../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:535`](../core/dr-pipeline/src/operation.rs#L535), [`core/dr-pipeline/src/ops/capture_sharpen.rs:1`](../core/dr-pipeline/src/ops/capture_sharpen.rs#L1), [`core/dr-pipeline/src/ops/capture_sharpen.rs:210`](../core/dr-pipeline/src/ops/capture_sharpen.rs#L210), [`core/dr-pipeline/src/ops/curve.rs:100`](../core/dr-pipeline/src/ops/curve.rs#L100), [`core/dr-pipeline/src/ops/curve.rs:1`](../core/dr-pipeline/src/ops/curve.rs#L1), [`core/dr-pipeline/src/ops/curve.rs:219`](../core/dr-pipeline/src/ops/curve.rs#L219), [`core/dr-pipeline/src/ops/curve.rs:635`](../core/dr-pipeline/src/ops/curve.rs#L635), [`core/dr-pipeline/src/ops/local_contrast.rs:1`](../core/dr-pipeline/src/ops/local_contrast.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:1`](../core/dr-pipeline/src/ops/noise_reduction.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:273`](../core/dr-pipeline/src/ops/noise_reduction.rs#L273), [`core/dr-pipeline/src/preset.rs:751`](../core/dr-pipeline/src/preset.rs#L751), [`core/dr-pipeline/src/sidecar.rs:1288`](../core/dr-pipeline/src/sidecar.rs#L1288), [`core/dr-pipeline/src/sidecar.rs:160`](../core/dr-pipeline/src/sidecar.rs#L160), [`core/dr-pipeline/src/sidecar.rs:2114`](../core/dr-pipeline/src/sidecar.rs#L2114), [`core/dr-pipeline/src/sidecar.rs:2174`](../core/dr-pipeline/src/sidecar.rs#L2174), [`core/dr-pipeline/tests/tone_curve.rs:1`](../core/dr-pipeline/tests/tone_curve.rs#L1), [`core/dr-segment/src/refine.rs:937`](../core/dr-segment/src/refine.rs#L937), [`ui/dr-ui/src/develop.rs:103`](../ui/dr-ui/src/develop.rs#L103), [`ui/dr-ui/src/develop.rs:1294`](../ui/dr-ui/src/develop.rs#L1294), [`ui/dr-ui/src/develop.rs:1383`](../ui/dr-ui/src/develop.rs#L1383), [`ui/dr-ui/src/develop.rs:1419`](../ui/dr-ui/src/develop.rs#L1419), [`ui/dr-ui/src/develop.rs:165`](../ui/dr-ui/src/develop.rs#L165), [`ui/dr-ui/src/develop.rs:1690`](../ui/dr-ui/src/develop.rs#L1690), [`ui/dr-ui/src/develop.rs:2131`](../ui/dr-ui/src/develop.rs#L2131), [`ui/dr-ui/src/develop.rs:2374`](../ui/dr-ui/src/develop.rs#L2374), [`ui/dr-ui/src/develop.rs:2392`](../ui/dr-ui/src/develop.rs#L2392), [`ui/dr-ui/src/develop.rs:2406`](../ui/dr-ui/src/develop.rs#L2406), [`ui/dr-ui/src/develop.rs:2428`](../ui/dr-ui/src/develop.rs#L2428), [`ui/dr-ui/src/develop.rs:2728`](../ui/dr-ui/src/develop.rs#L2728), [`ui/dr-ui/src/develop.rs:2826`](../ui/dr-ui/src/develop.rs#L2826), [`ui/dr-ui/src/develop.rs:328`](../ui/dr-ui/src/develop.rs#L328), [`ui/dr-ui/src/develop.rs:365`](../ui/dr-ui/src/develop.rs#L365), [`ui/dr-ui/src/develop.rs:4357`](../ui/dr-ui/src/develop.rs#L4357), [`ui/dr-ui/src/develop.rs:4513`](../ui/dr-ui/src/develop.rs#L4513), [`ui/dr-ui/src/develop.rs:4573`](../ui/dr-ui/src/develop.rs#L4573), [`ui/dr-ui/src/develop.rs:4978`](../ui/dr-ui/src/develop.rs#L4978), [`ui/dr-ui/src/develop.rs:5008`](../ui/dr-ui/src/develop.rs#L5008), [`ui/dr-ui/src/develop.rs:5074`](../ui/dr-ui/src/develop.rs#L5074), [`ui/dr-ui/src/develop.rs:5088`](../ui/dr-ui/src/develop.rs#L5088), [`ui/dr-ui/src/develop.rs:5290`](../ui/dr-ui/src/develop.rs#L5290), [`ui/dr-ui/src/develop.rs:5378`](../ui/dr-ui/src/develop.rs#L5378), [`ui/dr-ui/src/develop.rs:588`](../ui/dr-ui/src/develop.rs#L588), [`ui/dr-ui/src/develop.rs:6168`](../ui/dr-ui/src/develop.rs#L6168), [`ui/dr-ui/src/develop.rs:6241`](../ui/dr-ui/src/develop.rs#L6241), [`ui/dr-ui/src/develop.rs:6434`](../ui/dr-ui/src/develop.rs#L6434), [`ui/dr-ui/src/develop.rs:649`](../ui/dr-ui/src/develop.rs#L649), [`ui/dr-ui/src/develop.rs:6522`](../ui/dr-ui/src/develop.rs#L6522), [`ui/dr-ui/src/develop.rs:6678`](../ui/dr-ui/src/develop.rs#L6678), [`ui/dr-ui/src/develop.rs:6834`](../ui/dr-ui/src/develop.rs#L6834), [`ui/dr-ui/src/develop.rs:6878`](../ui/dr-ui/src/develop.rs#L6878), [`ui/dr-ui/src/develop.rs:6928`](../ui/dr-ui/src/develop.rs#L6928), [`ui/dr-ui/src/develop.rs:7353`](../ui/dr-ui/src/develop.rs#L7353), [`ui/dr-ui/src/develop.rs:8081`](../ui/dr-ui/src/develop.rs#L8081), [`ui/dr-ui/src/develop.rs:829`](../ui/dr-ui/src/develop.rs#L829), [`ui/dr-ui/src/develop.rs:922`](../ui/dr-ui/src/develop.rs#L922), [`ui/dr-ui/src/develop.rs:951`](../ui/dr-ui/src/develop.rs#L951), [`ui/dr-ui/src/labels.rs:32`](../ui/dr-ui/src/labels.rs#L32), [`ui/dr-ui/src/lib.rs:1838`](../ui/dr-ui/src/lib.rs#L1838), [`ui/dr-ui/src/lib.rs:2704`](../ui/dr-ui/src/lib.rs#L2704), [`ui/dr-ui/src/lib.rs:2911`](../ui/dr-ui/src/lib.rs#L2911), [`ui/dr-ui/src/lib.rs:2970`](../ui/dr-ui/src/lib.rs#L2970), [`ui/dr-ui/src/lib.rs:3175`](../ui/dr-ui/src/lib.rs#L3175), [`ui/dr-ui/src/lib.rs:3239`](../ui/dr-ui/src/lib.rs#L3239), [`ui/dr-ui/src/lib.rs:3293`](../ui/dr-ui/src/lib.rs#L3293), [`ui/dr-ui/src/lib.rs:412`](../ui/dr-ui/src/lib.rs#L412), [`ui/dr-ui/src/lib.rs:435`](../ui/dr-ui/src/lib.rs#L435), [`ui/dr-ui/src/lib.rs:541`](../ui/dr-ui/src/lib.rs#L541), [`ui/dr-ui/src/lib.rs:565`](../ui/dr-ui/src/lib.rs#L565), [`ui/dr-ui/src/library.rs:547`](../ui/dr-ui/src/library.rs#L547), [`ui/dr-ui/src/masks_ui.rs:1423`](../ui/dr-ui/src/masks_ui.rs#L1423), [`ui/dr-ui/src/masks_ui.rs:1537`](../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/masks_ui.rs:338`](../ui/dr-ui/src/masks_ui.rs#L338), [`ui/dr-ui/src/masks_ui.rs:44`](../ui/dr-ui/src/masks_ui.rs#L44), [`ui/dr-ui/src/presets.rs:409`](../ui/dr-ui/src/presets.rs#L409), [`ui/dr-ui/src/segmentation.rs:116`](../ui/dr-ui/src/segmentation.rs#L116), [`ui/dr-ui/src/segmentation.rs:352`](../ui/dr-ui/src/segmentation.rs#L352), [`ui/dr-ui/src/segmentation.rs:368`](../ui/dr-ui/src/segmentation.rs#L368), [`ui/dr-ui/src/segmentation.rs:498`](../ui/dr-ui/src/segmentation.rs#L498), [`ui/dr-ui/src/segmentation.rs:526`](../ui/dr-ui/src/segmentation.rs#L526), [`ui/dr-ui/ui/adjust.slint:1007`](../ui/dr-ui/ui/adjust.slint#L1007), [`ui/dr-ui/ui/adjust.slint:126`](../ui/dr-ui/ui/adjust.slint#L126), [`ui/dr-ui/ui/adjust.slint:1484`](../ui/dr-ui/ui/adjust.slint#L1484), [`ui/dr-ui/ui/adjust.slint:171`](../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/adjust.slint:46`](../ui/dr-ui/ui/adjust.slint#L46), [`ui/dr-ui/ui/adjust.slint:624`](../ui/dr-ui/ui/adjust.slint#L624), [`ui/dr-ui/ui/adjust.slint:650`](../ui/dr-ui/ui/adjust.slint#L650), [`ui/dr-ui/ui/adjust.slint:669`](../ui/dr-ui/ui/adjust.slint#L669), [`ui/dr-ui/ui/adjust.slint:790`](../ui/dr-ui/ui/adjust.slint#L790), [`ui/dr-ui/ui/adjust.slint:947`](../ui/dr-ui/ui/adjust.slint#L947), [`ui/dr-ui/ui/app.slint:138`](../ui/dr-ui/ui/app.slint#L138), [`ui/dr-ui/ui/app.slint:2196`](../ui/dr-ui/ui/app.slint#L2196), [`ui/dr-ui/ui/app.slint:2256`](../ui/dr-ui/ui/app.slint#L2256), [`ui/dr-ui/ui/develop.slint:223`](../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1167`](../ui/dr-ui/ui/masks.slint#L1167), [`ui/dr-ui/ui/masks.slint:713`](../ui/dr-ui/ui/masks.slint#L713), [`ui/dr-ui/ui/masks.slint:772`](../ui/dr-ui/ui/masks.slint#L772) | -| FR-DEV-3a | [`core/dr-pipeline/ops/exposure.yaml:1`](../core/dr-pipeline/ops/exposure.yaml#L1), [`core/dr-pipeline/src/descriptor.rs:212`](../core/dr-pipeline/src/descriptor.rs#L212), [`core/dr-pipeline/src/descriptor.rs:252`](../core/dr-pipeline/src/descriptor.rs#L252), [`core/dr-pipeline/src/descriptor.rs:276`](../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/descriptor.rs:331`](../core/dr-pipeline/src/descriptor.rs#L331), [`core/dr-pipeline/src/framing.rs:395`](../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:25`](../core/dr-pipeline/src/graph.rs#L25), [`core/dr-pipeline/src/graph.rs:393`](../core/dr-pipeline/src/graph.rs#L393), [`core/dr-pipeline/src/graph.rs:47`](../core/dr-pipeline/src/graph.rs#L47), [`core/dr-pipeline/src/graph.rs:534`](../core/dr-pipeline/src/graph.rs#L534), [`core/dr-pipeline/src/graph.rs:60`](../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/mask.rs:1666`](../core/dr-pipeline/src/mask.rs#L1666), [`core/dr-pipeline/src/neutral.rs:1`](../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:372`](../core/dr-pipeline/src/neutral.rs#L372), [`core/dr-pipeline/src/operation.rs:232`](../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/src/operation.rs:365`](../core/dr-pipeline/src/operation.rs#L365), [`core/dr-pipeline/src/ops/curve.rs:319`](../core/dr-pipeline/src/ops/curve.rs#L319), [`ui/dr-ui/src/develop.rs:1306`](../ui/dr-ui/src/develop.rs#L1306), [`ui/dr-ui/src/develop.rs:1585`](../ui/dr-ui/src/develop.rs#L1585), [`ui/dr-ui/src/develop.rs:7353`](../ui/dr-ui/src/develop.rs#L7353), [`ui/dr-ui/src/develop.rs:7551`](../ui/dr-ui/src/develop.rs#L7551), [`ui/dr-ui/src/lib.rs:866`](../ui/dr-ui/src/lib.rs#L866), [`ui/dr-ui/tests/ui_names_no_operation.rs:1`](../ui/dr-ui/tests/ui_names_no_operation.rs#L1), [`ui/dr-ui/ui/app.slint:2440`](../ui/dr-ui/ui/app.slint#L2440) | -| FR-DEV-3b | [`core/dr-pipeline/src/descriptor.rs:276`](../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/framing.rs:395`](../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:60`](../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/operation.rs:365`](../core/dr-pipeline/src/operation.rs#L365), [`ui/dr-ui/ui/app.slint:2629`](../ui/dr-ui/ui/app.slint#L2629) | +| FR-DEV-3 | [`core/dr-gpu/src/adjust.rs:2217`](../core/dr-gpu/src/adjust.rs#L2217), [`core/dr-gpu/src/adjust.rs:651`](../core/dr-gpu/src/adjust.rs#L651), [`core/dr-gpu/src/adjust.rs:770`](../core/dr-gpu/src/adjust.rs#L770), [`core/dr-gpu/src/adjust.rs:84`](../core/dr-gpu/src/adjust.rs#L84), [`core/dr-gpu/tests/tone_curve.rs:1`](../core/dr-gpu/tests/tone_curve.rs#L1), [`core/dr-pipeline/src/coverage.rs:122`](../core/dr-pipeline/src/coverage.rs#L122), [`core/dr-pipeline/src/coverage.rs:1`](../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/detail.rs:434`](../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:524`](../core/dr-pipeline/src/detail.rs#L524), [`core/dr-pipeline/src/framing.rs:177`](../core/dr-pipeline/src/framing.rs#L177), [`core/dr-pipeline/src/framing.rs:234`](../core/dr-pipeline/src/framing.rs#L234), [`core/dr-pipeline/src/framing.rs:314`](../core/dr-pipeline/src/framing.rs#L314), [`core/dr-pipeline/src/framing.rs:498`](../core/dr-pipeline/src/framing.rs#L498), [`core/dr-pipeline/src/framing.rs:753`](../core/dr-pipeline/src/framing.rs#L753), [`core/dr-pipeline/src/graph.rs:1305`](../core/dr-pipeline/src/graph.rs#L1305), [`core/dr-pipeline/src/graph.rs:1336`](../core/dr-pipeline/src/graph.rs#L1336), [`core/dr-pipeline/src/graph.rs:1359`](../core/dr-pipeline/src/graph.rs#L1359), [`core/dr-pipeline/src/graph.rs:1397`](../core/dr-pipeline/src/graph.rs#L1397), [`core/dr-pipeline/src/graph.rs:1428`](../core/dr-pipeline/src/graph.rs#L1428), [`core/dr-pipeline/src/graph.rs:225`](../core/dr-pipeline/src/graph.rs#L225), [`core/dr-pipeline/src/graph.rs:306`](../core/dr-pipeline/src/graph.rs#L306), [`core/dr-pipeline/src/graph.rs:344`](../core/dr-pipeline/src/graph.rs#L344), [`core/dr-pipeline/src/graph.rs:350`](../core/dr-pipeline/src/graph.rs#L350), [`core/dr-pipeline/src/graph.rs:911`](../core/dr-pipeline/src/graph.rs#L911), [`core/dr-pipeline/src/lens.rs:93`](../core/dr-pipeline/src/lens.rs#L93), [`core/dr-pipeline/src/mask.rs:205`](../core/dr-pipeline/src/mask.rs#L205), [`core/dr-pipeline/src/neutral.rs:1`](../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:300`](../core/dr-pipeline/src/neutral.rs#L300), [`core/dr-pipeline/src/neutral.rs:316`](../core/dr-pipeline/src/neutral.rs#L316), [`core/dr-pipeline/src/neutral.rs:332`](../core/dr-pipeline/src/neutral.rs#L332), [`core/dr-pipeline/src/neutral.rs:354`](../core/dr-pipeline/src/neutral.rs#L354), [`core/dr-pipeline/src/neutral.rs:79`](../core/dr-pipeline/src/neutral.rs#L79), [`core/dr-pipeline/src/operation.rs:330`](../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:535`](../core/dr-pipeline/src/operation.rs#L535), [`core/dr-pipeline/src/ops/capture_sharpen.rs:1`](../core/dr-pipeline/src/ops/capture_sharpen.rs#L1), [`core/dr-pipeline/src/ops/capture_sharpen.rs:210`](../core/dr-pipeline/src/ops/capture_sharpen.rs#L210), [`core/dr-pipeline/src/ops/curve.rs:100`](../core/dr-pipeline/src/ops/curve.rs#L100), [`core/dr-pipeline/src/ops/curve.rs:1`](../core/dr-pipeline/src/ops/curve.rs#L1), [`core/dr-pipeline/src/ops/curve.rs:219`](../core/dr-pipeline/src/ops/curve.rs#L219), [`core/dr-pipeline/src/ops/curve.rs:635`](../core/dr-pipeline/src/ops/curve.rs#L635), [`core/dr-pipeline/src/ops/local_contrast.rs:1`](../core/dr-pipeline/src/ops/local_contrast.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:1`](../core/dr-pipeline/src/ops/noise_reduction.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:273`](../core/dr-pipeline/src/ops/noise_reduction.rs#L273), [`core/dr-pipeline/src/preset.rs:751`](../core/dr-pipeline/src/preset.rs#L751), [`core/dr-pipeline/src/sidecar.rs:1288`](../core/dr-pipeline/src/sidecar.rs#L1288), [`core/dr-pipeline/src/sidecar.rs:160`](../core/dr-pipeline/src/sidecar.rs#L160), [`core/dr-pipeline/src/sidecar.rs:2114`](../core/dr-pipeline/src/sidecar.rs#L2114), [`core/dr-pipeline/src/sidecar.rs:2174`](../core/dr-pipeline/src/sidecar.rs#L2174), [`core/dr-pipeline/tests/tone_curve.rs:1`](../core/dr-pipeline/tests/tone_curve.rs#L1), [`core/dr-segment/src/refine.rs:937`](../core/dr-segment/src/refine.rs#L937), [`ui/dr-ui/src/develop.rs:103`](../ui/dr-ui/src/develop.rs#L103), [`ui/dr-ui/src/develop.rs:1294`](../ui/dr-ui/src/develop.rs#L1294), [`ui/dr-ui/src/develop.rs:1383`](../ui/dr-ui/src/develop.rs#L1383), [`ui/dr-ui/src/develop.rs:1419`](../ui/dr-ui/src/develop.rs#L1419), [`ui/dr-ui/src/develop.rs:165`](../ui/dr-ui/src/develop.rs#L165), [`ui/dr-ui/src/develop.rs:1690`](../ui/dr-ui/src/develop.rs#L1690), [`ui/dr-ui/src/develop.rs:2131`](../ui/dr-ui/src/develop.rs#L2131), [`ui/dr-ui/src/develop.rs:2374`](../ui/dr-ui/src/develop.rs#L2374), [`ui/dr-ui/src/develop.rs:2392`](../ui/dr-ui/src/develop.rs#L2392), [`ui/dr-ui/src/develop.rs:2406`](../ui/dr-ui/src/develop.rs#L2406), [`ui/dr-ui/src/develop.rs:2428`](../ui/dr-ui/src/develop.rs#L2428), [`ui/dr-ui/src/develop.rs:2728`](../ui/dr-ui/src/develop.rs#L2728), [`ui/dr-ui/src/develop.rs:2826`](../ui/dr-ui/src/develop.rs#L2826), [`ui/dr-ui/src/develop.rs:328`](../ui/dr-ui/src/develop.rs#L328), [`ui/dr-ui/src/develop.rs:365`](../ui/dr-ui/src/develop.rs#L365), [`ui/dr-ui/src/develop.rs:4357`](../ui/dr-ui/src/develop.rs#L4357), [`ui/dr-ui/src/develop.rs:4513`](../ui/dr-ui/src/develop.rs#L4513), [`ui/dr-ui/src/develop.rs:4573`](../ui/dr-ui/src/develop.rs#L4573), [`ui/dr-ui/src/develop.rs:4978`](../ui/dr-ui/src/develop.rs#L4978), [`ui/dr-ui/src/develop.rs:5008`](../ui/dr-ui/src/develop.rs#L5008), [`ui/dr-ui/src/develop.rs:5074`](../ui/dr-ui/src/develop.rs#L5074), [`ui/dr-ui/src/develop.rs:5088`](../ui/dr-ui/src/develop.rs#L5088), [`ui/dr-ui/src/develop.rs:5290`](../ui/dr-ui/src/develop.rs#L5290), [`ui/dr-ui/src/develop.rs:5378`](../ui/dr-ui/src/develop.rs#L5378), [`ui/dr-ui/src/develop.rs:588`](../ui/dr-ui/src/develop.rs#L588), [`ui/dr-ui/src/develop.rs:6168`](../ui/dr-ui/src/develop.rs#L6168), [`ui/dr-ui/src/develop.rs:6241`](../ui/dr-ui/src/develop.rs#L6241), [`ui/dr-ui/src/develop.rs:6434`](../ui/dr-ui/src/develop.rs#L6434), [`ui/dr-ui/src/develop.rs:649`](../ui/dr-ui/src/develop.rs#L649), [`ui/dr-ui/src/develop.rs:6522`](../ui/dr-ui/src/develop.rs#L6522), [`ui/dr-ui/src/develop.rs:6678`](../ui/dr-ui/src/develop.rs#L6678), [`ui/dr-ui/src/develop.rs:6834`](../ui/dr-ui/src/develop.rs#L6834), [`ui/dr-ui/src/develop.rs:6878`](../ui/dr-ui/src/develop.rs#L6878), [`ui/dr-ui/src/develop.rs:6928`](../ui/dr-ui/src/develop.rs#L6928), [`ui/dr-ui/src/develop.rs:7353`](../ui/dr-ui/src/develop.rs#L7353), [`ui/dr-ui/src/develop.rs:8081`](../ui/dr-ui/src/develop.rs#L8081), [`ui/dr-ui/src/develop.rs:829`](../ui/dr-ui/src/develop.rs#L829), [`ui/dr-ui/src/develop.rs:922`](../ui/dr-ui/src/develop.rs#L922), [`ui/dr-ui/src/develop.rs:951`](../ui/dr-ui/src/develop.rs#L951), [`ui/dr-ui/src/labels.rs:32`](../ui/dr-ui/src/labels.rs#L32), [`ui/dr-ui/src/lib.rs:1841`](../ui/dr-ui/src/lib.rs#L1841), [`ui/dr-ui/src/lib.rs:2707`](../ui/dr-ui/src/lib.rs#L2707), [`ui/dr-ui/src/lib.rs:2914`](../ui/dr-ui/src/lib.rs#L2914), [`ui/dr-ui/src/lib.rs:2973`](../ui/dr-ui/src/lib.rs#L2973), [`ui/dr-ui/src/lib.rs:3178`](../ui/dr-ui/src/lib.rs#L3178), [`ui/dr-ui/src/lib.rs:3242`](../ui/dr-ui/src/lib.rs#L3242), [`ui/dr-ui/src/lib.rs:3296`](../ui/dr-ui/src/lib.rs#L3296), [`ui/dr-ui/src/lib.rs:412`](../ui/dr-ui/src/lib.rs#L412), [`ui/dr-ui/src/lib.rs:435`](../ui/dr-ui/src/lib.rs#L435), [`ui/dr-ui/src/lib.rs:541`](../ui/dr-ui/src/lib.rs#L541), [`ui/dr-ui/src/lib.rs:565`](../ui/dr-ui/src/lib.rs#L565), [`ui/dr-ui/src/library.rs:547`](../ui/dr-ui/src/library.rs#L547), [`ui/dr-ui/src/masks_ui.rs:1423`](../ui/dr-ui/src/masks_ui.rs#L1423), [`ui/dr-ui/src/masks_ui.rs:1537`](../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/masks_ui.rs:338`](../ui/dr-ui/src/masks_ui.rs#L338), [`ui/dr-ui/src/masks_ui.rs:44`](../ui/dr-ui/src/masks_ui.rs#L44), [`ui/dr-ui/src/presets.rs:409`](../ui/dr-ui/src/presets.rs#L409), [`ui/dr-ui/src/segmentation.rs:116`](../ui/dr-ui/src/segmentation.rs#L116), [`ui/dr-ui/src/segmentation.rs:352`](../ui/dr-ui/src/segmentation.rs#L352), [`ui/dr-ui/src/segmentation.rs:368`](../ui/dr-ui/src/segmentation.rs#L368), [`ui/dr-ui/src/segmentation.rs:498`](../ui/dr-ui/src/segmentation.rs#L498), [`ui/dr-ui/src/segmentation.rs:526`](../ui/dr-ui/src/segmentation.rs#L526), [`ui/dr-ui/ui/adjust.slint:1007`](../ui/dr-ui/ui/adjust.slint#L1007), [`ui/dr-ui/ui/adjust.slint:126`](../ui/dr-ui/ui/adjust.slint#L126), [`ui/dr-ui/ui/adjust.slint:1484`](../ui/dr-ui/ui/adjust.slint#L1484), [`ui/dr-ui/ui/adjust.slint:171`](../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/adjust.slint:46`](../ui/dr-ui/ui/adjust.slint#L46), [`ui/dr-ui/ui/adjust.slint:624`](../ui/dr-ui/ui/adjust.slint#L624), [`ui/dr-ui/ui/adjust.slint:650`](../ui/dr-ui/ui/adjust.slint#L650), [`ui/dr-ui/ui/adjust.slint:669`](../ui/dr-ui/ui/adjust.slint#L669), [`ui/dr-ui/ui/adjust.slint:790`](../ui/dr-ui/ui/adjust.slint#L790), [`ui/dr-ui/ui/adjust.slint:947`](../ui/dr-ui/ui/adjust.slint#L947), [`ui/dr-ui/ui/app.slint:138`](../ui/dr-ui/ui/app.slint#L138), [`ui/dr-ui/ui/app.slint:2205`](../ui/dr-ui/ui/app.slint#L2205), [`ui/dr-ui/ui/app.slint:2265`](../ui/dr-ui/ui/app.slint#L2265), [`ui/dr-ui/ui/develop.slint:223`](../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1167`](../ui/dr-ui/ui/masks.slint#L1167), [`ui/dr-ui/ui/masks.slint:713`](../ui/dr-ui/ui/masks.slint#L713), [`ui/dr-ui/ui/masks.slint:772`](../ui/dr-ui/ui/masks.slint#L772) | +| FR-DEV-3a | [`core/dr-pipeline/ops/exposure.yaml:1`](../core/dr-pipeline/ops/exposure.yaml#L1), [`core/dr-pipeline/src/descriptor.rs:212`](../core/dr-pipeline/src/descriptor.rs#L212), [`core/dr-pipeline/src/descriptor.rs:252`](../core/dr-pipeline/src/descriptor.rs#L252), [`core/dr-pipeline/src/descriptor.rs:276`](../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/descriptor.rs:331`](../core/dr-pipeline/src/descriptor.rs#L331), [`core/dr-pipeline/src/framing.rs:395`](../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:25`](../core/dr-pipeline/src/graph.rs#L25), [`core/dr-pipeline/src/graph.rs:393`](../core/dr-pipeline/src/graph.rs#L393), [`core/dr-pipeline/src/graph.rs:47`](../core/dr-pipeline/src/graph.rs#L47), [`core/dr-pipeline/src/graph.rs:534`](../core/dr-pipeline/src/graph.rs#L534), [`core/dr-pipeline/src/graph.rs:60`](../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/mask.rs:1666`](../core/dr-pipeline/src/mask.rs#L1666), [`core/dr-pipeline/src/neutral.rs:1`](../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:372`](../core/dr-pipeline/src/neutral.rs#L372), [`core/dr-pipeline/src/operation.rs:232`](../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/src/operation.rs:365`](../core/dr-pipeline/src/operation.rs#L365), [`core/dr-pipeline/src/ops/curve.rs:319`](../core/dr-pipeline/src/ops/curve.rs#L319), [`ui/dr-ui/src/develop.rs:1306`](../ui/dr-ui/src/develop.rs#L1306), [`ui/dr-ui/src/develop.rs:1585`](../ui/dr-ui/src/develop.rs#L1585), [`ui/dr-ui/src/develop.rs:7353`](../ui/dr-ui/src/develop.rs#L7353), [`ui/dr-ui/src/develop.rs:7551`](../ui/dr-ui/src/develop.rs#L7551), [`ui/dr-ui/src/lib.rs:866`](../ui/dr-ui/src/lib.rs#L866), [`ui/dr-ui/tests/ui_names_no_operation.rs:1`](../ui/dr-ui/tests/ui_names_no_operation.rs#L1), [`ui/dr-ui/ui/app.slint:2449`](../ui/dr-ui/ui/app.slint#L2449) | +| FR-DEV-3b | [`core/dr-pipeline/src/descriptor.rs:276`](../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/framing.rs:395`](../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:60`](../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/operation.rs:365`](../core/dr-pipeline/src/operation.rs#L365), [`ui/dr-ui/ui/app.slint:2638`](../ui/dr-ui/ui/app.slint#L2638) | | FR-DEV-3c | [`core/dr-pipeline/ops/exposure.yaml:1`](../core/dr-pipeline/ops/exposure.yaml#L1), [`core/dr-pipeline/src/graph.rs:393`](../core/dr-pipeline/src/graph.rs#L393), [`core/dr-pipeline/src/graph.rs:47`](../core/dr-pipeline/src/graph.rs#L47), [`core/dr-pipeline/src/mask.rs:1666`](../core/dr-pipeline/src/mask.rs#L1666), [`core/dr-pipeline/src/preset.rs:751`](../core/dr-pipeline/src/preset.rs#L751), [`ui/dr-ui/src/develop.rs:7602`](../ui/dr-ui/src/develop.rs#L7602) | | FR-DEV-3d | [`core/dr-gpu/src/adjust.rs:104`](../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1079`](../core/dr-gpu/src/adjust.rs#L1079), [`core/dr-gpu/src/adjust.rs:770`](../core/dr-gpu/src/adjust.rs#L770), [`core/dr-gpu/src/adjust.rs:84`](../core/dr-gpu/src/adjust.rs#L84), [`core/dr-gpu/src/adjust.rs:986`](../core/dr-gpu/src/adjust.rs#L986), [`core/dr-gpu/tests/capture_sharpen.rs:434`](../core/dr-gpu/tests/capture_sharpen.rs#L434), [`core/dr-gpu/tests/detail_stage.rs:242`](../core/dr-gpu/tests/detail_stage.rs#L242), [`core/dr-gpu/tests/local_contrast.rs:558`](../core/dr-gpu/tests/local_contrast.rs#L558), [`core/dr-gpu/tests/noise_reduction.rs:556`](../core/dr-gpu/tests/noise_reduction.rs#L556), [`core/dr-pipeline/src/framing.rs:314`](../core/dr-pipeline/src/framing.rs#L314), [`core/dr-pipeline/src/graph.rs:950`](../core/dr-pipeline/src/graph.rs#L950), [`core/dr-pipeline/src/operation.rs:32`](../core/dr-pipeline/src/operation.rs#L32), [`core/dr-pipeline/src/operation.rs:403`](../core/dr-pipeline/src/operation.rs#L403), [`core/dr-pipeline/src/operation.rs:53`](../core/dr-pipeline/src/operation.rs#L53), [`core/dr-pipeline/src/operation.rs:71`](../core/dr-pipeline/src/operation.rs#L71) | | FR-DEV-3e | [`core/dr-decode/src/base_curve.rs:145`](../core/dr-decode/src/base_curve.rs#L145), [`core/dr-decode/src/base_curve.rs:158`](../core/dr-decode/src/base_curve.rs#L158), [`core/dr-decode/src/base_curve.rs:1`](../core/dr-decode/src/base_curve.rs#L1), [`core/dr-decode/src/base_curve.rs:267`](../core/dr-decode/src/base_curve.rs#L267), [`core/dr-decode/src/base_curve.rs:347`](../core/dr-decode/src/base_curve.rs#L347), [`core/dr-decode/src/base_curve.rs:55`](../core/dr-decode/src/base_curve.rs#L55), [`core/dr-decode/src/lib.rs:121`](../core/dr-decode/src/lib.rs#L121), [`core/dr-decode/src/lib.rs:708`](../core/dr-decode/src/lib.rs#L708), [`core/dr-decode/src/lib.rs:748`](../core/dr-decode/src/lib.rs#L748), [`core/dr-decode/src/profile.rs:102`](../core/dr-decode/src/profile.rs#L102), [`core/dr-decode/src/profile.rs:151`](../core/dr-decode/src/profile.rs#L151), [`core/dr-decode/src/profile.rs:1`](../core/dr-decode/src/profile.rs#L1), [`core/dr-decode/src/profile.rs:235`](../core/dr-decode/src/profile.rs#L235), [`core/dr-decode/src/profile.rs:286`](../core/dr-decode/src/profile.rs#L286), [`core/dr-decode/src/profile.rs:343`](../core/dr-decode/src/profile.rs#L343), [`core/dr-decode/src/profile.rs:458`](../core/dr-decode/src/profile.rs#L458), [`core/dr-decode/src/profile.rs:492`](../core/dr-decode/src/profile.rs#L492), [`core/dr-decode/src/profile.rs:630`](../core/dr-decode/src/profile.rs#L630), [`core/dr-gpu/src/adjust.rs:37`](../core/dr-gpu/src/adjust.rs#L37), [`core/dr-gpu/src/adjust.rs:967`](../core/dr-gpu/src/adjust.rs#L967), [`core/dr-gpu/src/demosaic.rs:121`](../core/dr-gpu/src/demosaic.rs#L121), [`core/dr-gpu/src/demosaic.rs:86`](../core/dr-gpu/src/demosaic.rs#L86), [`core/dr-gpu/tests/base_curve.rs:1`](../core/dr-gpu/tests/base_curve.rs#L1), [`core/dr-pipeline/src/operation.rs:1837`](../core/dr-pipeline/src/operation.rs#L1837), [`core/dr-pipeline/src/operation.rs:1918`](../core/dr-pipeline/src/operation.rs#L1918), [`core/dr-pipeline/src/operation.rs:1943`](../core/dr-pipeline/src/operation.rs#L1943), [`core/dr-pipeline/src/operation.rs:1958`](../core/dr-pipeline/src/operation.rs#L1958), [`core/dr-pipeline/src/operation.rs:1982`](../core/dr-pipeline/src/operation.rs#L1982), [`core/dr-pipeline/src/operation.rs:310`](../core/dr-pipeline/src/operation.rs#L310), [`core/dr-pipeline/src/operation.rs:454`](../core/dr-pipeline/src/operation.rs#L454), [`core/dr-pipeline/src/operation.rs:464`](../core/dr-pipeline/src/operation.rs#L464), [`core/dr-pipeline/src/operation.rs:647`](../core/dr-pipeline/src/operation.rs#L647) | -| FR-DEV-3f | [`core/dr-film/src/bake.rs:271`](../core/dr-film/src/bake.rs#L271), [`core/dr-film/src/bake.rs:62`](../core/dr-film/src/bake.rs#L62), [`core/dr-film/src/boolean_grain.rs:1`](../core/dr-film/src/boolean_grain.rs#L1), [`core/dr-film/src/boolean_grain.rs:78`](../core/dr-film/src/boolean_grain.rs#L78), [`core/dr-film/src/grain.rs:140`](../core/dr-film/src/grain.rs#L140), [`core/dr-film/src/grain.rs:1`](../core/dr-film/src/grain.rs#L1), [`core/dr-film/src/grain.rs:302`](../core/dr-film/src/grain.rs#L302), [`core/dr-film/src/grain.rs:79`](../core/dr-film/src/grain.rs#L79), [`core/dr-film/src/lib.rs:160`](../core/dr-film/src/lib.rs#L160), [`core/dr-film/src/lib.rs:1`](../core/dr-film/src/lib.rs#L1), [`core/dr-film/src/profile.rs:100`](../core/dr-film/src/profile.rs#L100), [`core/dr-film/src/profile.rs:142`](../core/dr-film/src/profile.rs#L142), [`core/dr-film/src/profile.rs:182`](../core/dr-film/src/profile.rs#L182), [`core/dr-film/src/profile.rs:259`](../core/dr-film/src/profile.rs#L259), [`core/dr-film/src/profile.rs:502`](../core/dr-film/src/profile.rs#L502), [`core/dr-film/src/profile.rs:73`](../core/dr-film/src/profile.rs#L73), [`core/dr-gpu/src/adjust.rs:139`](../core/dr-gpu/src/adjust.rs#L139), [`core/dr-gpu/src/adjust.rs:196`](../core/dr-gpu/src/adjust.rs#L196), [`core/dr-gpu/src/adjust.rs:357`](../core/dr-gpu/src/adjust.rs#L357), [`core/dr-gpu/src/adjust.rs:483`](../core/dr-gpu/src/adjust.rs#L483), [`core/dr-gpu/src/adjust.rs:77`](../core/dr-gpu/src/adjust.rs#L77), [`core/dr-gpu/tests/film_sim.rs:191`](../core/dr-gpu/tests/film_sim.rs#L191), [`core/dr-gpu/tests/film_sim.rs:1`](../core/dr-gpu/tests/film_sim.rs#L1), [`core/dr-pipeline/src/graph.rs:103`](../core/dr-pipeline/src/graph.rs#L103), [`core/dr-pipeline/src/graph.rs:168`](../core/dr-pipeline/src/graph.rs#L168), [`core/dr-pipeline/src/graph.rs:566`](../core/dr-pipeline/src/graph.rs#L566), [`core/dr-pipeline/src/operation.rs:1165`](../core/dr-pipeline/src/operation.rs#L1165), [`core/dr-pipeline/src/operation.rs:1193`](../core/dr-pipeline/src/operation.rs#L1193), [`core/dr-pipeline/src/operation.rs:1239`](../core/dr-pipeline/src/operation.rs#L1239), [`core/dr-pipeline/src/operation.rs:1837`](../core/dr-pipeline/src/operation.rs#L1837), [`core/dr-pipeline/src/operation.rs:296`](../core/dr-pipeline/src/operation.rs#L296), [`core/dr-pipeline/src/operation.rs:310`](../core/dr-pipeline/src/operation.rs#L310), [`core/dr-pipeline/src/ops/film_sim.rs:102`](../core/dr-pipeline/src/ops/film_sim.rs#L102), [`core/dr-pipeline/src/ops/film_sim.rs:139`](../core/dr-pipeline/src/ops/film_sim.rs#L139), [`core/dr-pipeline/src/ops/film_sim.rs:163`](../core/dr-pipeline/src/ops/film_sim.rs#L163), [`core/dr-pipeline/src/ops/film_sim.rs:1`](../core/dr-pipeline/src/ops/film_sim.rs#L1), [`core/dr-pipeline/src/ops/film_sim.rs:341`](../core/dr-pipeline/src/ops/film_sim.rs#L341), [`core/dr-pipeline/src/ops/film_sim.rs:43`](../core/dr-pipeline/src/ops/film_sim.rs#L43), [`core/dr-pipeline/src/ops/film_sim.rs:97`](../core/dr-pipeline/src/ops/film_sim.rs#L97), [`core/dr-pipeline/src/sidecar.rs:115`](../core/dr-pipeline/src/sidecar.rs#L115), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`core/dr-pipeline/src/sidecar.rs:2460`](../core/dr-pipeline/src/sidecar.rs#L2460), [`core/dr-pipeline/src/sidecar.rs:2536`](../core/dr-pipeline/src/sidecar.rs#L2536), [`core/dr-pipeline/src/sidecar.rs:537`](../core/dr-pipeline/src/sidecar.rs#L537), [`core/dr-pipeline/src/sidecar.rs:781`](../core/dr-pipeline/src/sidecar.rs#L781), [`core/dr-pipeline/src/sidecar.rs:953`](../core/dr-pipeline/src/sidecar.rs#L953), [`core/dr-pipeline/src/state.rs:100`](../core/dr-pipeline/src/state.rs#L100), [`core/dr-pipeline/src/state.rs:115`](../core/dr-pipeline/src/state.rs#L115), [`core/dr-pipeline/src/state.rs:60`](../core/dr-pipeline/src/state.rs#L60), [`ui/dr-ui/src/develop.rs:1146`](../ui/dr-ui/src/develop.rs#L1146), [`ui/dr-ui/src/develop.rs:4725`](../ui/dr-ui/src/develop.rs#L4725), [`ui/dr-ui/src/develop.rs:4742`](../ui/dr-ui/src/develop.rs#L4742), [`ui/dr-ui/src/develop.rs:4754`](../ui/dr-ui/src/develop.rs#L4754), [`ui/dr-ui/src/develop.rs:4792`](../ui/dr-ui/src/develop.rs#L4792), [`ui/dr-ui/src/develop.rs:4801`](../ui/dr-ui/src/develop.rs#L4801), [`ui/dr-ui/src/develop.rs:4904`](../ui/dr-ui/src/develop.rs#L4904), [`ui/dr-ui/src/develop.rs:5415`](../ui/dr-ui/src/develop.rs#L5415), [`ui/dr-ui/src/develop.rs:5430`](../ui/dr-ui/src/develop.rs#L5430), [`ui/dr-ui/src/develop.rs:8093`](../ui/dr-ui/src/develop.rs#L8093), [`ui/dr-ui/src/lib.rs:2676`](../ui/dr-ui/src/lib.rs#L2676), [`ui/dr-ui/src/lib.rs:792`](../ui/dr-ui/src/lib.rs#L792), [`ui/dr-ui/src/lib.rs:857`](../ui/dr-ui/src/lib.rs#L857), [`ui/dr-ui/src/library.rs:538`](../ui/dr-ui/src/library.rs#L538), [`ui/dr-ui/src/library.rs:800`](../ui/dr-ui/src/library.rs#L800), [`ui/dr-ui/src/presets.rs:417`](../ui/dr-ui/src/presets.rs#L417), [`ui/dr-ui/ui/adjust.slint:1028`](../ui/dr-ui/ui/adjust.slint#L1028), [`ui/dr-ui/ui/adjust.slint:1038`](../ui/dr-ui/ui/adjust.slint#L1038), [`ui/dr-ui/ui/adjust.slint:1256`](../ui/dr-ui/ui/adjust.slint#L1256) | +| FR-DEV-3f | [`core/dr-film/src/bake.rs:271`](../core/dr-film/src/bake.rs#L271), [`core/dr-film/src/bake.rs:62`](../core/dr-film/src/bake.rs#L62), [`core/dr-film/src/boolean_grain.rs:1`](../core/dr-film/src/boolean_grain.rs#L1), [`core/dr-film/src/boolean_grain.rs:78`](../core/dr-film/src/boolean_grain.rs#L78), [`core/dr-film/src/grain.rs:140`](../core/dr-film/src/grain.rs#L140), [`core/dr-film/src/grain.rs:1`](../core/dr-film/src/grain.rs#L1), [`core/dr-film/src/grain.rs:302`](../core/dr-film/src/grain.rs#L302), [`core/dr-film/src/grain.rs:79`](../core/dr-film/src/grain.rs#L79), [`core/dr-film/src/lib.rs:160`](../core/dr-film/src/lib.rs#L160), [`core/dr-film/src/lib.rs:1`](../core/dr-film/src/lib.rs#L1), [`core/dr-film/src/profile.rs:100`](../core/dr-film/src/profile.rs#L100), [`core/dr-film/src/profile.rs:142`](../core/dr-film/src/profile.rs#L142), [`core/dr-film/src/profile.rs:182`](../core/dr-film/src/profile.rs#L182), [`core/dr-film/src/profile.rs:259`](../core/dr-film/src/profile.rs#L259), [`core/dr-film/src/profile.rs:502`](../core/dr-film/src/profile.rs#L502), [`core/dr-film/src/profile.rs:73`](../core/dr-film/src/profile.rs#L73), [`core/dr-gpu/src/adjust.rs:139`](../core/dr-gpu/src/adjust.rs#L139), [`core/dr-gpu/src/adjust.rs:196`](../core/dr-gpu/src/adjust.rs#L196), [`core/dr-gpu/src/adjust.rs:357`](../core/dr-gpu/src/adjust.rs#L357), [`core/dr-gpu/src/adjust.rs:483`](../core/dr-gpu/src/adjust.rs#L483), [`core/dr-gpu/src/adjust.rs:77`](../core/dr-gpu/src/adjust.rs#L77), [`core/dr-gpu/tests/film_sim.rs:191`](../core/dr-gpu/tests/film_sim.rs#L191), [`core/dr-gpu/tests/film_sim.rs:1`](../core/dr-gpu/tests/film_sim.rs#L1), [`core/dr-pipeline/src/graph.rs:103`](../core/dr-pipeline/src/graph.rs#L103), [`core/dr-pipeline/src/graph.rs:168`](../core/dr-pipeline/src/graph.rs#L168), [`core/dr-pipeline/src/graph.rs:566`](../core/dr-pipeline/src/graph.rs#L566), [`core/dr-pipeline/src/operation.rs:1165`](../core/dr-pipeline/src/operation.rs#L1165), [`core/dr-pipeline/src/operation.rs:1193`](../core/dr-pipeline/src/operation.rs#L1193), [`core/dr-pipeline/src/operation.rs:1239`](../core/dr-pipeline/src/operation.rs#L1239), [`core/dr-pipeline/src/operation.rs:1837`](../core/dr-pipeline/src/operation.rs#L1837), [`core/dr-pipeline/src/operation.rs:296`](../core/dr-pipeline/src/operation.rs#L296), [`core/dr-pipeline/src/operation.rs:310`](../core/dr-pipeline/src/operation.rs#L310), [`core/dr-pipeline/src/ops/film_sim.rs:102`](../core/dr-pipeline/src/ops/film_sim.rs#L102), [`core/dr-pipeline/src/ops/film_sim.rs:139`](../core/dr-pipeline/src/ops/film_sim.rs#L139), [`core/dr-pipeline/src/ops/film_sim.rs:163`](../core/dr-pipeline/src/ops/film_sim.rs#L163), [`core/dr-pipeline/src/ops/film_sim.rs:1`](../core/dr-pipeline/src/ops/film_sim.rs#L1), [`core/dr-pipeline/src/ops/film_sim.rs:341`](../core/dr-pipeline/src/ops/film_sim.rs#L341), [`core/dr-pipeline/src/ops/film_sim.rs:43`](../core/dr-pipeline/src/ops/film_sim.rs#L43), [`core/dr-pipeline/src/ops/film_sim.rs:97`](../core/dr-pipeline/src/ops/film_sim.rs#L97), [`core/dr-pipeline/src/sidecar.rs:115`](../core/dr-pipeline/src/sidecar.rs#L115), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`core/dr-pipeline/src/sidecar.rs:2460`](../core/dr-pipeline/src/sidecar.rs#L2460), [`core/dr-pipeline/src/sidecar.rs:2536`](../core/dr-pipeline/src/sidecar.rs#L2536), [`core/dr-pipeline/src/sidecar.rs:537`](../core/dr-pipeline/src/sidecar.rs#L537), [`core/dr-pipeline/src/sidecar.rs:781`](../core/dr-pipeline/src/sidecar.rs#L781), [`core/dr-pipeline/src/sidecar.rs:953`](../core/dr-pipeline/src/sidecar.rs#L953), [`core/dr-pipeline/src/state.rs:100`](../core/dr-pipeline/src/state.rs#L100), [`core/dr-pipeline/src/state.rs:115`](../core/dr-pipeline/src/state.rs#L115), [`core/dr-pipeline/src/state.rs:60`](../core/dr-pipeline/src/state.rs#L60), [`ui/dr-ui/src/develop.rs:1146`](../ui/dr-ui/src/develop.rs#L1146), [`ui/dr-ui/src/develop.rs:4725`](../ui/dr-ui/src/develop.rs#L4725), [`ui/dr-ui/src/develop.rs:4742`](../ui/dr-ui/src/develop.rs#L4742), [`ui/dr-ui/src/develop.rs:4754`](../ui/dr-ui/src/develop.rs#L4754), [`ui/dr-ui/src/develop.rs:4792`](../ui/dr-ui/src/develop.rs#L4792), [`ui/dr-ui/src/develop.rs:4801`](../ui/dr-ui/src/develop.rs#L4801), [`ui/dr-ui/src/develop.rs:4904`](../ui/dr-ui/src/develop.rs#L4904), [`ui/dr-ui/src/develop.rs:5415`](../ui/dr-ui/src/develop.rs#L5415), [`ui/dr-ui/src/develop.rs:5430`](../ui/dr-ui/src/develop.rs#L5430), [`ui/dr-ui/src/develop.rs:8093`](../ui/dr-ui/src/develop.rs#L8093), [`ui/dr-ui/src/lib.rs:2679`](../ui/dr-ui/src/lib.rs#L2679), [`ui/dr-ui/src/lib.rs:792`](../ui/dr-ui/src/lib.rs#L792), [`ui/dr-ui/src/lib.rs:857`](../ui/dr-ui/src/lib.rs#L857), [`ui/dr-ui/src/library.rs:538`](../ui/dr-ui/src/library.rs#L538), [`ui/dr-ui/src/library.rs:800`](../ui/dr-ui/src/library.rs#L800), [`ui/dr-ui/src/presets.rs:417`](../ui/dr-ui/src/presets.rs#L417), [`ui/dr-ui/ui/adjust.slint:1028`](../ui/dr-ui/ui/adjust.slint#L1028), [`ui/dr-ui/ui/adjust.slint:1038`](../ui/dr-ui/ui/adjust.slint#L1038), [`ui/dr-ui/ui/adjust.slint:1256`](../ui/dr-ui/ui/adjust.slint#L1256) | | FR-DEV-3h | [`core/dr-decode/src/lib.rs:404`](../core/dr-decode/src/lib.rs#L404), [`core/dr-decode/src/preview.rs:29`](../core/dr-decode/src/preview.rs#L29), [`core/dr-pipeline/src/framing.rs:1067`](../core/dr-pipeline/src/framing.rs#L1067), [`core/dr-pipeline/src/framing.rs:328`](../core/dr-pipeline/src/framing.rs#L328), [`core/dr-pipeline/src/framing.rs:498`](../core/dr-pipeline/src/framing.rs#L498), [`core/dr-types/src/lib.rs:339`](../core/dr-types/src/lib.rs#L339), [`core/dr-types/src/lib.rs:447`](../core/dr-types/src/lib.rs#L447), [`core/dr-types/src/lib.rs:459`](../core/dr-types/src/lib.rs#L459), [`core/dr-types/src/lib.rs:475`](../core/dr-types/src/lib.rs#L475), [`ui/dr-ui/src/develop.rs:140`](../ui/dr-ui/src/develop.rs#L140), [`ui/dr-ui/src/develop.rs:2745`](../ui/dr-ui/src/develop.rs#L2745), [`ui/dr-ui/src/segmentation.rs:498`](../ui/dr-ui/src/segmentation.rs#L498) | | FR-DEV-4 | [`core/dr-gpu/src/adjust.rs:770`](../core/dr-gpu/src/adjust.rs#L770), [`core/dr-gpu/src/lib.rs:351`](../core/dr-gpu/src/lib.rs#L351), [`ui/dr-ui/ui/crop.slint:1`](../ui/dr-ui/ui/crop.slint#L1) | -| FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1397`](../core/dr-pipeline/src/graph.rs#L1397), [`core/dr-pipeline/src/graph.rs:587`](../core/dr-pipeline/src/graph.rs#L587), [`core/dr-pipeline/src/graph.rs:640`](../core/dr-pipeline/src/graph.rs#L640), [`core/dr-pipeline/src/history.rs:102`](../core/dr-pipeline/src/history.rs#L102), [`core/dr-pipeline/src/history.rs:110`](../core/dr-pipeline/src/history.rs#L110), [`core/dr-pipeline/src/history.rs:127`](../core/dr-pipeline/src/history.rs#L127), [`core/dr-pipeline/src/history.rs:184`](../core/dr-pipeline/src/history.rs#L184), [`core/dr-pipeline/src/history.rs:1`](../core/dr-pipeline/src/history.rs#L1), [`core/dr-pipeline/src/history.rs:214`](../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:234`](../core/dr-pipeline/src/history.rs#L234), [`core/dr-pipeline/src/history.rs:293`](../core/dr-pipeline/src/history.rs#L293), [`core/dr-pipeline/src/history.rs:479`](../core/dr-pipeline/src/history.rs#L479), [`core/dr-pipeline/src/history.rs:489`](../core/dr-pipeline/src/history.rs#L489), [`core/dr-pipeline/src/history.rs:499`](../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../core/dr-pipeline/src/history.rs#L526), [`core/dr-pipeline/src/history.rs:86`](../core/dr-pipeline/src/history.rs#L86), [`core/dr-pipeline/src/state.rs:1`](../core/dr-pipeline/src/state.rs#L1), [`core/dr-pipeline/src/state.rs:75`](../core/dr-pipeline/src/state.rs#L75), [`ui/dr-ui/src/develop.rs:4357`](../ui/dr-ui/src/develop.rs#L4357), [`ui/dr-ui/src/develop.rs:4754`](../ui/dr-ui/src/develop.rs#L4754), [`ui/dr-ui/src/develop.rs:5430`](../ui/dr-ui/src/develop.rs#L5430), [`ui/dr-ui/src/develop.rs:5460`](../ui/dr-ui/src/develop.rs#L5460), [`ui/dr-ui/src/develop.rs:5473`](../ui/dr-ui/src/develop.rs#L5473), [`ui/dr-ui/src/develop.rs:5485`](../ui/dr-ui/src/develop.rs#L5485), [`ui/dr-ui/src/develop.rs:5501`](../ui/dr-ui/src/develop.rs#L5501), [`ui/dr-ui/src/develop.rs:5533`](../ui/dr-ui/src/develop.rs#L5533), [`ui/dr-ui/src/develop.rs:5537`](../ui/dr-ui/src/develop.rs#L5537), [`ui/dr-ui/src/develop.rs:5556`](../ui/dr-ui/src/develop.rs#L5556), [`ui/dr-ui/src/develop.rs:5572`](../ui/dr-ui/src/develop.rs#L5572), [`ui/dr-ui/src/develop.rs:6414`](../ui/dr-ui/src/develop.rs#L6414), [`ui/dr-ui/src/develop.rs:6434`](../ui/dr-ui/src/develop.rs#L6434), [`ui/dr-ui/src/develop.rs:6465`](../ui/dr-ui/src/develop.rs#L6465), [`ui/dr-ui/src/develop.rs:772`](../ui/dr-ui/src/develop.rs#L772), [`ui/dr-ui/src/labels.rs:12`](../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:272`](../ui/dr-ui/src/labels.rs#L272), [`ui/dr-ui/src/lib.rs:1754`](../ui/dr-ui/src/lib.rs#L1754), [`ui/dr-ui/src/lib.rs:1816`](../ui/dr-ui/src/lib.rs#L1816), [`ui/dr-ui/src/lib.rs:1825`](../ui/dr-ui/src/lib.rs#L1825), [`ui/dr-ui/src/lib.rs:2944`](../ui/dr-ui/src/lib.rs#L2944), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:92`](../ui/dr-ui/ui/history.slint#L92) | -| FR-DEV-6 | [`core/dr-pipeline/src/preset.rs:1`](../core/dr-pipeline/src/preset.rs#L1), [`core/dr-pipeline/src/preset.rs:390`](../core/dr-pipeline/src/preset.rs#L390), [`core/dr-pipeline/src/preset.rs:423`](../core/dr-pipeline/src/preset.rs#L423), [`core/dr-pipeline/src/starter.rs:1`](../core/dr-pipeline/src/starter.rs#L1), [`core/dr-preset-xmp/src/lib.rs:1`](../core/dr-preset-xmp/src/lib.rs#L1), [`core/dr-types/src/settings.rs:272`](../core/dr-types/src/settings.rs#L272), [`ui/dr-ui/src/develop.rs:5372`](../ui/dr-ui/src/develop.rs#L5372), [`ui/dr-ui/src/develop.rs:5393`](../ui/dr-ui/src/develop.rs#L5393), [`ui/dr-ui/src/lib.rs:1721`](../ui/dr-ui/src/lib.rs#L1721), [`ui/dr-ui/src/lib.rs:2477`](../ui/dr-ui/src/lib.rs#L2477), [`ui/dr-ui/src/lib.rs:2506`](../ui/dr-ui/src/lib.rs#L2506), [`ui/dr-ui/src/library.rs:2219`](../ui/dr-ui/src/library.rs#L2219), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500), [`ui/dr-ui/src/library.rs:528`](../ui/dr-ui/src/library.rs#L528), [`ui/dr-ui/src/library_ui.rs:3194`](../ui/dr-ui/src/library_ui.rs#L3194), [`ui/dr-ui/src/library_ui.rs:3594`](../ui/dr-ui/src/library_ui.rs#L3594), [`ui/dr-ui/src/library_ui.rs:548`](../ui/dr-ui/src/library_ui.rs#L548), [`ui/dr-ui/src/preset_store.rs:1`](../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/presets.rs:1`](../ui/dr-ui/src/presets.rs#L1), [`ui/dr-ui/src/presets.rs:680`](../ui/dr-ui/src/presets.rs#L680), [`ui/dr-ui/src/presets.rs:714`](../ui/dr-ui/src/presets.rs#L714), [`ui/dr-ui/ui/adjust.slint:853`](../ui/dr-ui/ui/adjust.slint#L853), [`ui/dr-ui/ui/adjust.slint:878`](../ui/dr-ui/ui/adjust.slint#L878), [`ui/dr-ui/ui/adjust.slint:889`](../ui/dr-ui/ui/adjust.slint#L889), [`ui/dr-ui/ui/adjust.slint:932`](../ui/dr-ui/ui/adjust.slint#L932), [`ui/dr-ui/ui/app.slint:1581`](../ui/dr-ui/ui/app.slint#L1581), [`ui/dr-ui/ui/app.slint:2409`](../ui/dr-ui/ui/app.slint#L2409), [`ui/dr-ui/ui/app.slint:3022`](../ui/dr-ui/ui/app.slint#L3022), [`ui/dr-ui/ui/app.slint:747`](../ui/dr-ui/ui/app.slint#L747), [`ui/dr-ui/ui/app.slint:758`](../ui/dr-ui/ui/app.slint#L758), [`ui/dr-ui/ui/library.slint:1574`](../ui/dr-ui/ui/library.slint#L1574), [`ui/dr-ui/ui/library.slint:1580`](../ui/dr-ui/ui/library.slint#L1580), [`ui/dr-ui/ui/library.slint:4217`](../ui/dr-ui/ui/library.slint#L4217), [`ui/dr-ui/ui/library.slint:4232`](../ui/dr-ui/ui/library.slint#L4232), [`ui/dr-ui/ui/presets.slint:105`](../ui/dr-ui/ui/presets.slint#L105), [`ui/dr-ui/ui/presets.slint:113`](../ui/dr-ui/ui/presets.slint#L113), [`ui/dr-ui/ui/presets.slint:19`](../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/presets.slint:276`](../ui/dr-ui/ui/presets.slint#L276), [`ui/dr-ui/ui/presets.slint:297`](../ui/dr-ui/ui/presets.slint#L297), [`ui/dr-ui/ui/presets.slint:5`](../ui/dr-ui/ui/presets.slint#L5), [`ui/dr-ui/ui/presets.slint:60`](../ui/dr-ui/ui/presets.slint#L60), [`ui/dr-ui/ui/settings.slint:101`](../ui/dr-ui/ui/settings.slint#L101), [`ui/dr-ui/ui/settings.slint:595`](../ui/dr-ui/ui/settings.slint#L595) | -| FR-DEV-7 | [`core/dr-pipeline/src/history.rs:214`](../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:499`](../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../core/dr-pipeline/src/history.rs#L526), [`ui/dr-ui/src/develop.rs:4291`](../ui/dr-ui/src/develop.rs#L4291), [`ui/dr-ui/src/develop.rs:4332`](../ui/dr-ui/src/develop.rs#L4332), [`ui/dr-ui/src/develop.rs:5501`](../ui/dr-ui/src/develop.rs#L5501), [`ui/dr-ui/src/develop.rs:5533`](../ui/dr-ui/src/develop.rs#L5533), [`ui/dr-ui/src/develop.rs:6465`](../ui/dr-ui/src/develop.rs#L6465), [`ui/dr-ui/src/lib.rs:1825`](../ui/dr-ui/src/lib.rs#L1825), [`ui/dr-ui/src/lib.rs:1887`](../ui/dr-ui/src/lib.rs#L1887), [`ui/dr-ui/src/lib.rs:2883`](../ui/dr-ui/src/lib.rs#L2883), [`ui/dr-ui/src/lib.rs:2944`](../ui/dr-ui/src/lib.rs#L2944), [`ui/dr-ui/src/lib.rs:404`](../ui/dr-ui/src/lib.rs#L404), [`ui/dr-ui/ui/app.slint:120`](../ui/dr-ui/ui/app.slint#L120), [`ui/dr-ui/ui/app.slint:2316`](../ui/dr-ui/ui/app.slint#L2316), [`ui/dr-ui/ui/app.slint:2331`](../ui/dr-ui/ui/app.slint#L2331), [`ui/dr-ui/ui/app.slint:2629`](../ui/dr-ui/ui/app.slint#L2629), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/widgets.slint:71`](../ui/dr-ui/ui/widgets.slint#L71) | -| FR-DEV-8 | [`core/dr-gpu/src/detail.rs:405`](../core/dr-gpu/src/detail.rs#L405), [`core/dr-gpu/src/detail.rs:623`](../core/dr-gpu/src/detail.rs#L623), [`core/dr-gpu/tests/detail_instances.rs:1`](../core/dr-gpu/tests/detail_instances.rs#L1), [`core/dr-gpu/tests/spot_removal.rs:1`](../core/dr-gpu/tests/spot_removal.rs#L1), [`core/dr-pipeline/src/detail.rs:410`](../core/dr-pipeline/src/detail.rs#L410), [`core/dr-pipeline/src/detail.rs:434`](../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:469`](../core/dr-pipeline/src/detail.rs#L469), [`core/dr-pipeline/src/detail.rs:555`](../core/dr-pipeline/src/detail.rs#L555), [`core/dr-pipeline/src/graph.rs:1049`](../core/dr-pipeline/src/graph.rs#L1049), [`core/dr-pipeline/src/graph.rs:115`](../core/dr-pipeline/src/graph.rs#L115), [`core/dr-pipeline/src/graph.rs:247`](../core/dr-pipeline/src/graph.rs#L247), [`core/dr-pipeline/src/operation.rs:330`](../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:601`](../core/dr-pipeline/src/operation.rs#L601), [`core/dr-pipeline/src/sidecar.rs:1023`](../core/dr-pipeline/src/sidecar.rs#L1023), [`core/dr-pipeline/src/sidecar.rs:1053`](../core/dr-pipeline/src/sidecar.rs#L1053), [`core/dr-pipeline/src/sidecar.rs:187`](../core/dr-pipeline/src/sidecar.rs#L187), [`core/dr-pipeline/src/sidecar.rs:356`](../core/dr-pipeline/src/sidecar.rs#L356), [`core/dr-pipeline/src/sidecar.rs:793`](../core/dr-pipeline/src/sidecar.rs#L793), [`core/dr-pipeline/src/sidecar.rs:969`](../core/dr-pipeline/src/sidecar.rs#L969), [`core/dr-pipeline/src/spot.rs:115`](../core/dr-pipeline/src/spot.rs#L115), [`core/dr-pipeline/src/spot.rs:151`](../core/dr-pipeline/src/spot.rs#L151), [`core/dr-pipeline/src/spot.rs:1`](../core/dr-pipeline/src/spot.rs#L1), [`core/dr-pipeline/src/spot.rs:207`](../core/dr-pipeline/src/spot.rs#L207), [`core/dr-pipeline/src/spot.rs:387`](../core/dr-pipeline/src/spot.rs#L387), [`core/dr-pipeline/src/spot.rs:472`](../core/dr-pipeline/src/spot.rs#L472), [`core/dr-pipeline/src/spot.rs:582`](../core/dr-pipeline/src/spot.rs#L582), [`core/dr-pipeline/src/spot.rs:673`](../core/dr-pipeline/src/spot.rs#L673), [`core/dr-pipeline/src/state.rs:103`](../core/dr-pipeline/src/state.rs#L103), [`core/dr-pipeline/tests/spot_sidecar.rs:1`](../core/dr-pipeline/tests/spot_sidecar.rs#L1), [`core/dr-pipeline/tests/spots.rs:1`](../core/dr-pipeline/tests/spots.rs#L1), [`ui/dr-ui/src/develop.rs:3157`](../ui/dr-ui/src/develop.rs#L3157), [`ui/dr-ui/src/develop.rs:3195`](../ui/dr-ui/src/develop.rs#L3195), [`ui/dr-ui/src/develop.rs:3260`](../ui/dr-ui/src/develop.rs#L3260), [`ui/dr-ui/src/develop.rs:3343`](../ui/dr-ui/src/develop.rs#L3343), [`ui/dr-ui/src/develop.rs:3357`](../ui/dr-ui/src/develop.rs#L3357), [`ui/dr-ui/src/develop.rs:883`](../ui/dr-ui/src/develop.rs#L883), [`ui/dr-ui/src/labels.rs:76`](../ui/dr-ui/src/labels.rs#L76), [`ui/dr-ui/src/lib.rs:1845`](../ui/dr-ui/src/lib.rs#L1845), [`ui/dr-ui/src/lib.rs:3095`](../ui/dr-ui/src/lib.rs#L3095), [`ui/dr-ui/src/lib.rs:440`](../ui/dr-ui/src/lib.rs#L440), [`ui/dr-ui/src/spots_ui.rs:19`](../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/src/spots_ui.rs:1`](../ui/dr-ui/src/spots_ui.rs#L1), [`ui/dr-ui/src/spots_ui.rs:265`](../ui/dr-ui/src/spots_ui.rs#L265), [`ui/dr-ui/ui/app.slint:2172`](../ui/dr-ui/ui/app.slint#L2172), [`ui/dr-ui/ui/app.slint:2374`](../ui/dr-ui/ui/app.slint#L2374), [`ui/dr-ui/ui/app.slint:2928`](../ui/dr-ui/ui/app.slint#L2928), [`ui/dr-ui/ui/icons.slint:366`](../ui/dr-ui/ui/icons.slint#L366), [`ui/dr-ui/ui/session.slint:102`](../ui/dr-ui/ui/session.slint#L102), [`ui/dr-ui/ui/session.slint:52`](../ui/dr-ui/ui/session.slint#L52), [`ui/dr-ui/ui/spots.slint:191`](../ui/dr-ui/ui/spots.slint#L191), [`ui/dr-ui/ui/spots.slint:49`](../ui/dr-ui/ui/spots.slint#L49), [`ui/dr-ui/ui/spots.slint:6`](../ui/dr-ui/ui/spots.slint#L6), [`ui/dr-ui/ui/spots.slint:91`](../ui/dr-ui/ui/spots.slint#L91) | +| FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1397`](../core/dr-pipeline/src/graph.rs#L1397), [`core/dr-pipeline/src/graph.rs:587`](../core/dr-pipeline/src/graph.rs#L587), [`core/dr-pipeline/src/graph.rs:640`](../core/dr-pipeline/src/graph.rs#L640), [`core/dr-pipeline/src/history.rs:102`](../core/dr-pipeline/src/history.rs#L102), [`core/dr-pipeline/src/history.rs:110`](../core/dr-pipeline/src/history.rs#L110), [`core/dr-pipeline/src/history.rs:127`](../core/dr-pipeline/src/history.rs#L127), [`core/dr-pipeline/src/history.rs:184`](../core/dr-pipeline/src/history.rs#L184), [`core/dr-pipeline/src/history.rs:1`](../core/dr-pipeline/src/history.rs#L1), [`core/dr-pipeline/src/history.rs:214`](../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:234`](../core/dr-pipeline/src/history.rs#L234), [`core/dr-pipeline/src/history.rs:293`](../core/dr-pipeline/src/history.rs#L293), [`core/dr-pipeline/src/history.rs:479`](../core/dr-pipeline/src/history.rs#L479), [`core/dr-pipeline/src/history.rs:489`](../core/dr-pipeline/src/history.rs#L489), [`core/dr-pipeline/src/history.rs:499`](../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../core/dr-pipeline/src/history.rs#L526), [`core/dr-pipeline/src/history.rs:86`](../core/dr-pipeline/src/history.rs#L86), [`core/dr-pipeline/src/state.rs:1`](../core/dr-pipeline/src/state.rs#L1), [`core/dr-pipeline/src/state.rs:75`](../core/dr-pipeline/src/state.rs#L75), [`ui/dr-ui/src/develop.rs:4357`](../ui/dr-ui/src/develop.rs#L4357), [`ui/dr-ui/src/develop.rs:4754`](../ui/dr-ui/src/develop.rs#L4754), [`ui/dr-ui/src/develop.rs:5430`](../ui/dr-ui/src/develop.rs#L5430), [`ui/dr-ui/src/develop.rs:5460`](../ui/dr-ui/src/develop.rs#L5460), [`ui/dr-ui/src/develop.rs:5473`](../ui/dr-ui/src/develop.rs#L5473), [`ui/dr-ui/src/develop.rs:5485`](../ui/dr-ui/src/develop.rs#L5485), [`ui/dr-ui/src/develop.rs:5501`](../ui/dr-ui/src/develop.rs#L5501), [`ui/dr-ui/src/develop.rs:5533`](../ui/dr-ui/src/develop.rs#L5533), [`ui/dr-ui/src/develop.rs:5537`](../ui/dr-ui/src/develop.rs#L5537), [`ui/dr-ui/src/develop.rs:5556`](../ui/dr-ui/src/develop.rs#L5556), [`ui/dr-ui/src/develop.rs:5572`](../ui/dr-ui/src/develop.rs#L5572), [`ui/dr-ui/src/develop.rs:6414`](../ui/dr-ui/src/develop.rs#L6414), [`ui/dr-ui/src/develop.rs:6434`](../ui/dr-ui/src/develop.rs#L6434), [`ui/dr-ui/src/develop.rs:6465`](../ui/dr-ui/src/develop.rs#L6465), [`ui/dr-ui/src/develop.rs:772`](../ui/dr-ui/src/develop.rs#L772), [`ui/dr-ui/src/labels.rs:12`](../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:272`](../ui/dr-ui/src/labels.rs#L272), [`ui/dr-ui/src/lib.rs:1757`](../ui/dr-ui/src/lib.rs#L1757), [`ui/dr-ui/src/lib.rs:1819`](../ui/dr-ui/src/lib.rs#L1819), [`ui/dr-ui/src/lib.rs:1828`](../ui/dr-ui/src/lib.rs#L1828), [`ui/dr-ui/src/lib.rs:2947`](../ui/dr-ui/src/lib.rs#L2947), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:92`](../ui/dr-ui/ui/history.slint#L92) | +| FR-DEV-6 | [`core/dr-pipeline/src/preset.rs:1`](../core/dr-pipeline/src/preset.rs#L1), [`core/dr-pipeline/src/preset.rs:390`](../core/dr-pipeline/src/preset.rs#L390), [`core/dr-pipeline/src/preset.rs:423`](../core/dr-pipeline/src/preset.rs#L423), [`core/dr-pipeline/src/starter.rs:1`](../core/dr-pipeline/src/starter.rs#L1), [`core/dr-preset-xmp/src/lib.rs:1`](../core/dr-preset-xmp/src/lib.rs#L1), [`core/dr-types/src/settings.rs:363`](../core/dr-types/src/settings.rs#L363), [`ui/dr-ui/src/develop.rs:5372`](../ui/dr-ui/src/develop.rs#L5372), [`ui/dr-ui/src/develop.rs:5393`](../ui/dr-ui/src/develop.rs#L5393), [`ui/dr-ui/src/lib.rs:1724`](../ui/dr-ui/src/lib.rs#L1724), [`ui/dr-ui/src/lib.rs:2480`](../ui/dr-ui/src/lib.rs#L2480), [`ui/dr-ui/src/lib.rs:2509`](../ui/dr-ui/src/lib.rs#L2509), [`ui/dr-ui/src/library.rs:2219`](../ui/dr-ui/src/library.rs#L2219), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500), [`ui/dr-ui/src/library.rs:528`](../ui/dr-ui/src/library.rs#L528), [`ui/dr-ui/src/library_ui.rs:3216`](../ui/dr-ui/src/library_ui.rs#L3216), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:570`](../ui/dr-ui/src/library_ui.rs#L570), [`ui/dr-ui/src/preset_store.rs:1`](../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/presets.rs:1`](../ui/dr-ui/src/presets.rs#L1), [`ui/dr-ui/src/presets.rs:680`](../ui/dr-ui/src/presets.rs#L680), [`ui/dr-ui/src/presets.rs:714`](../ui/dr-ui/src/presets.rs#L714), [`ui/dr-ui/ui/adjust.slint:853`](../ui/dr-ui/ui/adjust.slint#L853), [`ui/dr-ui/ui/adjust.slint:878`](../ui/dr-ui/ui/adjust.slint#L878), [`ui/dr-ui/ui/adjust.slint:889`](../ui/dr-ui/ui/adjust.slint#L889), [`ui/dr-ui/ui/adjust.slint:932`](../ui/dr-ui/ui/adjust.slint#L932), [`ui/dr-ui/ui/app.slint:1590`](../ui/dr-ui/ui/app.slint#L1590), [`ui/dr-ui/ui/app.slint:2418`](../ui/dr-ui/ui/app.slint#L2418), [`ui/dr-ui/ui/app.slint:3031`](../ui/dr-ui/ui/app.slint#L3031), [`ui/dr-ui/ui/app.slint:747`](../ui/dr-ui/ui/app.slint#L747), [`ui/dr-ui/ui/app.slint:758`](../ui/dr-ui/ui/app.slint#L758), [`ui/dr-ui/ui/library.slint:1574`](../ui/dr-ui/ui/library.slint#L1574), [`ui/dr-ui/ui/library.slint:1580`](../ui/dr-ui/ui/library.slint#L1580), [`ui/dr-ui/ui/library.slint:4217`](../ui/dr-ui/ui/library.slint#L4217), [`ui/dr-ui/ui/library.slint:4232`](../ui/dr-ui/ui/library.slint#L4232), [`ui/dr-ui/ui/presets.slint:105`](../ui/dr-ui/ui/presets.slint#L105), [`ui/dr-ui/ui/presets.slint:113`](../ui/dr-ui/ui/presets.slint#L113), [`ui/dr-ui/ui/presets.slint:19`](../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/presets.slint:276`](../ui/dr-ui/ui/presets.slint#L276), [`ui/dr-ui/ui/presets.slint:297`](../ui/dr-ui/ui/presets.slint#L297), [`ui/dr-ui/ui/presets.slint:5`](../ui/dr-ui/ui/presets.slint#L5), [`ui/dr-ui/ui/presets.slint:60`](../ui/dr-ui/ui/presets.slint#L60), [`ui/dr-ui/ui/settings.slint:108`](../ui/dr-ui/ui/settings.slint#L108), [`ui/dr-ui/ui/settings.slint:621`](../ui/dr-ui/ui/settings.slint#L621) | +| FR-DEV-7 | [`core/dr-pipeline/src/history.rs:214`](../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:499`](../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../core/dr-pipeline/src/history.rs#L526), [`ui/dr-ui/src/develop.rs:4291`](../ui/dr-ui/src/develop.rs#L4291), [`ui/dr-ui/src/develop.rs:4332`](../ui/dr-ui/src/develop.rs#L4332), [`ui/dr-ui/src/develop.rs:5501`](../ui/dr-ui/src/develop.rs#L5501), [`ui/dr-ui/src/develop.rs:5533`](../ui/dr-ui/src/develop.rs#L5533), [`ui/dr-ui/src/develop.rs:6465`](../ui/dr-ui/src/develop.rs#L6465), [`ui/dr-ui/src/lib.rs:1828`](../ui/dr-ui/src/lib.rs#L1828), [`ui/dr-ui/src/lib.rs:1890`](../ui/dr-ui/src/lib.rs#L1890), [`ui/dr-ui/src/lib.rs:2886`](../ui/dr-ui/src/lib.rs#L2886), [`ui/dr-ui/src/lib.rs:2947`](../ui/dr-ui/src/lib.rs#L2947), [`ui/dr-ui/src/lib.rs:404`](../ui/dr-ui/src/lib.rs#L404), [`ui/dr-ui/ui/app.slint:120`](../ui/dr-ui/ui/app.slint#L120), [`ui/dr-ui/ui/app.slint:2325`](../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/app.slint:2340`](../ui/dr-ui/ui/app.slint#L2340), [`ui/dr-ui/ui/app.slint:2638`](../ui/dr-ui/ui/app.slint#L2638), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/widgets.slint:71`](../ui/dr-ui/ui/widgets.slint#L71) | +| FR-DEV-8 | [`core/dr-gpu/src/detail.rs:405`](../core/dr-gpu/src/detail.rs#L405), [`core/dr-gpu/src/detail.rs:623`](../core/dr-gpu/src/detail.rs#L623), [`core/dr-gpu/tests/detail_instances.rs:1`](../core/dr-gpu/tests/detail_instances.rs#L1), [`core/dr-gpu/tests/spot_removal.rs:1`](../core/dr-gpu/tests/spot_removal.rs#L1), [`core/dr-pipeline/src/detail.rs:410`](../core/dr-pipeline/src/detail.rs#L410), [`core/dr-pipeline/src/detail.rs:434`](../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:469`](../core/dr-pipeline/src/detail.rs#L469), [`core/dr-pipeline/src/detail.rs:555`](../core/dr-pipeline/src/detail.rs#L555), [`core/dr-pipeline/src/graph.rs:1049`](../core/dr-pipeline/src/graph.rs#L1049), [`core/dr-pipeline/src/graph.rs:115`](../core/dr-pipeline/src/graph.rs#L115), [`core/dr-pipeline/src/graph.rs:247`](../core/dr-pipeline/src/graph.rs#L247), [`core/dr-pipeline/src/operation.rs:330`](../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:601`](../core/dr-pipeline/src/operation.rs#L601), [`core/dr-pipeline/src/sidecar.rs:1023`](../core/dr-pipeline/src/sidecar.rs#L1023), [`core/dr-pipeline/src/sidecar.rs:1053`](../core/dr-pipeline/src/sidecar.rs#L1053), [`core/dr-pipeline/src/sidecar.rs:187`](../core/dr-pipeline/src/sidecar.rs#L187), [`core/dr-pipeline/src/sidecar.rs:356`](../core/dr-pipeline/src/sidecar.rs#L356), [`core/dr-pipeline/src/sidecar.rs:793`](../core/dr-pipeline/src/sidecar.rs#L793), [`core/dr-pipeline/src/sidecar.rs:969`](../core/dr-pipeline/src/sidecar.rs#L969), [`core/dr-pipeline/src/spot.rs:115`](../core/dr-pipeline/src/spot.rs#L115), [`core/dr-pipeline/src/spot.rs:151`](../core/dr-pipeline/src/spot.rs#L151), [`core/dr-pipeline/src/spot.rs:1`](../core/dr-pipeline/src/spot.rs#L1), [`core/dr-pipeline/src/spot.rs:207`](../core/dr-pipeline/src/spot.rs#L207), [`core/dr-pipeline/src/spot.rs:387`](../core/dr-pipeline/src/spot.rs#L387), [`core/dr-pipeline/src/spot.rs:472`](../core/dr-pipeline/src/spot.rs#L472), [`core/dr-pipeline/src/spot.rs:582`](../core/dr-pipeline/src/spot.rs#L582), [`core/dr-pipeline/src/spot.rs:673`](../core/dr-pipeline/src/spot.rs#L673), [`core/dr-pipeline/src/state.rs:103`](../core/dr-pipeline/src/state.rs#L103), [`core/dr-pipeline/tests/spot_sidecar.rs:1`](../core/dr-pipeline/tests/spot_sidecar.rs#L1), [`core/dr-pipeline/tests/spots.rs:1`](../core/dr-pipeline/tests/spots.rs#L1), [`ui/dr-ui/src/develop.rs:3157`](../ui/dr-ui/src/develop.rs#L3157), [`ui/dr-ui/src/develop.rs:3195`](../ui/dr-ui/src/develop.rs#L3195), [`ui/dr-ui/src/develop.rs:3260`](../ui/dr-ui/src/develop.rs#L3260), [`ui/dr-ui/src/develop.rs:3343`](../ui/dr-ui/src/develop.rs#L3343), [`ui/dr-ui/src/develop.rs:3357`](../ui/dr-ui/src/develop.rs#L3357), [`ui/dr-ui/src/develop.rs:883`](../ui/dr-ui/src/develop.rs#L883), [`ui/dr-ui/src/labels.rs:76`](../ui/dr-ui/src/labels.rs#L76), [`ui/dr-ui/src/lib.rs:1848`](../ui/dr-ui/src/lib.rs#L1848), [`ui/dr-ui/src/lib.rs:3098`](../ui/dr-ui/src/lib.rs#L3098), [`ui/dr-ui/src/lib.rs:440`](../ui/dr-ui/src/lib.rs#L440), [`ui/dr-ui/src/spots_ui.rs:19`](../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/src/spots_ui.rs:1`](../ui/dr-ui/src/spots_ui.rs#L1), [`ui/dr-ui/src/spots_ui.rs:265`](../ui/dr-ui/src/spots_ui.rs#L265), [`ui/dr-ui/ui/app.slint:2181`](../ui/dr-ui/ui/app.slint#L2181), [`ui/dr-ui/ui/app.slint:2383`](../ui/dr-ui/ui/app.slint#L2383), [`ui/dr-ui/ui/app.slint:2937`](../ui/dr-ui/ui/app.slint#L2937), [`ui/dr-ui/ui/icons.slint:366`](../ui/dr-ui/ui/icons.slint#L366), [`ui/dr-ui/ui/session.slint:102`](../ui/dr-ui/ui/session.slint#L102), [`ui/dr-ui/ui/session.slint:52`](../ui/dr-ui/ui/session.slint#L52), [`ui/dr-ui/ui/spots.slint:191`](../ui/dr-ui/ui/spots.slint#L191), [`ui/dr-ui/ui/spots.slint:49`](../ui/dr-ui/ui/spots.slint#L49), [`ui/dr-ui/ui/spots.slint:6`](../ui/dr-ui/ui/spots.slint#L6), [`ui/dr-ui/ui/spots.slint:91`](../ui/dr-ui/ui/spots.slint#L91) | | FR-DSP-1 | [`core/dr-gpu/src/adjust.rs:2140`](../core/dr-gpu/src/adjust.rs#L2140), [`core/dr-gpu/src/adjust.rs:2217`](../core/dr-gpu/src/adjust.rs#L2217), [`core/dr-gpu/src/adjust.rs:2302`](../core/dr-gpu/src/adjust.rs#L2302), [`core/dr-gpu/src/adjust.rs:54`](../core/dr-gpu/src/adjust.rs#L54), [`core/dr-gpu/src/adjust.rs:770`](../core/dr-gpu/src/adjust.rs#L770), [`core/dr-gpu/src/lib.rs:172`](../core/dr-gpu/src/lib.rs#L172), [`core/dr-gpu/src/lib.rs:192`](../core/dr-gpu/src/lib.rs#L192), [`core/dr-gpu/src/lib.rs:70`](../core/dr-gpu/src/lib.rs#L70), [`core/dr-gpu/src/lib.rs:93`](../core/dr-gpu/src/lib.rs#L93), [`core/dr-gpu/tests/capture_sharpen.rs:200`](../core/dr-gpu/tests/capture_sharpen.rs#L200), [`core/dr-gpu/tests/detail_stage.rs:328`](../core/dr-gpu/tests/detail_stage.rs#L328), [`core/dr-gpu/tests/local_contrast.rs:264`](../core/dr-gpu/tests/local_contrast.rs#L264), [`core/dr-gpu/tests/noise_reduction.rs:378`](../core/dr-gpu/tests/noise_reduction.rs#L378), [`core/dr-pipeline/src/detail.rs:136`](../core/dr-pipeline/src/detail.rs#L136), [`core/dr-pipeline/src/detail.rs:524`](../core/dr-pipeline/src/detail.rs#L524), [`core/dr-pipeline/src/graph.rs:881`](../core/dr-pipeline/src/graph.rs#L881), [`core/dr-pipeline/src/graph.rs:911`](../core/dr-pipeline/src/graph.rs#L911), [`core/dr-pipeline/src/ops/capture_sharpen.rs:1`](../core/dr-pipeline/src/ops/capture_sharpen.rs#L1), [`core/dr-pipeline/src/ops/capture_sharpen.rs:659`](../core/dr-pipeline/src/ops/capture_sharpen.rs#L659), [`core/dr-pipeline/src/ops/dehaze.rs:1`](../core/dr-pipeline/src/ops/dehaze.rs#L1), [`core/dr-pipeline/src/ops/dehaze.rs:592`](../core/dr-pipeline/src/ops/dehaze.rs#L592), [`core/dr-pipeline/src/ops/local_contrast.rs:1`](../core/dr-pipeline/src/ops/local_contrast.rs#L1), [`core/dr-pipeline/src/ops/local_contrast.rs:971`](../core/dr-pipeline/src/ops/local_contrast.rs#L971), [`core/dr-pipeline/src/ops/noise_reduction.rs:700`](../core/dr-pipeline/src/ops/noise_reduction.rs#L700), [`core/dr-pipeline/src/spot.rs:673`](../core/dr-pipeline/src/spot.rs#L673), [`ui/dr-ui/src/develop.rs:3978`](../ui/dr-ui/src/develop.rs#L3978), [`ui/dr-ui/src/develop.rs:5240`](../ui/dr-ui/src/develop.rs#L5240), [`ui/dr-ui/src/develop.rs:5827`](../ui/dr-ui/src/develop.rs#L5827), [`ui/dr-ui/src/develop.rs:7052`](../ui/dr-ui/src/develop.rs#L7052), [`ui/dr-ui/src/develop.rs:7086`](../ui/dr-ui/src/develop.rs#L7086), [`ui/dr-ui/src/lib.rs:1013`](../ui/dr-ui/src/lib.rs#L1013), [`ui/dr-ui/src/lib.rs:1072`](../ui/dr-ui/src/lib.rs#L1072), [`ui/dr-ui/src/lib.rs:93`](../ui/dr-ui/src/lib.rs#L93) | | FR-DSP-3 | [`core/dr-gpu/tests/frame_budget.rs:101`](../core/dr-gpu/tests/frame_budget.rs#L101), [`core/dr-gpu/tests/local_contrast.rs:329`](../core/dr-gpu/tests/local_contrast.rs#L329), [`core/dr-pipeline/src/ops/local_contrast.rs:447`](../core/dr-pipeline/src/ops/local_contrast.rs#L447) | | FR-DSP-5 | [`core/dr-gpu/tests/frame_budget.rs:101`](../core/dr-gpu/tests/frame_budget.rs#L101), [`core/dr-gpu/tests/zoom_resolution.rs:135`](../core/dr-gpu/tests/zoom_resolution.rs#L135), [`core/dr-gpu/tests/zoom_resolution.rs:166`](../core/dr-gpu/tests/zoom_resolution.rs#L166), [`core/dr-gpu/tests/zoom_resolution.rs:1`](../core/dr-gpu/tests/zoom_resolution.rs#L1), [`core/dr-gpu/tests/zoom_resolution.rs:216`](../core/dr-gpu/tests/zoom_resolution.rs#L216) | -| FR-DSP-6 | [`core/dr-pipeline/src/operation.rs:497`](../core/dr-pipeline/src/operation.rs#L497), [`core/dr-types/src/colour.rs:1`](../core/dr-types/src/colour.rs#L1), [`ui/dr-ui/src/develop.rs:4008`](../ui/dr-ui/src/develop.rs#L4008), [`ui/dr-ui/src/develop.rs:8665`](../ui/dr-ui/src/develop.rs#L8665), [`ui/dr-ui/src/lib.rs:1801`](../ui/dr-ui/src/lib.rs#L1801), [`ui/dr-ui/src/lib.rs:3486`](../ui/dr-ui/src/lib.rs#L3486) | -| FR-DSP-7 | [`core/dr-gpu/src/histogram.rs:147`](../core/dr-gpu/src/histogram.rs#L147), [`core/dr-gpu/src/histogram.rs:1`](../core/dr-gpu/src/histogram.rs#L1), [`core/dr-gpu/src/histogram.rs:281`](../core/dr-gpu/src/histogram.rs#L281), [`core/dr-gpu/src/histogram.rs:50`](../core/dr-gpu/src/histogram.rs#L50), [`core/dr-gpu/src/shaders/histogram.wgsl:1`](../core/dr-gpu/src/shaders/histogram.wgsl#L1), [`ui/dr-ui/src/develop.rs:4062`](../ui/dr-ui/src/develop.rs#L4062), [`ui/dr-ui/src/develop.rs:783`](../ui/dr-ui/src/develop.rs#L783), [`ui/dr-ui/src/develop.rs:8339`](../ui/dr-ui/src/develop.rs#L8339), [`ui/dr-ui/src/develop.rs:8371`](../ui/dr-ui/src/develop.rs#L8371), [`ui/dr-ui/src/histogram.rs:1`](../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:1921`](../ui/dr-ui/src/lib.rs#L1921), [`ui/dr-ui/src/lib.rs:417`](../ui/dr-ui/src/lib.rs#L417), [`ui/dr-ui/ui/histogram.slint:184`](../ui/dr-ui/ui/histogram.slint#L184), [`ui/dr-ui/ui/histogram.slint:1`](../ui/dr-ui/ui/histogram.slint#L1) | -| FR-DSP-8 | [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/icc.rs:1`](../platform/dr-plat/src/display/icc.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../platform/dr-plat/src/display/x11.rs#L1), [`ui/dr-ui/src/develop.rs:3954`](../ui/dr-ui/src/develop.rs#L3954), [`ui/dr-ui/src/develop.rs:4008`](../ui/dr-ui/src/develop.rs#L4008), [`ui/dr-ui/src/develop.rs:8665`](../ui/dr-ui/src/develop.rs#L8665), [`ui/dr-ui/src/develop.rs:8711`](../ui/dr-ui/src/develop.rs#L8711), [`ui/dr-ui/src/develop.rs:8730`](../ui/dr-ui/src/develop.rs#L8730), [`ui/dr-ui/src/develop.rs:936`](../ui/dr-ui/src/develop.rs#L936), [`ui/dr-ui/src/display_ui.rs:192`](../ui/dr-ui/src/display_ui.rs#L192), [`ui/dr-ui/src/display_ui.rs:1`](../ui/dr-ui/src/display_ui.rs#L1), [`ui/dr-ui/src/display_ui.rs:325`](../ui/dr-ui/src/display_ui.rs#L325), [`ui/dr-ui/src/display_ui.rs:346`](../ui/dr-ui/src/display_ui.rs#L346), [`ui/dr-ui/src/display_ui.rs:379`](../ui/dr-ui/src/display_ui.rs#L379), [`ui/dr-ui/src/lib.rs:1743`](../ui/dr-ui/src/lib.rs#L1743), [`ui/dr-ui/src/lib.rs:1801`](../ui/dr-ui/src/lib.rs#L1801), [`ui/dr-ui/src/lib.rs:3393`](../ui/dr-ui/src/lib.rs#L3393), [`ui/dr-ui/src/lib.rs:3486`](../ui/dr-ui/src/lib.rs#L3486), [`ui/dr-ui/ui/app.slint:1852`](../ui/dr-ui/ui/app.slint#L1852), [`ui/dr-ui/ui/app.slint:61`](../ui/dr-ui/ui/app.slint#L61), [`ui/dr-ui/ui/settings.slint:132`](../ui/dr-ui/ui/settings.slint#L132), [`ui/dr-ui/ui/settings.slint:832`](../ui/dr-ui/ui/settings.slint#L832) | +| FR-DSP-6 | [`core/dr-pipeline/src/operation.rs:497`](../core/dr-pipeline/src/operation.rs#L497), [`core/dr-types/src/colour.rs:1`](../core/dr-types/src/colour.rs#L1), [`ui/dr-ui/src/develop.rs:4008`](../ui/dr-ui/src/develop.rs#L4008), [`ui/dr-ui/src/develop.rs:8665`](../ui/dr-ui/src/develop.rs#L8665), [`ui/dr-ui/src/lib.rs:1804`](../ui/dr-ui/src/lib.rs#L1804), [`ui/dr-ui/src/lib.rs:3489`](../ui/dr-ui/src/lib.rs#L3489) | +| FR-DSP-7 | [`core/dr-gpu/src/histogram.rs:147`](../core/dr-gpu/src/histogram.rs#L147), [`core/dr-gpu/src/histogram.rs:1`](../core/dr-gpu/src/histogram.rs#L1), [`core/dr-gpu/src/histogram.rs:281`](../core/dr-gpu/src/histogram.rs#L281), [`core/dr-gpu/src/histogram.rs:50`](../core/dr-gpu/src/histogram.rs#L50), [`core/dr-gpu/src/shaders/histogram.wgsl:1`](../core/dr-gpu/src/shaders/histogram.wgsl#L1), [`ui/dr-ui/src/develop.rs:4062`](../ui/dr-ui/src/develop.rs#L4062), [`ui/dr-ui/src/develop.rs:783`](../ui/dr-ui/src/develop.rs#L783), [`ui/dr-ui/src/develop.rs:8339`](../ui/dr-ui/src/develop.rs#L8339), [`ui/dr-ui/src/develop.rs:8371`](../ui/dr-ui/src/develop.rs#L8371), [`ui/dr-ui/src/histogram.rs:1`](../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:1924`](../ui/dr-ui/src/lib.rs#L1924), [`ui/dr-ui/src/lib.rs:417`](../ui/dr-ui/src/lib.rs#L417), [`ui/dr-ui/ui/histogram.slint:184`](../ui/dr-ui/ui/histogram.slint#L184), [`ui/dr-ui/ui/histogram.slint:1`](../ui/dr-ui/ui/histogram.slint#L1) | +| FR-DSP-8 | [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/icc.rs:1`](../platform/dr-plat/src/display/icc.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../platform/dr-plat/src/display/x11.rs#L1), [`ui/dr-ui/src/develop.rs:3954`](../ui/dr-ui/src/develop.rs#L3954), [`ui/dr-ui/src/develop.rs:4008`](../ui/dr-ui/src/develop.rs#L4008), [`ui/dr-ui/src/develop.rs:8665`](../ui/dr-ui/src/develop.rs#L8665), [`ui/dr-ui/src/develop.rs:8711`](../ui/dr-ui/src/develop.rs#L8711), [`ui/dr-ui/src/develop.rs:8730`](../ui/dr-ui/src/develop.rs#L8730), [`ui/dr-ui/src/develop.rs:936`](../ui/dr-ui/src/develop.rs#L936), [`ui/dr-ui/src/display_ui.rs:192`](../ui/dr-ui/src/display_ui.rs#L192), [`ui/dr-ui/src/display_ui.rs:1`](../ui/dr-ui/src/display_ui.rs#L1), [`ui/dr-ui/src/display_ui.rs:325`](../ui/dr-ui/src/display_ui.rs#L325), [`ui/dr-ui/src/display_ui.rs:346`](../ui/dr-ui/src/display_ui.rs#L346), [`ui/dr-ui/src/display_ui.rs:379`](../ui/dr-ui/src/display_ui.rs#L379), [`ui/dr-ui/src/lib.rs:1746`](../ui/dr-ui/src/lib.rs#L1746), [`ui/dr-ui/src/lib.rs:1804`](../ui/dr-ui/src/lib.rs#L1804), [`ui/dr-ui/src/lib.rs:3396`](../ui/dr-ui/src/lib.rs#L3396), [`ui/dr-ui/src/lib.rs:3489`](../ui/dr-ui/src/lib.rs#L3489), [`ui/dr-ui/ui/app.slint:1861`](../ui/dr-ui/ui/app.slint#L1861), [`ui/dr-ui/ui/app.slint:61`](../ui/dr-ui/ui/app.slint#L61), [`ui/dr-ui/ui/settings.slint:139`](../ui/dr-ui/ui/settings.slint#L139), [`ui/dr-ui/ui/settings.slint:858`](../ui/dr-ui/ui/settings.slint#L858) | | FR-EXP-1 | [`core/dr-export/src/encode.rs:1`](../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1) | -| FR-EXP-2 | [`core/dr-export/src/encode.rs:1`](../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/error.rs:26`](../core/dr-export/src/error.rs#L26), [`core/dr-export/src/icc.rs:1`](../core/dr-export/src/icc.rs#L1), [`core/dr-export/src/lib.rs:153`](../core/dr-export/src/lib.rs#L153), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/lib.rs:53`](../core/dr-export/src/lib.rs#L53), [`core/dr-gpu/src/adjust.rs:2450`](../core/dr-gpu/src/adjust.rs#L2450), [`core/dr-pipeline/src/graph.rs:835`](../core/dr-pipeline/src/graph.rs#L835), [`core/dr-pipeline/src/graph.rs:925`](../core/dr-pipeline/src/graph.rs#L925), [`core/dr-pipeline/src/operation.rs:497`](../core/dr-pipeline/src/operation.rs#L497), [`core/dr-types/src/colour.rs:1`](../core/dr-types/src/colour.rs#L1), [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`core/dr-types/src/settings.rs:761`](../core/dr-types/src/settings.rs#L761), [`ui/dr-ui/src/develop.rs:8730`](../ui/dr-ui/src/develop.rs#L8730), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1) | -| FR-EXP-3 | [`core/dr-export/src/lib.rs:182`](../core/dr-export/src/lib.rs#L182), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/size.rs:136`](../core/dr-export/src/size.rs#L136), [`core/dr-export/src/size.rs:1`](../core/dr-export/src/size.rs#L1), [`core/dr-export/src/size.rs:25`](../core/dr-export/src/size.rs#L25), [`core/dr-export/src/size.rs:84`](../core/dr-export/src/size.rs#L84), [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`core/dr-types/src/settings.rs:806`](../core/dr-types/src/settings.rs#L806), [`core/dr-types/src/settings.rs:814`](../core/dr-types/src/settings.rs#L814), [`core/dr-types/src/settings.rs:830`](../core/dr-types/src/settings.rs#L830), [`core/dr-types/src/settings.rs:899`](../core/dr-types/src/settings.rs#L899), [`core/dr-types/src/settings.rs:927`](../core/dr-types/src/settings.rs#L927), [`core/dr-types/src/settings.rs:938`](../core/dr-types/src/settings.rs#L938), [`core/dr-types/src/settings.rs:944`](../core/dr-types/src/settings.rs#L944), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:237`](../ui/dr-ui/src/settings_ui.rs#L237), [`ui/dr-ui/src/settings_ui.rs:250`](../ui/dr-ui/src/settings_ui.rs#L250), [`ui/dr-ui/src/settings_ui.rs:265`](../ui/dr-ui/src/settings_ui.rs#L265), [`ui/dr-ui/src/settings_ui.rs:616`](../ui/dr-ui/src/settings_ui.rs#L616), [`ui/dr-ui/ui/settings.slint:735`](../ui/dr-ui/ui/settings.slint#L735), [`ui/dr-ui/ui/settings.slint:745`](../ui/dr-ui/ui/settings.slint#L745) | +| FR-EXP-2 | [`core/dr-export/src/encode.rs:1`](../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/error.rs:26`](../core/dr-export/src/error.rs#L26), [`core/dr-export/src/icc.rs:1`](../core/dr-export/src/icc.rs#L1), [`core/dr-export/src/lib.rs:153`](../core/dr-export/src/lib.rs#L153), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/lib.rs:53`](../core/dr-export/src/lib.rs#L53), [`core/dr-gpu/src/adjust.rs:2450`](../core/dr-gpu/src/adjust.rs#L2450), [`core/dr-pipeline/src/graph.rs:835`](../core/dr-pipeline/src/graph.rs#L835), [`core/dr-pipeline/src/graph.rs:925`](../core/dr-pipeline/src/graph.rs#L925), [`core/dr-pipeline/src/operation.rs:497`](../core/dr-pipeline/src/operation.rs#L497), [`core/dr-types/src/colour.rs:1`](../core/dr-types/src/colour.rs#L1), [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`core/dr-types/src/settings.rs:852`](../core/dr-types/src/settings.rs#L852), [`ui/dr-ui/src/develop.rs:8730`](../ui/dr-ui/src/develop.rs#L8730), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1) | +| FR-EXP-3 | [`core/dr-export/src/lib.rs:182`](../core/dr-export/src/lib.rs#L182), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/size.rs:136`](../core/dr-export/src/size.rs#L136), [`core/dr-export/src/size.rs:1`](../core/dr-export/src/size.rs#L1), [`core/dr-export/src/size.rs:25`](../core/dr-export/src/size.rs#L25), [`core/dr-export/src/size.rs:84`](../core/dr-export/src/size.rs#L84), [`core/dr-types/src/settings.rs:1018`](../core/dr-types/src/settings.rs#L1018), [`core/dr-types/src/settings.rs:1029`](../core/dr-types/src/settings.rs#L1029), [`core/dr-types/src/settings.rs:1035`](../core/dr-types/src/settings.rs#L1035), [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`core/dr-types/src/settings.rs:897`](../core/dr-types/src/settings.rs#L897), [`core/dr-types/src/settings.rs:905`](../core/dr-types/src/settings.rs#L905), [`core/dr-types/src/settings.rs:921`](../core/dr-types/src/settings.rs#L921), [`core/dr-types/src/settings.rs:990`](../core/dr-types/src/settings.rs#L990), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:255`](../ui/dr-ui/src/settings_ui.rs#L255), [`ui/dr-ui/src/settings_ui.rs:268`](../ui/dr-ui/src/settings_ui.rs#L268), [`ui/dr-ui/src/settings_ui.rs:283`](../ui/dr-ui/src/settings_ui.rs#L283), [`ui/dr-ui/src/settings_ui.rs:656`](../ui/dr-ui/src/settings_ui.rs#L656), [`ui/dr-ui/ui/settings.slint:761`](../ui/dr-ui/ui/settings.slint#L761), [`ui/dr-ui/ui/settings.slint:771`](../ui/dr-ui/ui/settings.slint#L771) | | FR-EXP-4 | [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/sharpen.rs:1`](../core/dr-export/src/sharpen.rs#L1), [`core/dr-export/src/size.rs:1`](../core/dr-export/src/size.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1) | | FR-EXP-5 | [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1) | -| FR-EXP-6 | [`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/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:594`](../ui/dr-ui/src/lib.rs#L594), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:49`](../ui/dr-ui/src/settings_ui.rs#L49), [`ui/dr-ui/src/settings_ui.rs:730`](../ui/dr-ui/src/settings_ui.rs#L730) | -| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/export.rs:992`](../ui/dr-ui/src/export.rs#L992), [`ui/dr-ui/src/lib.rs:2616`](../ui/dr-ui/src/lib.rs#L2616), [`ui/dr-ui/src/lib.rs:261`](../ui/dr-ui/src/lib.rs#L261), [`ui/dr-ui/src/lib.rs:594`](../ui/dr-ui/src/lib.rs#L594), [`ui/dr-ui/src/lib.rs:640`](../ui/dr-ui/src/lib.rs#L640), [`ui/dr-ui/src/lib.rs:667`](../ui/dr-ui/src/lib.rs#L667), [`ui/dr-ui/src/library_ui.rs:3977`](../ui/dr-ui/src/library_ui.rs#L3977), [`ui/dr-ui/src/library_ui.rs:639`](../ui/dr-ui/src/library_ui.rs#L639), [`ui/dr-ui/src/library_ui.rs:739`](../ui/dr-ui/src/library_ui.rs#L739), [`ui/dr-ui/src/library_ui.rs:7670`](../ui/dr-ui/src/library_ui.rs#L7670), [`ui/dr-ui/src/library_ui.rs:7747`](../ui/dr-ui/src/library_ui.rs#L7747), [`ui/dr-ui/src/library_ui.rs:7759`](../ui/dr-ui/src/library_ui.rs#L7759), [`ui/dr-ui/src/library_ui.rs:796`](../ui/dr-ui/src/library_ui.rs#L796), [`ui/dr-ui/ui/app.slint:1069`](../ui/dr-ui/ui/app.slint#L1069), [`ui/dr-ui/ui/app.slint:1591`](../ui/dr-ui/ui/app.slint#L1591), [`ui/dr-ui/ui/library.slint:1583`](../ui/dr-ui/ui/library.slint#L1583), [`ui/dr-ui/ui/library.slint:4278`](../ui/dr-ui/ui/library.slint#L4278) | -| FR-EXP-8 | [`core/dr-decode/src/lib.rs:326`](../core/dr-decode/src/lib.rs#L326), [`core/dr-decode/src/lib.rs:350`](../core/dr-decode/src/lib.rs#L350), [`core/dr-decode/src/lib.rs:364`](../core/dr-decode/src/lib.rs#L364), [`core/dr-decode/src/lib.rs:71`](../core/dr-decode/src/lib.rs#L71), [`core/dr-decode/src/lib.rs:79`](../core/dr-decode/src/lib.rs#L79), [`core/dr-decode/src/lib.rs:82`](../core/dr-decode/src/lib.rs#L82), [`core/dr-decode/src/locate.rs:1164`](../core/dr-decode/src/locate.rs#L1164), [`core/dr-decode/src/locate.rs:1223`](../core/dr-decode/src/locate.rs#L1223), [`core/dr-decode/src/locate.rs:316`](../core/dr-decode/src/locate.rs#L316), [`core/dr-decode/src/locate.rs:487`](../core/dr-decode/src/locate.rs#L487), [`core/dr-decode/src/locate.rs:571`](../core/dr-decode/src/locate.rs#L571), [`core/dr-decode/src/locate.rs:584`](../core/dr-decode/src/locate.rs#L584), [`core/dr-decode/src/locate.rs:667`](../core/dr-decode/src/locate.rs#L667), [`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:136`](../core/dr-export/src/lib.rs#L136), [`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:655`](../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:474`](../core/dr-types/src/settings.rs#L474), [`ui/dr-ui/src/develop.rs:4496`](../ui/dr-ui/src/develop.rs#L4496), [`ui/dr-ui/src/develop.rs:4608`](../ui/dr-ui/src/develop.rs#L4608), [`ui/dr-ui/src/develop.rs:729`](../ui/dr-ui/src/develop.rs#L729), [`ui/dr-ui/src/export.rs:467`](../ui/dr-ui/src/export.rs#L467), [`ui/dr-ui/src/export.rs:634`](../ui/dr-ui/src/export.rs#L634), [`ui/dr-ui/src/export.rs:680`](../ui/dr-ui/src/export.rs#L680), [`ui/dr-ui/src/export.rs:702`](../ui/dr-ui/src/export.rs#L702), [`ui/dr-ui/src/export.rs:826`](../ui/dr-ui/src/export.rs#L826), [`ui/dr-ui/src/export.rs:844`](../ui/dr-ui/src/export.rs#L844), [`ui/dr-ui/src/lib.rs:261`](../ui/dr-ui/src/lib.rs#L261), [`ui/dr-ui/src/lib.rs:284`](../ui/dr-ui/src/lib.rs#L284), [`ui/dr-ui/src/lib.rs:626`](../ui/dr-ui/src/lib.rs#L626), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1) | +| FR-EXP-6 | [`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/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:594`](../ui/dr-ui/src/lib.rs#L594), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:49`](../ui/dr-ui/src/settings_ui.rs#L49), [`ui/dr-ui/src/settings_ui.rs:770`](../ui/dr-ui/src/settings_ui.rs#L770) | +| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/export.rs:992`](../ui/dr-ui/src/export.rs#L992), [`ui/dr-ui/src/lib.rs:2619`](../ui/dr-ui/src/lib.rs#L2619), [`ui/dr-ui/src/lib.rs:261`](../ui/dr-ui/src/lib.rs#L261), [`ui/dr-ui/src/lib.rs:594`](../ui/dr-ui/src/lib.rs#L594), [`ui/dr-ui/src/lib.rs:640`](../ui/dr-ui/src/lib.rs#L640), [`ui/dr-ui/src/lib.rs:667`](../ui/dr-ui/src/lib.rs#L667), [`ui/dr-ui/src/library_ui.rs:3999`](../ui/dr-ui/src/library_ui.rs#L3999), [`ui/dr-ui/src/library_ui.rs:661`](../ui/dr-ui/src/library_ui.rs#L661), [`ui/dr-ui/src/library_ui.rs:761`](../ui/dr-ui/src/library_ui.rs#L761), [`ui/dr-ui/src/library_ui.rs:7693`](../ui/dr-ui/src/library_ui.rs#L7693), [`ui/dr-ui/src/library_ui.rs:7770`](../ui/dr-ui/src/library_ui.rs#L7770), [`ui/dr-ui/src/library_ui.rs:7782`](../ui/dr-ui/src/library_ui.rs#L7782), [`ui/dr-ui/src/library_ui.rs:818`](../ui/dr-ui/src/library_ui.rs#L818), [`ui/dr-ui/ui/app.slint:1075`](../ui/dr-ui/ui/app.slint#L1075), [`ui/dr-ui/ui/app.slint:1600`](../ui/dr-ui/ui/app.slint#L1600), [`ui/dr-ui/ui/library.slint:1583`](../ui/dr-ui/ui/library.slint#L1583), [`ui/dr-ui/ui/library.slint:4278`](../ui/dr-ui/ui/library.slint#L4278) | +| FR-EXP-8 | [`core/dr-decode/src/lib.rs:326`](../core/dr-decode/src/lib.rs#L326), [`core/dr-decode/src/lib.rs:350`](../core/dr-decode/src/lib.rs#L350), [`core/dr-decode/src/lib.rs:364`](../core/dr-decode/src/lib.rs#L364), [`core/dr-decode/src/lib.rs:71`](../core/dr-decode/src/lib.rs#L71), [`core/dr-decode/src/lib.rs:79`](../core/dr-decode/src/lib.rs#L79), [`core/dr-decode/src/lib.rs:82`](../core/dr-decode/src/lib.rs#L82), [`core/dr-decode/src/locate.rs:1164`](../core/dr-decode/src/locate.rs#L1164), [`core/dr-decode/src/locate.rs:1223`](../core/dr-decode/src/locate.rs#L1223), [`core/dr-decode/src/locate.rs:316`](../core/dr-decode/src/locate.rs#L316), [`core/dr-decode/src/locate.rs:487`](../core/dr-decode/src/locate.rs#L487), [`core/dr-decode/src/locate.rs:571`](../core/dr-decode/src/locate.rs#L571), [`core/dr-decode/src/locate.rs:584`](../core/dr-decode/src/locate.rs#L584), [`core/dr-decode/src/locate.rs:667`](../core/dr-decode/src/locate.rs#L667), [`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:136`](../core/dr-export/src/lib.rs#L136), [`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:655`](../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:565`](../core/dr-types/src/settings.rs#L565), [`ui/dr-ui/src/develop.rs:4496`](../ui/dr-ui/src/develop.rs#L4496), [`ui/dr-ui/src/develop.rs:4608`](../ui/dr-ui/src/develop.rs#L4608), [`ui/dr-ui/src/develop.rs:729`](../ui/dr-ui/src/develop.rs#L729), [`ui/dr-ui/src/export.rs:467`](../ui/dr-ui/src/export.rs#L467), [`ui/dr-ui/src/export.rs:634`](../ui/dr-ui/src/export.rs#L634), [`ui/dr-ui/src/export.rs:680`](../ui/dr-ui/src/export.rs#L680), [`ui/dr-ui/src/export.rs:702`](../ui/dr-ui/src/export.rs#L702), [`ui/dr-ui/src/export.rs:826`](../ui/dr-ui/src/export.rs#L826), [`ui/dr-ui/src/export.rs:844`](../ui/dr-ui/src/export.rs#L844), [`ui/dr-ui/src/lib.rs:261`](../ui/dr-ui/src/lib.rs#L261), [`ui/dr-ui/src/lib.rs:284`](../ui/dr-ui/src/lib.rs#L284), [`ui/dr-ui/src/lib.rs:626`](../ui/dr-ui/src/lib.rs#L626), [`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:506`](../core/dr-decode/src/lib.rs#L506), [`core/dr-export/src/lib.rs:128`](../core/dr-export/src/lib.rs#L128), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1106`](../core/dr-gpu/src/adjust.rs#L1106), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/develop.rs:4629`](../ui/dr-ui/src/develop.rs#L4629), [`ui/dr-ui/src/develop.rs:4667`](../ui/dr-ui/src/develop.rs#L4667), [`ui/dr-ui/src/develop.rs:6576`](../ui/dr-ui/src/develop.rs#L6576), [`ui/dr-ui/src/lib.rs:594`](../ui/dr-ui/src/lib.rs#L594), [`ui/dr-ui/src/library.rs:3451`](../ui/dr-ui/src/library.rs#L3451), [`ui/dr-ui/src/library.rs:3864`](../ui/dr-ui/src/library.rs#L3864), [`ui/dr-ui/src/library.rs:3900`](../ui/dr-ui/src/library.rs#L3900), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | | FR-NC-1 | [`core/dr-sync-nextcloud/src/auth.rs:132`](../core/dr-sync-nextcloud/src/auth.rs#L132), [`core/dr-sync-nextcloud/src/auth.rs:44`](../core/dr-sync-nextcloud/src/auth.rs#L44), [`core/dr-sync-nextcloud/src/provider.rs:1`](../core/dr-sync-nextcloud/src/provider.rs#L1), [`core/dr-sync/src/account.rs:355`](../core/dr-sync/src/account.rs#L355), [`ui/dr-ui/src/launch.rs:277`](../ui/dr-ui/src/launch.rs#L277), [`ui/dr-ui/src/launch.rs:61`](../ui/dr-ui/src/launch.rs#L61), [`ui/dr-ui/src/launch_ui.rs:417`](../ui/dr-ui/src/launch_ui.rs#L417) | -| FR-NC-10 | [`core/dr-sync/src/account.rs:220`](../core/dr-sync/src/account.rs#L220), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:667`](../ui/dr-ui/src/lib.rs#L667), [`ui/dr-ui/src/library.rs:1155`](../ui/dr-ui/src/library.rs#L1155), [`ui/dr-ui/src/library.rs:2255`](../ui/dr-ui/src/library.rs#L2255), [`ui/dr-ui/src/library.rs:584`](../ui/dr-ui/src/library.rs#L584), [`ui/dr-ui/src/library.rs:899`](../ui/dr-ui/src/library.rs#L899), [`ui/dr-ui/src/library_ui.rs:1977`](../ui/dr-ui/src/library_ui.rs#L1977), [`ui/dr-ui/src/library_ui.rs:3977`](../ui/dr-ui/src/library_ui.rs#L3977), [`ui/dr-ui/src/library_ui.rs:580`](../ui/dr-ui/src/library_ui.rs#L580), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1) | +| FR-NC-10 | [`core/dr-sync/src/account.rs:220`](../core/dr-sync/src/account.rs#L220), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:667`](../ui/dr-ui/src/lib.rs#L667), [`ui/dr-ui/src/library.rs:1155`](../ui/dr-ui/src/library.rs#L1155), [`ui/dr-ui/src/library.rs:2255`](../ui/dr-ui/src/library.rs#L2255), [`ui/dr-ui/src/library.rs:584`](../ui/dr-ui/src/library.rs#L584), [`ui/dr-ui/src/library.rs:899`](../ui/dr-ui/src/library.rs#L899), [`ui/dr-ui/src/library_ui.rs:1999`](../ui/dr-ui/src/library_ui.rs#L1999), [`ui/dr-ui/src/library_ui.rs:3999`](../ui/dr-ui/src/library_ui.rs#L3999), [`ui/dr-ui/src/library_ui.rs:602`](../ui/dr-ui/src/library_ui.rs#L602), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1) | | 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:40`](../core/dr-sync-nextcloud/src/lib.rs#L40), [`core/dr-sync-nextcloud/src/lib.rs:914`](../core/dr-sync-nextcloud/src/lib.rs#L914), [`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:81`](../core/dr-sync/src/account.rs#L81), [`core/dr-sync/src/lib.rs:218`](../core/dr-sync/src/lib.rs#L218), [`core/dr-sync/src/lib.rs:51`](../core/dr-sync/src/lib.rs#L51), [`core/dr-sync/src/provider.rs:106`](../core/dr-sync/src/provider.rs#L106), [`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:106`](../core/dr-sync/src/provider.rs#L106), [`ui/dr-ui/src/launch_ui.rs:316`](../ui/dr-ui/src/launch_ui.rs#L316), [`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:298`](../core/dr-sync/src/account.rs#L298), [`core/dr-sync/src/account.rs:355`](../core/dr-sync/src/account.rs#L355), [`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/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library.rs:3292`](../ui/dr-ui/src/library.rs#L3292), [`ui/dr-ui/src/library.rs:4050`](../ui/dr-ui/src/library.rs#L4050), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/library_ui.rs:4230`](../ui/dr-ui/src/library_ui.rs#L4230), [`ui/dr-ui/src/library_ui.rs:5729`](../ui/dr-ui/src/library_ui.rs#L5729), [`ui/dr-ui/ui/app.slint:375`](../ui/dr-ui/ui/app.slint#L375), [`ui/dr-ui/ui/settings.slint:395`](../ui/dr-ui/ui/settings.slint#L395), [`ui/dr-ui/ui/settings.slint:73`](../ui/dr-ui/ui/settings.slint#L73) | +| 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/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library.rs:3292`](../ui/dr-ui/src/library.rs#L3292), [`ui/dr-ui/src/library.rs:4050`](../ui/dr-ui/src/library.rs#L4050), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/library_ui.rs:4253`](../ui/dr-ui/src/library_ui.rs#L4253), [`ui/dr-ui/src/library_ui.rs:5752`](../ui/dr-ui/src/library_ui.rs#L5752), [`ui/dr-ui/ui/app.slint:375`](../ui/dr-ui/ui/app.slint#L375), [`ui/dr-ui/ui/settings.slint:402`](../ui/dr-ui/ui/settings.slint#L402), [`ui/dr-ui/ui/settings.slint:73`](../ui/dr-ui/ui/settings.slint#L73) | | 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:218`](../core/dr-sync/src/lib.rs#L218), [`core/dr-sync/src/scan.rs:118`](../core/dr-sync/src/scan.rs#L118), [`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:488`](../ui/dr-ui/src/import.rs#L488) | | 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:1259`](../core/dr-catalog/src/schema.rs#L1259), [`core/dr-catalog/src/schema.rs:858`](../core/dr-catalog/src/schema.rs#L858), [`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/collections_ui.rs:2940`](../ui/dr-ui/src/collections_ui.rs#L2940), [`ui/dr-ui/src/collections_ui.rs:3182`](../ui/dr-ui/src/collections_ui.rs#L3182), [`ui/dr-ui/src/collections_ui.rs:4083`](../ui/dr-ui/src/collections_ui.rs#L4083), [`ui/dr-ui/src/collections_ui.rs:785`](../ui/dr-ui/src/collections_ui.rs#L785), [`ui/dr-ui/src/collections_ui.rs:856`](../ui/dr-ui/src/collections_ui.rs#L856), [`ui/dr-ui/src/lib.rs:2299`](../ui/dr-ui/src/lib.rs#L2299), [`ui/dr-ui/src/lib.rs:3583`](../ui/dr-ui/src/lib.rs#L3583), [`ui/dr-ui/src/library.rs:1881`](../ui/dr-ui/src/library.rs#L1881), [`ui/dr-ui/src/library.rs:1904`](../ui/dr-ui/src/library.rs#L1904), [`ui/dr-ui/src/library.rs:2179`](../ui/dr-ui/src/library.rs#L2179), [`ui/dr-ui/src/library_ui.rs:1402`](../ui/dr-ui/src/library_ui.rs#L1402), [`ui/dr-ui/src/library_ui.rs:1475`](../ui/dr-ui/src/library_ui.rs#L1475), [`ui/dr-ui/src/library_ui.rs:1576`](../ui/dr-ui/src/library_ui.rs#L1576), [`ui/dr-ui/src/library_ui.rs:1631`](../ui/dr-ui/src/library_ui.rs#L1631), [`ui/dr-ui/src/library_ui.rs:1766`](../ui/dr-ui/src/library_ui.rs#L1766), [`ui/dr-ui/src/library_ui.rs:1884`](../ui/dr-ui/src/library_ui.rs#L1884), [`ui/dr-ui/src/library_ui.rs:2651`](../ui/dr-ui/src/library_ui.rs#L2651), [`ui/dr-ui/src/library_ui.rs:341`](../ui/dr-ui/src/library_ui.rs#L341), [`ui/dr-ui/src/library_ui.rs:352`](../ui/dr-ui/src/library_ui.rs#L352), [`ui/dr-ui/src/library_ui.rs:367`](../ui/dr-ui/src/library_ui.rs#L367), [`ui/dr-ui/src/library_ui.rs:376`](../ui/dr-ui/src/library_ui.rs#L376), [`ui/dr-ui/src/library_ui.rs:476`](../ui/dr-ui/src/library_ui.rs#L476), [`ui/dr-ui/src/library_ui.rs:486`](../ui/dr-ui/src/library_ui.rs#L486), [`ui/dr-ui/src/library_ui.rs:533`](../ui/dr-ui/src/library_ui.rs#L533), [`ui/dr-ui/src/library_ui.rs:596`](../ui/dr-ui/src/library_ui.rs#L596), [`ui/dr-ui/src/library_ui.rs:627`](../ui/dr-ui/src/library_ui.rs#L627), [`ui/dr-ui/src/library_ui.rs:639`](../ui/dr-ui/src/library_ui.rs#L639), [`ui/dr-ui/src/library_ui.rs:6566`](../ui/dr-ui/src/library_ui.rs#L6566), [`ui/dr-ui/src/library_ui.rs:6584`](../ui/dr-ui/src/library_ui.rs#L6584), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1485`](../ui/dr-ui/ui/app.slint#L1485), [`ui/dr-ui/ui/app.slint:3012`](../ui/dr-ui/ui/app.slint#L3012), [`ui/dr-ui/ui/app.slint:527`](../ui/dr-ui/ui/app.slint#L527), [`ui/dr-ui/ui/app.slint:535`](../ui/dr-ui/ui/app.slint#L535), [`ui/dr-ui/ui/app.slint:541`](../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/collections.slint:1037`](../ui/dr-ui/ui/collections.slint#L1037), [`ui/dr-ui/ui/collections.slint:1048`](../ui/dr-ui/ui/collections.slint#L1048), [`ui/dr-ui/ui/collections.slint:1127`](../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:272`](../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:424`](../ui/dr-ui/ui/collections.slint#L424), [`ui/dr-ui/ui/collections.slint:433`](../ui/dr-ui/ui/collections.slint#L433), [`ui/dr-ui/ui/collections.slint:436`](../ui/dr-ui/ui/collections.slint#L436), [`ui/dr-ui/ui/collections.slint:482`](../ui/dr-ui/ui/collections.slint#L482), [`ui/dr-ui/ui/collections.slint:52`](../ui/dr-ui/ui/collections.slint#L52), [`ui/dr-ui/ui/collections.slint:720`](../ui/dr-ui/ui/collections.slint#L720), [`ui/dr-ui/ui/collections.slint:877`](../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/collections.slint:91`](../ui/dr-ui/ui/collections.slint#L91), [`ui/dr-ui/ui/icons.slint:262`](../ui/dr-ui/ui/icons.slint#L262) | -| FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1631`](../ui/dr-ui/src/library_ui.rs#L1631), [`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:167`](../core/dr-sync-nextcloud/src/desktop_client.rs#L167), [`core/dr-sync-nextcloud/src/desktop_client.rs:30`](../core/dr-sync-nextcloud/src/desktop_client.rs#L30), [`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:158`](../core/dr-sync/src/lib.rs#L158), [`core/dr-sync/src/types.rs:101`](../core/dr-sync/src/types.rs#L101), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`core/dr-types/src/lib.rs:204`](../core/dr-types/src/lib.rs#L204), [`ui/dr-ui/src/activity.rs:1`](../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/collections_ui.rs:4083`](../ui/dr-ui/src/collections_ui.rs#L4083), [`ui/dr-ui/src/collections_ui.rs:785`](../ui/dr-ui/src/collections_ui.rs#L785), [`ui/dr-ui/src/collections_ui.rs:856`](../ui/dr-ui/src/collections_ui.rs#L856), [`ui/dr-ui/src/derived_sync.rs:585`](../ui/dr-ui/src/derived_sync.rs#L585), [`ui/dr-ui/src/derived_sync.rs:805`](../ui/dr-ui/src/derived_sync.rs#L805), [`ui/dr-ui/src/library.rs:1003`](../ui/dr-ui/src/library.rs#L1003), [`ui/dr-ui/src/library.rs:2001`](../ui/dr-ui/src/library.rs#L2001), [`ui/dr-ui/src/library.rs:2091`](../ui/dr-ui/src/library.rs#L2091), [`ui/dr-ui/src/library.rs:3661`](../ui/dr-ui/src/library.rs#L3661), [`ui/dr-ui/src/library.rs:4170`](../ui/dr-ui/src/library.rs#L4170), [`ui/dr-ui/src/library_ui.rs:1402`](../ui/dr-ui/src/library_ui.rs#L1402), [`ui/dr-ui/src/library_ui.rs:1475`](../ui/dr-ui/src/library_ui.rs#L1475), [`ui/dr-ui/src/library_ui.rs:1674`](../ui/dr-ui/src/library_ui.rs#L1674), [`ui/dr-ui/src/remote.rs:40`](../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/ui/collections.slint:272`](../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:877`](../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/icons.slint:262`](../ui/dr-ui/ui/icons.slint#L262) | +| 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:1259`](../core/dr-catalog/src/schema.rs#L1259), [`core/dr-catalog/src/schema.rs:858`](../core/dr-catalog/src/schema.rs#L858), [`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/collections_ui.rs:2940`](../ui/dr-ui/src/collections_ui.rs#L2940), [`ui/dr-ui/src/collections_ui.rs:3182`](../ui/dr-ui/src/collections_ui.rs#L3182), [`ui/dr-ui/src/collections_ui.rs:4083`](../ui/dr-ui/src/collections_ui.rs#L4083), [`ui/dr-ui/src/collections_ui.rs:785`](../ui/dr-ui/src/collections_ui.rs#L785), [`ui/dr-ui/src/collections_ui.rs:856`](../ui/dr-ui/src/collections_ui.rs#L856), [`ui/dr-ui/src/lib.rs:2302`](../ui/dr-ui/src/lib.rs#L2302), [`ui/dr-ui/src/lib.rs:3586`](../ui/dr-ui/src/lib.rs#L3586), [`ui/dr-ui/src/library.rs:1881`](../ui/dr-ui/src/library.rs#L1881), [`ui/dr-ui/src/library.rs:1904`](../ui/dr-ui/src/library.rs#L1904), [`ui/dr-ui/src/library.rs:2179`](../ui/dr-ui/src/library.rs#L2179), [`ui/dr-ui/src/library_ui.rs:1424`](../ui/dr-ui/src/library_ui.rs#L1424), [`ui/dr-ui/src/library_ui.rs:1497`](../ui/dr-ui/src/library_ui.rs#L1497), [`ui/dr-ui/src/library_ui.rs:1598`](../ui/dr-ui/src/library_ui.rs#L1598), [`ui/dr-ui/src/library_ui.rs:1653`](../ui/dr-ui/src/library_ui.rs#L1653), [`ui/dr-ui/src/library_ui.rs:1788`](../ui/dr-ui/src/library_ui.rs#L1788), [`ui/dr-ui/src/library_ui.rs:1906`](../ui/dr-ui/src/library_ui.rs#L1906), [`ui/dr-ui/src/library_ui.rs:2673`](../ui/dr-ui/src/library_ui.rs#L2673), [`ui/dr-ui/src/library_ui.rs:341`](../ui/dr-ui/src/library_ui.rs#L341), [`ui/dr-ui/src/library_ui.rs:352`](../ui/dr-ui/src/library_ui.rs#L352), [`ui/dr-ui/src/library_ui.rs:367`](../ui/dr-ui/src/library_ui.rs#L367), [`ui/dr-ui/src/library_ui.rs:376`](../ui/dr-ui/src/library_ui.rs#L376), [`ui/dr-ui/src/library_ui.rs:498`](../ui/dr-ui/src/library_ui.rs#L498), [`ui/dr-ui/src/library_ui.rs:508`](../ui/dr-ui/src/library_ui.rs#L508), [`ui/dr-ui/src/library_ui.rs:555`](../ui/dr-ui/src/library_ui.rs#L555), [`ui/dr-ui/src/library_ui.rs:618`](../ui/dr-ui/src/library_ui.rs#L618), [`ui/dr-ui/src/library_ui.rs:649`](../ui/dr-ui/src/library_ui.rs#L649), [`ui/dr-ui/src/library_ui.rs:6589`](../ui/dr-ui/src/library_ui.rs#L6589), [`ui/dr-ui/src/library_ui.rs:6607`](../ui/dr-ui/src/library_ui.rs#L6607), [`ui/dr-ui/src/library_ui.rs:661`](../ui/dr-ui/src/library_ui.rs#L661), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1494`](../ui/dr-ui/ui/app.slint#L1494), [`ui/dr-ui/ui/app.slint:3021`](../ui/dr-ui/ui/app.slint#L3021), [`ui/dr-ui/ui/app.slint:527`](../ui/dr-ui/ui/app.slint#L527), [`ui/dr-ui/ui/app.slint:535`](../ui/dr-ui/ui/app.slint#L535), [`ui/dr-ui/ui/app.slint:541`](../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/collections.slint:1037`](../ui/dr-ui/ui/collections.slint#L1037), [`ui/dr-ui/ui/collections.slint:1048`](../ui/dr-ui/ui/collections.slint#L1048), [`ui/dr-ui/ui/collections.slint:1127`](../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:272`](../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:424`](../ui/dr-ui/ui/collections.slint#L424), [`ui/dr-ui/ui/collections.slint:433`](../ui/dr-ui/ui/collections.slint#L433), [`ui/dr-ui/ui/collections.slint:436`](../ui/dr-ui/ui/collections.slint#L436), [`ui/dr-ui/ui/collections.slint:482`](../ui/dr-ui/ui/collections.slint#L482), [`ui/dr-ui/ui/collections.slint:52`](../ui/dr-ui/ui/collections.slint#L52), [`ui/dr-ui/ui/collections.slint:720`](../ui/dr-ui/ui/collections.slint#L720), [`ui/dr-ui/ui/collections.slint:877`](../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/collections.slint:91`](../ui/dr-ui/ui/collections.slint#L91), [`ui/dr-ui/ui/icons.slint:262`](../ui/dr-ui/ui/icons.slint#L262) | +| FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1653`](../ui/dr-ui/src/library_ui.rs#L1653), [`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:167`](../core/dr-sync-nextcloud/src/desktop_client.rs#L167), [`core/dr-sync-nextcloud/src/desktop_client.rs:30`](../core/dr-sync-nextcloud/src/desktop_client.rs#L30), [`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:158`](../core/dr-sync/src/lib.rs#L158), [`core/dr-sync/src/types.rs:101`](../core/dr-sync/src/types.rs#L101), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`core/dr-types/src/lib.rs:204`](../core/dr-types/src/lib.rs#L204), [`ui/dr-ui/src/activity.rs:1`](../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/collections_ui.rs:4083`](../ui/dr-ui/src/collections_ui.rs#L4083), [`ui/dr-ui/src/collections_ui.rs:785`](../ui/dr-ui/src/collections_ui.rs#L785), [`ui/dr-ui/src/collections_ui.rs:856`](../ui/dr-ui/src/collections_ui.rs#L856), [`ui/dr-ui/src/derived_sync.rs:606`](../ui/dr-ui/src/derived_sync.rs#L606), [`ui/dr-ui/src/derived_sync.rs:826`](../ui/dr-ui/src/derived_sync.rs#L826), [`ui/dr-ui/src/library.rs:1003`](../ui/dr-ui/src/library.rs#L1003), [`ui/dr-ui/src/library.rs:2001`](../ui/dr-ui/src/library.rs#L2001), [`ui/dr-ui/src/library.rs:2091`](../ui/dr-ui/src/library.rs#L2091), [`ui/dr-ui/src/library.rs:3661`](../ui/dr-ui/src/library.rs#L3661), [`ui/dr-ui/src/library.rs:4170`](../ui/dr-ui/src/library.rs#L4170), [`ui/dr-ui/src/library_ui.rs:1424`](../ui/dr-ui/src/library_ui.rs#L1424), [`ui/dr-ui/src/library_ui.rs:1497`](../ui/dr-ui/src/library_ui.rs#L1497), [`ui/dr-ui/src/library_ui.rs:1696`](../ui/dr-ui/src/library_ui.rs#L1696), [`ui/dr-ui/src/remote.rs:40`](../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/ui/collections.slint:272`](../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:877`](../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/icons.slint:262`](../ui/dr-ui/ui/icons.slint#L262) | | 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:105`](../core/dr-sync-nextcloud/src/lib.rs#L105), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:4050`](../ui/dr-ui/src/library.rs#L4050), [`ui/dr-ui/src/library_ui.rs:4230`](../ui/dr-ui/src/library_ui.rs#L4230), [`ui/dr-ui/ui/settings.slint:395`](../ui/dr-ui/ui/settings.slint#L395) | -| 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:206`](../core/dr-types/src/settings.rs#L206), [`ui/dr-ui/src/import.rs:1`](../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:97`](../ui/dr-ui/src/import.rs#L97), [`ui/dr-ui/src/import_ui.rs:1`](../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1427`](../ui/dr-ui/src/lib.rs#L1427), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | -| 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:122`](../ui/dr-ui/src/import.rs#L122), [`ui/dr-ui/src/import.rs:336`](../ui/dr-ui/src/import.rs#L336), [`ui/dr-ui/src/import.rs:584`](../ui/dr-ui/src/import.rs#L584), [`ui/dr-ui/src/import.rs:97`](../ui/dr-ui/src/import.rs#L97), [`ui/dr-ui/src/import_ui.rs:1`](../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1427`](../ui/dr-ui/src/lib.rs#L1427) | -| FR-NC-8 | [`core/dr-catalog/src/rating.rs:204`](../core/dr-catalog/src/rating.rs#L204), [`core/dr-catalog/src/rating.rs:66`](../core/dr-catalog/src/rating.rs#L66), [`core/dr-catalog/src/rating.rs:900`](../core/dr-catalog/src/rating.rs#L900), [`core/dr-catalog/src/schema.rs:172`](../core/dr-catalog/src/schema.rs#L172), [`core/dr-pipeline/src/sidecar.rs:122`](../core/dr-pipeline/src/sidecar.rs#L122), [`core/dr-pipeline/src/sidecar.rs:2770`](../core/dr-pipeline/src/sidecar.rs#L2770), [`core/dr-pipeline/src/sidecar.rs:621`](../core/dr-pipeline/src/sidecar.rs#L621), [`core/dr-pipeline/src/sidecar.rs:651`](../core/dr-pipeline/src/sidecar.rs#L651), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2269`](../ui/dr-ui/src/lib.rs#L2269), [`ui/dr-ui/src/library.rs:1045`](../ui/dr-ui/src/library.rs#L1045), [`ui/dr-ui/src/library.rs:2310`](../ui/dr-ui/src/library.rs#L2310), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500), [`ui/dr-ui/src/library.rs:7529`](../ui/dr-ui/src/library.rs#L7529), [`ui/dr-ui/src/library.rs:755`](../ui/dr-ui/src/library.rs#L755), [`ui/dr-ui/src/library_ui.rs:548`](../ui/dr-ui/src/library_ui.rs#L548), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:335`](../ui/dr-ui/src/presets.rs#L335) | -| FR-NC-9 | [`core/dr-catalog/src/merge.rs:1`](../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/rating.rs:204`](../core/dr-catalog/src/rating.rs#L204), [`core/dr-catalog/src/rating.rs:66`](../core/dr-catalog/src/rating.rs#L66), [`core/dr-catalog/src/rating.rs:900`](../core/dr-catalog/src/rating.rs#L900), [`core/dr-catalog/src/schema.rs:172`](../core/dr-catalog/src/schema.rs#L172), [`core/dr-catalog/src/schema.rs:550`](../core/dr-catalog/src/schema.rs#L550), [`core/dr-catalog/src/schema.rs:801`](../core/dr-catalog/src/schema.rs#L801), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:160`](../core/dr-pipeline/src/sidecar.rs#L160), [`core/dr-pipeline/src/sidecar.rs:187`](../core/dr-pipeline/src/sidecar.rs#L187), [`core/dr-pipeline/src/sidecar.rs:2536`](../core/dr-pipeline/src/sidecar.rs#L2536), [`core/dr-pipeline/src/sidecar.rs:2770`](../core/dr-pipeline/src/sidecar.rs#L2770), [`core/dr-pipeline/src/sidecar.rs:356`](../core/dr-pipeline/src/sidecar.rs#L356), [`core/dr-pipeline/src/sidecar.rs:454`](../core/dr-pipeline/src/sidecar.rs#L454), [`core/dr-pipeline/src/sidecar.rs:621`](../core/dr-pipeline/src/sidecar.rs#L621), [`core/dr-pipeline/src/sidecar.rs:651`](../core/dr-pipeline/src/sidecar.rs#L651), [`core/dr-pipeline/src/spot.rs:245`](../core/dr-pipeline/src/spot.rs#L245), [`core/dr-pipeline/tests/mask_sidecar.rs:1075`](../core/dr-pipeline/tests/mask_sidecar.rs#L1075), [`core/dr-pipeline/tests/spot_sidecar.rs:1`](../core/dr-pipeline/tests/spot_sidecar.rs#L1), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:45`](../core/dr-sync/src/scan.rs#L45), [`core/dr-sync/src/scan.rs:912`](../core/dr-sync/src/scan.rs#L912), [`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), [`ui/dr-ui/src/derived_sync.rs:585`](../ui/dr-ui/src/derived_sync.rs#L585), [`ui/dr-ui/src/library.rs:1045`](../ui/dr-ui/src/library.rs#L1045), [`ui/dr-ui/src/library.rs:1065`](../ui/dr-ui/src/library.rs#L1065), [`ui/dr-ui/src/library.rs:1376`](../ui/dr-ui/src/library.rs#L1376), [`ui/dr-ui/src/library.rs:1411`](../ui/dr-ui/src/library.rs#L1411), [`ui/dr-ui/src/library.rs:2310`](../ui/dr-ui/src/library.rs#L2310), [`ui/dr-ui/src/library.rs:7361`](../ui/dr-ui/src/library.rs#L7361), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7529`](../ui/dr-ui/src/library.rs#L7529), [`ui/dr-ui/src/library.rs:755`](../ui/dr-ui/src/library.rs#L755), [`ui/dr-ui/src/library.rs:899`](../ui/dr-ui/src/library.rs#L899), [`ui/dr-ui/src/library_ui.rs:1259`](../ui/dr-ui/src/library_ui.rs#L1259), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:335`](../ui/dr-ui/src/presets.rs#L335) | -| FR-PLAT-AND-2 | [`core/dr-catalog/src/walk.rs:1022`](../core/dr-catalog/src/walk.rs#L1022), [`core/dr-catalog/src/walk.rs:435`](../core/dr-catalog/src/walk.rs#L435), [`core/dr-sync-folder/src/lib.rs:242`](../core/dr-sync-folder/src/lib.rs#L242), [`core/dr-sync-folder/src/tests.rs:51`](../core/dr-sync-folder/src/tests.rs#L51), [`core/dr-sync/src/error.rs:113`](../core/dr-sync/src/error.rs#L113), [`core/dr-sync/src/error.rs:195`](../core/dr-sync/src/error.rs#L195), [`core/dr-sync/src/scan.rs:200`](../core/dr-sync/src/scan.rs#L200), [`core/dr-sync/src/scan.rs:505`](../core/dr-sync/src/scan.rs#L505), [`core/dr-sync/src/scan.rs:531`](../core/dr-sync/src/scan.rs#L531), [`core/dr-sync/src/scan.rs:560`](../core/dr-sync/src/scan.rs#L560), [`ui/dr-ui/src/library.rs:1276`](../ui/dr-ui/src/library.rs#L1276), [`ui/dr-ui/src/library.rs:1329`](../ui/dr-ui/src/library.rs#L1329), [`ui/dr-ui/src/library.rs:1360`](../ui/dr-ui/src/library.rs#L1360), [`ui/dr-ui/src/library.rs:1727`](../ui/dr-ui/src/library.rs#L1727), [`ui/dr-ui/src/library_ui.rs:1235`](../ui/dr-ui/src/library_ui.rs#L1235), [`ui/dr-ui/src/library_ui.rs:1326`](../ui/dr-ui/src/library_ui.rs#L1326), [`ui/dr-ui/src/library_ui.rs:1925`](../ui/dr-ui/src/library_ui.rs#L1925), [`ui/dr-ui/src/library_ui.rs:325`](../ui/dr-ui/src/library_ui.rs#L325), [`ui/dr-ui/src/library_ui.rs:517`](../ui/dr-ui/src/library_ui.rs#L517) | +| 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:105`](../core/dr-sync-nextcloud/src/lib.rs#L105), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:4050`](../ui/dr-ui/src/library.rs#L4050), [`ui/dr-ui/src/library_ui.rs:4253`](../ui/dr-ui/src/library_ui.rs#L4253), [`ui/dr-ui/ui/settings.slint:402`](../ui/dr-ui/ui/settings.slint#L402) | +| 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:297`](../core/dr-types/src/settings.rs#L297), [`ui/dr-ui/src/import.rs:1`](../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:97`](../ui/dr-ui/src/import.rs#L97), [`ui/dr-ui/src/import_ui.rs:1`](../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1428`](../ui/dr-ui/src/lib.rs#L1428), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | +| 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:122`](../ui/dr-ui/src/import.rs#L122), [`ui/dr-ui/src/import.rs:336`](../ui/dr-ui/src/import.rs#L336), [`ui/dr-ui/src/import.rs:584`](../ui/dr-ui/src/import.rs#L584), [`ui/dr-ui/src/import.rs:97`](../ui/dr-ui/src/import.rs#L97), [`ui/dr-ui/src/import_ui.rs:1`](../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1428`](../ui/dr-ui/src/lib.rs#L1428) | +| FR-NC-8 | [`core/dr-catalog/src/rating.rs:204`](../core/dr-catalog/src/rating.rs#L204), [`core/dr-catalog/src/rating.rs:66`](../core/dr-catalog/src/rating.rs#L66), [`core/dr-catalog/src/rating.rs:900`](../core/dr-catalog/src/rating.rs#L900), [`core/dr-catalog/src/schema.rs:172`](../core/dr-catalog/src/schema.rs#L172), [`core/dr-pipeline/src/sidecar.rs:122`](../core/dr-pipeline/src/sidecar.rs#L122), [`core/dr-pipeline/src/sidecar.rs:2770`](../core/dr-pipeline/src/sidecar.rs#L2770), [`core/dr-pipeline/src/sidecar.rs:621`](../core/dr-pipeline/src/sidecar.rs#L621), [`core/dr-pipeline/src/sidecar.rs:651`](../core/dr-pipeline/src/sidecar.rs#L651), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2272`](../ui/dr-ui/src/lib.rs#L2272), [`ui/dr-ui/src/library.rs:1045`](../ui/dr-ui/src/library.rs#L1045), [`ui/dr-ui/src/library.rs:2310`](../ui/dr-ui/src/library.rs#L2310), [`ui/dr-ui/src/library.rs:500`](../ui/dr-ui/src/library.rs#L500), [`ui/dr-ui/src/library.rs:7532`](../ui/dr-ui/src/library.rs#L7532), [`ui/dr-ui/src/library.rs:755`](../ui/dr-ui/src/library.rs#L755), [`ui/dr-ui/src/library_ui.rs:570`](../ui/dr-ui/src/library_ui.rs#L570), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:335`](../ui/dr-ui/src/presets.rs#L335) | +| FR-NC-9 | [`core/dr-catalog/src/merge.rs:1`](../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/rating.rs:204`](../core/dr-catalog/src/rating.rs#L204), [`core/dr-catalog/src/rating.rs:66`](../core/dr-catalog/src/rating.rs#L66), [`core/dr-catalog/src/rating.rs:900`](../core/dr-catalog/src/rating.rs#L900), [`core/dr-catalog/src/schema.rs:172`](../core/dr-catalog/src/schema.rs#L172), [`core/dr-catalog/src/schema.rs:550`](../core/dr-catalog/src/schema.rs#L550), [`core/dr-catalog/src/schema.rs:801`](../core/dr-catalog/src/schema.rs#L801), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:160`](../core/dr-pipeline/src/sidecar.rs#L160), [`core/dr-pipeline/src/sidecar.rs:187`](../core/dr-pipeline/src/sidecar.rs#L187), [`core/dr-pipeline/src/sidecar.rs:2536`](../core/dr-pipeline/src/sidecar.rs#L2536), [`core/dr-pipeline/src/sidecar.rs:2770`](../core/dr-pipeline/src/sidecar.rs#L2770), [`core/dr-pipeline/src/sidecar.rs:356`](../core/dr-pipeline/src/sidecar.rs#L356), [`core/dr-pipeline/src/sidecar.rs:454`](../core/dr-pipeline/src/sidecar.rs#L454), [`core/dr-pipeline/src/sidecar.rs:621`](../core/dr-pipeline/src/sidecar.rs#L621), [`core/dr-pipeline/src/sidecar.rs:651`](../core/dr-pipeline/src/sidecar.rs#L651), [`core/dr-pipeline/src/spot.rs:245`](../core/dr-pipeline/src/spot.rs#L245), [`core/dr-pipeline/tests/mask_sidecar.rs:1075`](../core/dr-pipeline/tests/mask_sidecar.rs#L1075), [`core/dr-pipeline/tests/spot_sidecar.rs:1`](../core/dr-pipeline/tests/spot_sidecar.rs#L1), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:45`](../core/dr-sync/src/scan.rs#L45), [`core/dr-sync/src/scan.rs:912`](../core/dr-sync/src/scan.rs#L912), [`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), [`ui/dr-ui/src/derived_sync.rs:606`](../ui/dr-ui/src/derived_sync.rs#L606), [`ui/dr-ui/src/library.rs:1045`](../ui/dr-ui/src/library.rs#L1045), [`ui/dr-ui/src/library.rs:1065`](../ui/dr-ui/src/library.rs#L1065), [`ui/dr-ui/src/library.rs:1376`](../ui/dr-ui/src/library.rs#L1376), [`ui/dr-ui/src/library.rs:1411`](../ui/dr-ui/src/library.rs#L1411), [`ui/dr-ui/src/library.rs:2310`](../ui/dr-ui/src/library.rs#L2310), [`ui/dr-ui/src/library.rs:7364`](../ui/dr-ui/src/library.rs#L7364), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7532`](../ui/dr-ui/src/library.rs#L7532), [`ui/dr-ui/src/library.rs:755`](../ui/dr-ui/src/library.rs#L755), [`ui/dr-ui/src/library.rs:899`](../ui/dr-ui/src/library.rs#L899), [`ui/dr-ui/src/library_ui.rs:1281`](../ui/dr-ui/src/library_ui.rs#L1281), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:335`](../ui/dr-ui/src/presets.rs#L335) | +| FR-PLAT-AND-2 | [`core/dr-catalog/src/walk.rs:1022`](../core/dr-catalog/src/walk.rs#L1022), [`core/dr-catalog/src/walk.rs:435`](../core/dr-catalog/src/walk.rs#L435), [`core/dr-sync-folder/src/lib.rs:242`](../core/dr-sync-folder/src/lib.rs#L242), [`core/dr-sync-folder/src/tests.rs:51`](../core/dr-sync-folder/src/tests.rs#L51), [`core/dr-sync/src/error.rs:113`](../core/dr-sync/src/error.rs#L113), [`core/dr-sync/src/error.rs:195`](../core/dr-sync/src/error.rs#L195), [`core/dr-sync/src/scan.rs:200`](../core/dr-sync/src/scan.rs#L200), [`core/dr-sync/src/scan.rs:505`](../core/dr-sync/src/scan.rs#L505), [`core/dr-sync/src/scan.rs:531`](../core/dr-sync/src/scan.rs#L531), [`core/dr-sync/src/scan.rs:560`](../core/dr-sync/src/scan.rs#L560), [`ui/dr-ui/src/library.rs:1276`](../ui/dr-ui/src/library.rs#L1276), [`ui/dr-ui/src/library.rs:1329`](../ui/dr-ui/src/library.rs#L1329), [`ui/dr-ui/src/library.rs:1360`](../ui/dr-ui/src/library.rs#L1360), [`ui/dr-ui/src/library.rs:1727`](../ui/dr-ui/src/library.rs#L1727), [`ui/dr-ui/src/library_ui.rs:1257`](../ui/dr-ui/src/library_ui.rs#L1257), [`ui/dr-ui/src/library_ui.rs:1348`](../ui/dr-ui/src/library_ui.rs#L1348), [`ui/dr-ui/src/library_ui.rs:1947`](../ui/dr-ui/src/library_ui.rs#L1947), [`ui/dr-ui/src/library_ui.rs:325`](../ui/dr-ui/src/library_ui.rs#L325), [`ui/dr-ui/src/library_ui.rs:539`](../ui/dr-ui/src/library_ui.rs#L539) | | FR-PLAT-AND-3 | [`core/dr-catalog/src/jobs.rs:1`](../core/dr-catalog/src/jobs.rs#L1), [`core/dr-catalog/src/runner.rs:1`](../core/dr-catalog/src/runner.rs#L1) | | FR-PLAT-AND-4 | [`core/dr-catalog/src/runner.rs:1`](../core/dr-catalog/src/runner.rs#L1) | -| FR-PLAT-AND-5 | [`apps/darkroom-android/src/lib.rs:166`](../apps/darkroom-android/src/lib.rs#L166), [`core/dr-gpu/src/adjust.rs:1029`](../core/dr-gpu/src/adjust.rs#L1029), [`core/dr-gpu/src/detail.rs:161`](../core/dr-gpu/src/detail.rs#L161), [`core/dr-gpu/src/detail.rs:547`](../core/dr-gpu/src/detail.rs#L547), [`core/dr-gpu/tests/detail_stage.rs:417`](../core/dr-gpu/tests/detail_stage.rs#L417), [`ui/dr-ui/src/develop.rs:4469`](../ui/dr-ui/src/develop.rs#L4469), [`ui/dr-ui/src/identity_ui.rs:121`](../ui/dr-ui/src/identity_ui.rs#L121), [`ui/dr-ui/src/lib.rs:1246`](../ui/dr-ui/src/lib.rs#L1246), [`ui/dr-ui/src/lib.rs:1695`](../ui/dr-ui/src/lib.rs#L1695), [`ui/dr-ui/src/memory.rs:163`](../ui/dr-ui/src/memory.rs#L163), [`ui/dr-ui/src/memory.rs:1`](../ui/dr-ui/src/memory.rs#L1) | -| FR-PLAT-AND-6 | [`apps/darkroom-android/src/lib.rs:388`](../apps/darkroom-android/src/lib.rs#L388) | +| FR-PLAT-AND-5 | [`apps/darkroom-android/src/lib.rs:166`](../apps/darkroom-android/src/lib.rs#L166), [`core/dr-gpu/src/adjust.rs:1029`](../core/dr-gpu/src/adjust.rs#L1029), [`core/dr-gpu/src/detail.rs:161`](../core/dr-gpu/src/detail.rs#L161), [`core/dr-gpu/src/detail.rs:547`](../core/dr-gpu/src/detail.rs#L547), [`core/dr-gpu/tests/detail_stage.rs:417`](../core/dr-gpu/tests/detail_stage.rs#L417), [`ui/dr-ui/src/develop.rs:4469`](../ui/dr-ui/src/develop.rs#L4469), [`ui/dr-ui/src/identity_ui.rs:125`](../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:1246`](../ui/dr-ui/src/lib.rs#L1246), [`ui/dr-ui/src/lib.rs:1698`](../ui/dr-ui/src/lib.rs#L1698), [`ui/dr-ui/src/memory.rs:163`](../ui/dr-ui/src/memory.rs#L163), [`ui/dr-ui/src/memory.rs:1`](../ui/dr-ui/src/memory.rs#L1) | +| FR-PLAT-AND-6 | [`apps/darkroom-android/src/lib.rs:397`](../apps/darkroom-android/src/lib.rs#L397) | | FR-PLAT-LIN-1 | [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`platform/dr-plat/src/storage.rs:344`](../platform/dr-plat/src/storage.rs#L344), [`ui/dr-ui/src/lib.rs:1122`](../ui/dr-ui/src/lib.rs#L1122), [`ui/dr-ui/src/preset_store.rs:1`](../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1) | | FR-PLAT-LIN-2 | [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../platform/dr-plat/src/display/x11.rs#L1) | | FR-PLG-2 | [`core/dr-pipeline/src/declared/decl.rs:1`](../core/dr-pipeline/src/declared/decl.rs#L1), [`core/dr-pipeline/src/declared/expr.rs:152`](../core/dr-pipeline/src/declared/expr.rs#L152), [`core/dr-pipeline/src/declared/expr.rs:1`](../core/dr-pipeline/src/declared/expr.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:1`](../core/dr-pipeline/src/declared/mod.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:82`](../core/dr-pipeline/src/declared/mod.rs#L82), [`core/dr-pipeline/src/descriptor.rs:15`](../core/dr-pipeline/src/descriptor.rs#L15), [`core/dr-pipeline/src/descriptor.rs:734`](../core/dr-pipeline/src/descriptor.rs#L734), [`core/dr-pipeline/src/operation.rs:232`](../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/tests/declared_parity.rs:1`](../core/dr-pipeline/tests/declared_parity.rs#L1), [`core/dr-pipeline/tests/declared_parity.rs:240`](../core/dr-pipeline/tests/declared_parity.rs#L240), [`core/dr-pipeline/tests/declared_parity.rs:305`](../core/dr-pipeline/tests/declared_parity.rs#L305), [`core/dr-pipeline/tests/declared_parity.rs:358`](../core/dr-pipeline/tests/declared_parity.rs#L358), [`core/dr-pipeline/tests/declared_parity.rs:418`](../core/dr-pipeline/tests/declared_parity.rs#L418) | @@ -126,27 +126,27 @@ _None._ | FR-RAW-3 | [`core/dr-decode/src/lib.rs:139`](../core/dr-decode/src/lib.rs#L139), [`core/dr-decode/src/lib.rs:506`](../core/dr-decode/src/lib.rs#L506), [`core/dr-decode/src/locate.rs:1366`](../core/dr-decode/src/locate.rs#L1366) | | FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1), [`ui/dr-ui/src/lib.rs:261`](../ui/dr-ui/src/lib.rs#L261) | | FR-RAW-5 | [`core/dr-decode/src/lib.rs:167`](../core/dr-decode/src/lib.rs#L167), [`core/dr-gpu/src/demosaic.rs:34`](../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:602`](../core/dr-gpu/src/demosaic.rs#L602), [`core/dr-gpu/src/demosaic.rs:681`](../core/dr-gpu/src/demosaic.rs#L681), [`core/dr-gpu/src/demosaic.rs:805`](../core/dr-gpu/src/demosaic.rs#L805) | -| FR-UI-1 | [`core/dr-types/src/settings.rs:1166`](../core/dr-types/src/settings.rs#L1166), [`core/dr-types/src/settings.rs:321`](../core/dr-types/src/settings.rs#L321), [`core/dr-types/src/settings.rs:341`](../core/dr-types/src/settings.rs#L341), [`ui/dr-ui/src/lib.rs:101`](../ui/dr-ui/src/lib.rs#L101), [`ui/dr-ui/src/lib.rs:116`](../ui/dr-ui/src/lib.rs#L116), [`ui/dr-ui/src/lib.rs:138`](../ui/dr-ui/src/lib.rs#L138), [`ui/dr-ui/src/lib.rs:2514`](../ui/dr-ui/src/lib.rs#L2514), [`ui/dr-ui/src/lib.rs:3665`](../ui/dr-ui/src/lib.rs#L3665), [`ui/dr-ui/src/lib.rs:3684`](../ui/dr-ui/src/lib.rs#L3684), [`ui/dr-ui/src/lib.rs:3711`](../ui/dr-ui/src/lib.rs#L3711), [`ui/dr-ui/src/lib.rs:3762`](../ui/dr-ui/src/lib.rs#L3762), [`ui/dr-ui/src/lib.rs:3795`](../ui/dr-ui/src/lib.rs#L3795), [`ui/dr-ui/src/masks_ui.rs:1423`](../ui/dr-ui/src/masks_ui.rs#L1423), [`ui/dr-ui/src/settings_ui.rs:160`](../ui/dr-ui/src/settings_ui.rs#L160), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2691`](../ui/dr-ui/ui/app.slint#L2691), [`ui/dr-ui/ui/app.slint:842`](../ui/dr-ui/ui/app.slint#L842), [`ui/dr-ui/ui/app.slint:940`](../ui/dr-ui/ui/app.slint#L940), [`ui/dr-ui/ui/identity.slint:219`](../ui/dr-ui/ui/identity.slint#L219), [`ui/dr-ui/ui/library.slint:1076`](../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:104`](../ui/dr-ui/ui/settings.slint#L104), [`ui/dr-ui/ui/settings.slint:565`](../ui/dr-ui/ui/settings.slint#L565), [`ui/dr-ui/ui/toolrail.slint:156`](../ui/dr-ui/ui/toolrail.slint#L156), [`ui/dr-ui/ui/toolrail.slint:89`](../ui/dr-ui/ui/toolrail.slint#L89) | -| FR-UI-2 | [`ui/dr-ui/src/collections_ui.rs:116`](../ui/dr-ui/src/collections_ui.rs#L116), [`ui/dr-ui/src/collections_ui.rs:1197`](../ui/dr-ui/src/collections_ui.rs#L1197), [`ui/dr-ui/src/collections_ui.rs:1207`](../ui/dr-ui/src/collections_ui.rs#L1207), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1704`](../ui/dr-ui/src/collections_ui.rs#L1704), [`ui/dr-ui/src/collections_ui.rs:1721`](../ui/dr-ui/src/collections_ui.rs#L1721), [`ui/dr-ui/src/collections_ui.rs:1973`](../ui/dr-ui/src/collections_ui.rs#L1973), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:3596`](../ui/dr-ui/src/collections_ui.rs#L3596), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:101`](../ui/dr-ui/src/lib.rs#L101), [`ui/dr-ui/src/library_ui.rs:6451`](../ui/dr-ui/src/library_ui.rs#L6451), [`ui/dr-ui/src/library_ui.rs:7778`](../ui/dr-ui/src/library_ui.rs#L7778), [`ui/dr-ui/ui/app.slint:580`](../ui/dr-ui/ui/app.slint#L580), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:68`](../ui/dr-ui/ui/app.slint#L68), [`ui/dr-ui/ui/app.slint:924`](../ui/dr-ui/ui/app.slint#L924), [`ui/dr-ui/ui/controls.slint:625`](../ui/dr-ui/ui/controls.slint#L625), [`ui/dr-ui/ui/gestures.slint:1`](../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1287`](../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1391`](../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2581`](../ui/dr-ui/ui/library.slint#L2581), [`ui/dr-ui/ui/library.slint:4316`](../ui/dr-ui/ui/library.slint#L4316), [`ui/dr-ui/ui/library.slint:965`](../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998), [`ui/dr-ui/ui/presets.slint:19`](../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/settings.slint:118`](../ui/dr-ui/ui/settings.slint#L118) | -| FR-UI-3 | [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:414`](../ui/dr-ui/src/collections_ui.rs#L414), [`ui/dr-ui/src/collections_ui.rs:427`](../ui/dr-ui/src/collections_ui.rs#L427), [`ui/dr-ui/src/develop.rs:2826`](../ui/dr-ui/src/develop.rs#L2826), [`ui/dr-ui/src/develop.rs:3195`](../ui/dr-ui/src/develop.rs#L3195), [`ui/dr-ui/src/library_ui.rs:5480`](../ui/dr-ui/src/library_ui.rs#L5480), [`ui/dr-ui/src/masks_ui.rs:1515`](../ui/dr-ui/src/masks_ui.rs#L1515), [`ui/dr-ui/src/masks_ui.rs:1537`](../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/masks_ui.rs:338`](../ui/dr-ui/src/masks_ui.rs#L338), [`ui/dr-ui/src/spots_ui.rs:19`](../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/ui/app.slint:2256`](../ui/dr-ui/ui/app.slint#L2256), [`ui/dr-ui/ui/collections.slint:1127`](../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:4`](../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/collections.slint:75`](../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/collections.slint:877`](../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/masks.slint:1167`](../ui/dr-ui/ui/masks.slint#L1167), [`ui/dr-ui/ui/widgets.slint:71`](../ui/dr-ui/ui/widgets.slint#L71) | -| FR-UI-4 | [`tools/traceability/src/gestures.rs:1`](../tools/traceability/src/gestures.rs#L1), [`ui/dr-ui/src/collections_ui.rs:116`](../ui/dr-ui/src/collections_ui.rs#L116), [`ui/dr-ui/src/collections_ui.rs:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1197`](../ui/dr-ui/src/collections_ui.rs#L1197), [`ui/dr-ui/src/collections_ui.rs:1207`](../ui/dr-ui/src/collections_ui.rs#L1207), [`ui/dr-ui/src/collections_ui.rs:126`](../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1704`](../ui/dr-ui/src/collections_ui.rs#L1704), [`ui/dr-ui/src/collections_ui.rs:1721`](../ui/dr-ui/src/collections_ui.rs#L1721), [`ui/dr-ui/src/collections_ui.rs:1837`](../ui/dr-ui/src/collections_ui.rs#L1837), [`ui/dr-ui/src/collections_ui.rs:1973`](../ui/dr-ui/src/collections_ui.rs#L1973), [`ui/dr-ui/src/collections_ui.rs:2000`](../ui/dr-ui/src/collections_ui.rs#L2000), [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2116`](../ui/dr-ui/src/collections_ui.rs#L2116), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:2755`](../ui/dr-ui/src/collections_ui.rs#L2755), [`ui/dr-ui/src/collections_ui.rs:3208`](../ui/dr-ui/src/collections_ui.rs#L3208), [`ui/dr-ui/src/collections_ui.rs:3596`](../ui/dr-ui/src/collections_ui.rs#L3596), [`ui/dr-ui/src/collections_ui.rs:3633`](../ui/dr-ui/src/collections_ui.rs#L3633), [`ui/dr-ui/src/collections_ui.rs:414`](../ui/dr-ui/src/collections_ui.rs#L414), [`ui/dr-ui/src/collections_ui.rs:427`](../ui/dr-ui/src/collections_ui.rs#L427), [`ui/dr-ui/src/collections_ui.rs:514`](../ui/dr-ui/src/collections_ui.rs#L514), [`ui/dr-ui/src/collections_ui.rs:718`](../ui/dr-ui/src/collections_ui.rs#L718), [`ui/dr-ui/src/collections_ui.rs:738`](../ui/dr-ui/src/collections_ui.rs#L738), [`ui/dr-ui/src/develop.rs:5240`](../ui/dr-ui/src/develop.rs#L5240), [`ui/dr-ui/src/develop.rs:5265`](../ui/dr-ui/src/develop.rs#L5265), [`ui/dr-ui/src/develop.rs:5276`](../ui/dr-ui/src/develop.rs#L5276), [`ui/dr-ui/src/develop.rs:5290`](../ui/dr-ui/src/develop.rs#L5290), [`ui/dr-ui/src/develop.rs:6362`](../ui/dr-ui/src/develop.rs#L6362), [`ui/dr-ui/src/develop.rs:6393`](../ui/dr-ui/src/develop.rs#L6393), [`ui/dr-ui/src/develop.rs:6414`](../ui/dr-ui/src/develop.rs#L6414), [`ui/dr-ui/src/gesture_book.rs:3`](../ui/dr-ui/src/gesture_book.rs#L3), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:1772`](../ui/dr-ui/src/lib.rs#L1772), [`ui/dr-ui/src/lib.rs:2181`](../ui/dr-ui/src/lib.rs#L2181), [`ui/dr-ui/src/lib.rs:2421`](../ui/dr-ui/src/lib.rs#L2421), [`ui/dr-ui/src/lib.rs:3015`](../ui/dr-ui/src/lib.rs#L3015), [`ui/dr-ui/src/lib.rs:3899`](../ui/dr-ui/src/lib.rs#L3899), [`ui/dr-ui/src/lib.rs:447`](../ui/dr-ui/src/lib.rs#L447), [`ui/dr-ui/src/lib.rs:476`](../ui/dr-ui/src/lib.rs#L476), [`ui/dr-ui/src/library_ui.rs:5480`](../ui/dr-ui/src/library_ui.rs#L5480), [`ui/dr-ui/src/library_ui.rs:5492`](../ui/dr-ui/src/library_ui.rs#L5492), [`ui/dr-ui/src/library_ui.rs:5562`](../ui/dr-ui/src/library_ui.rs#L5562), [`ui/dr-ui/src/library_ui.rs:5672`](../ui/dr-ui/src/library_ui.rs#L5672), [`ui/dr-ui/src/library_ui.rs:5700`](../ui/dr-ui/src/library_ui.rs#L5700), [`ui/dr-ui/src/library_ui.rs:6584`](../ui/dr-ui/src/library_ui.rs#L6584), [`ui/dr-ui/ui/app.slint:160`](../ui/dr-ui/ui/app.slint#L160), [`ui/dr-ui/ui/app.slint:1951`](../ui/dr-ui/ui/app.slint#L1951), [`ui/dr-ui/ui/app.slint:2073`](../ui/dr-ui/ui/app.slint#L2073), [`ui/dr-ui/ui/app.slint:2480`](../ui/dr-ui/ui/app.slint#L2480), [`ui/dr-ui/ui/app.slint:2591`](../ui/dr-ui/ui/app.slint#L2591), [`ui/dr-ui/ui/app.slint:3062`](../ui/dr-ui/ui/app.slint#L3062), [`ui/dr-ui/ui/app.slint:556`](../ui/dr-ui/ui/app.slint#L556), [`ui/dr-ui/ui/app.slint:585`](../ui/dr-ui/ui/app.slint#L585), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:694`](../ui/dr-ui/ui/app.slint#L694), [`ui/dr-ui/ui/collections.slint:75`](../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/gestures.slint:1`](../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1053`](../ui/dr-ui/ui/library.slint#L1053), [`ui/dr-ui/ui/library.slint:1262`](../ui/dr-ui/ui/library.slint#L1262), [`ui/dr-ui/ui/library.slint:1287`](../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1327`](../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:1384`](../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1391`](../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2581`](../ui/dr-ui/ui/library.slint#L2581), [`ui/dr-ui/ui/library.slint:4179`](../ui/dr-ui/ui/library.slint#L4179), [`ui/dr-ui/ui/library.slint:4257`](../ui/dr-ui/ui/library.slint#L4257), [`ui/dr-ui/ui/library.slint:4316`](../ui/dr-ui/ui/library.slint#L4316), [`ui/dr-ui/ui/library.slint:965`](../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:992`](../ui/dr-ui/ui/library.slint#L992), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | -| FR-UI-5 | [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/lib.rs:3060`](../ui/dr-ui/src/lib.rs#L3060), [`ui/dr-ui/src/lib.rs:3859`](../ui/dr-ui/src/lib.rs#L3859), [`ui/dr-ui/src/lib.rs:4050`](../ui/dr-ui/src/lib.rs#L4050), [`ui/dr-ui/src/masks_ui.rs:1470`](../ui/dr-ui/src/masks_ui.rs#L1470), [`ui/dr-ui/ui/app.slint:2440`](../ui/dr-ui/ui/app.slint#L2440), [`ui/dr-ui/ui/app.slint:2480`](../ui/dr-ui/ui/app.slint#L2480), [`ui/dr-ui/ui/collections.slint:4`](../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/session.slint:75`](../ui/dr-ui/ui/session.slint#L75) | +| FR-UI-1 | [`core/dr-types/src/settings.rs:1257`](../core/dr-types/src/settings.rs#L1257), [`core/dr-types/src/settings.rs:412`](../core/dr-types/src/settings.rs#L412), [`core/dr-types/src/settings.rs:432`](../core/dr-types/src/settings.rs#L432), [`ui/dr-ui/src/lib.rs:101`](../ui/dr-ui/src/lib.rs#L101), [`ui/dr-ui/src/lib.rs:116`](../ui/dr-ui/src/lib.rs#L116), [`ui/dr-ui/src/lib.rs:138`](../ui/dr-ui/src/lib.rs#L138), [`ui/dr-ui/src/lib.rs:2517`](../ui/dr-ui/src/lib.rs#L2517), [`ui/dr-ui/src/lib.rs:3698`](../ui/dr-ui/src/lib.rs#L3698), [`ui/dr-ui/src/lib.rs:3717`](../ui/dr-ui/src/lib.rs#L3717), [`ui/dr-ui/src/lib.rs:3744`](../ui/dr-ui/src/lib.rs#L3744), [`ui/dr-ui/src/lib.rs:3795`](../ui/dr-ui/src/lib.rs#L3795), [`ui/dr-ui/src/lib.rs:3828`](../ui/dr-ui/src/lib.rs#L3828), [`ui/dr-ui/src/masks_ui.rs:1423`](../ui/dr-ui/src/masks_ui.rs#L1423), [`ui/dr-ui/src/settings_ui.rs:160`](../ui/dr-ui/src/settings_ui.rs#L160), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2700`](../ui/dr-ui/ui/app.slint#L2700), [`ui/dr-ui/ui/app.slint:842`](../ui/dr-ui/ui/app.slint#L842), [`ui/dr-ui/ui/app.slint:946`](../ui/dr-ui/ui/app.slint#L946), [`ui/dr-ui/ui/identity.slint:219`](../ui/dr-ui/ui/identity.slint#L219), [`ui/dr-ui/ui/library.slint:1076`](../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:111`](../ui/dr-ui/ui/settings.slint#L111), [`ui/dr-ui/ui/settings.slint:591`](../ui/dr-ui/ui/settings.slint#L591), [`ui/dr-ui/ui/toolrail.slint:156`](../ui/dr-ui/ui/toolrail.slint#L156), [`ui/dr-ui/ui/toolrail.slint:89`](../ui/dr-ui/ui/toolrail.slint#L89) | +| FR-UI-2 | [`ui/dr-ui/src/collections_ui.rs:116`](../ui/dr-ui/src/collections_ui.rs#L116), [`ui/dr-ui/src/collections_ui.rs:1197`](../ui/dr-ui/src/collections_ui.rs#L1197), [`ui/dr-ui/src/collections_ui.rs:1207`](../ui/dr-ui/src/collections_ui.rs#L1207), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1704`](../ui/dr-ui/src/collections_ui.rs#L1704), [`ui/dr-ui/src/collections_ui.rs:1721`](../ui/dr-ui/src/collections_ui.rs#L1721), [`ui/dr-ui/src/collections_ui.rs:1973`](../ui/dr-ui/src/collections_ui.rs#L1973), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:3596`](../ui/dr-ui/src/collections_ui.rs#L3596), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:101`](../ui/dr-ui/src/lib.rs#L101), [`ui/dr-ui/src/library_ui.rs:6474`](../ui/dr-ui/src/library_ui.rs#L6474), [`ui/dr-ui/src/library_ui.rs:7801`](../ui/dr-ui/src/library_ui.rs#L7801), [`ui/dr-ui/ui/app.slint:580`](../ui/dr-ui/ui/app.slint#L580), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:68`](../ui/dr-ui/ui/app.slint#L68), [`ui/dr-ui/ui/app.slint:930`](../ui/dr-ui/ui/app.slint#L930), [`ui/dr-ui/ui/controls.slint:625`](../ui/dr-ui/ui/controls.slint#L625), [`ui/dr-ui/ui/gestures.slint:1`](../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1287`](../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1391`](../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2581`](../ui/dr-ui/ui/library.slint#L2581), [`ui/dr-ui/ui/library.slint:4316`](../ui/dr-ui/ui/library.slint#L4316), [`ui/dr-ui/ui/library.slint:965`](../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998), [`ui/dr-ui/ui/presets.slint:19`](../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/settings.slint:125`](../ui/dr-ui/ui/settings.slint#L125) | +| FR-UI-3 | [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:414`](../ui/dr-ui/src/collections_ui.rs#L414), [`ui/dr-ui/src/collections_ui.rs:427`](../ui/dr-ui/src/collections_ui.rs#L427), [`ui/dr-ui/src/develop.rs:2826`](../ui/dr-ui/src/develop.rs#L2826), [`ui/dr-ui/src/develop.rs:3195`](../ui/dr-ui/src/develop.rs#L3195), [`ui/dr-ui/src/library_ui.rs:5503`](../ui/dr-ui/src/library_ui.rs#L5503), [`ui/dr-ui/src/masks_ui.rs:1515`](../ui/dr-ui/src/masks_ui.rs#L1515), [`ui/dr-ui/src/masks_ui.rs:1537`](../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/masks_ui.rs:338`](../ui/dr-ui/src/masks_ui.rs#L338), [`ui/dr-ui/src/spots_ui.rs:19`](../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/ui/app.slint:2265`](../ui/dr-ui/ui/app.slint#L2265), [`ui/dr-ui/ui/collections.slint:1127`](../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:4`](../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/collections.slint:75`](../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/collections.slint:877`](../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/masks.slint:1167`](../ui/dr-ui/ui/masks.slint#L1167), [`ui/dr-ui/ui/widgets.slint:71`](../ui/dr-ui/ui/widgets.slint#L71) | +| FR-UI-4 | [`tools/traceability/src/gestures.rs:1`](../tools/traceability/src/gestures.rs#L1), [`ui/dr-ui/src/collections_ui.rs:116`](../ui/dr-ui/src/collections_ui.rs#L116), [`ui/dr-ui/src/collections_ui.rs:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1197`](../ui/dr-ui/src/collections_ui.rs#L1197), [`ui/dr-ui/src/collections_ui.rs:1207`](../ui/dr-ui/src/collections_ui.rs#L1207), [`ui/dr-ui/src/collections_ui.rs:126`](../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1704`](../ui/dr-ui/src/collections_ui.rs#L1704), [`ui/dr-ui/src/collections_ui.rs:1721`](../ui/dr-ui/src/collections_ui.rs#L1721), [`ui/dr-ui/src/collections_ui.rs:1837`](../ui/dr-ui/src/collections_ui.rs#L1837), [`ui/dr-ui/src/collections_ui.rs:1973`](../ui/dr-ui/src/collections_ui.rs#L1973), [`ui/dr-ui/src/collections_ui.rs:2000`](../ui/dr-ui/src/collections_ui.rs#L2000), [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2116`](../ui/dr-ui/src/collections_ui.rs#L2116), [`ui/dr-ui/src/collections_ui.rs:2701`](../ui/dr-ui/src/collections_ui.rs#L2701), [`ui/dr-ui/src/collections_ui.rs:2755`](../ui/dr-ui/src/collections_ui.rs#L2755), [`ui/dr-ui/src/collections_ui.rs:3208`](../ui/dr-ui/src/collections_ui.rs#L3208), [`ui/dr-ui/src/collections_ui.rs:3596`](../ui/dr-ui/src/collections_ui.rs#L3596), [`ui/dr-ui/src/collections_ui.rs:3633`](../ui/dr-ui/src/collections_ui.rs#L3633), [`ui/dr-ui/src/collections_ui.rs:414`](../ui/dr-ui/src/collections_ui.rs#L414), [`ui/dr-ui/src/collections_ui.rs:427`](../ui/dr-ui/src/collections_ui.rs#L427), [`ui/dr-ui/src/collections_ui.rs:514`](../ui/dr-ui/src/collections_ui.rs#L514), [`ui/dr-ui/src/collections_ui.rs:718`](../ui/dr-ui/src/collections_ui.rs#L718), [`ui/dr-ui/src/collections_ui.rs:738`](../ui/dr-ui/src/collections_ui.rs#L738), [`ui/dr-ui/src/develop.rs:5240`](../ui/dr-ui/src/develop.rs#L5240), [`ui/dr-ui/src/develop.rs:5265`](../ui/dr-ui/src/develop.rs#L5265), [`ui/dr-ui/src/develop.rs:5276`](../ui/dr-ui/src/develop.rs#L5276), [`ui/dr-ui/src/develop.rs:5290`](../ui/dr-ui/src/develop.rs#L5290), [`ui/dr-ui/src/develop.rs:6362`](../ui/dr-ui/src/develop.rs#L6362), [`ui/dr-ui/src/develop.rs:6393`](../ui/dr-ui/src/develop.rs#L6393), [`ui/dr-ui/src/develop.rs:6414`](../ui/dr-ui/src/develop.rs#L6414), [`ui/dr-ui/src/gesture_book.rs:3`](../ui/dr-ui/src/gesture_book.rs#L3), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:1775`](../ui/dr-ui/src/lib.rs#L1775), [`ui/dr-ui/src/lib.rs:2184`](../ui/dr-ui/src/lib.rs#L2184), [`ui/dr-ui/src/lib.rs:2424`](../ui/dr-ui/src/lib.rs#L2424), [`ui/dr-ui/src/lib.rs:3018`](../ui/dr-ui/src/lib.rs#L3018), [`ui/dr-ui/src/lib.rs:3932`](../ui/dr-ui/src/lib.rs#L3932), [`ui/dr-ui/src/lib.rs:447`](../ui/dr-ui/src/lib.rs#L447), [`ui/dr-ui/src/lib.rs:476`](../ui/dr-ui/src/lib.rs#L476), [`ui/dr-ui/src/library_ui.rs:5503`](../ui/dr-ui/src/library_ui.rs#L5503), [`ui/dr-ui/src/library_ui.rs:5515`](../ui/dr-ui/src/library_ui.rs#L5515), [`ui/dr-ui/src/library_ui.rs:5585`](../ui/dr-ui/src/library_ui.rs#L5585), [`ui/dr-ui/src/library_ui.rs:5695`](../ui/dr-ui/src/library_ui.rs#L5695), [`ui/dr-ui/src/library_ui.rs:5723`](../ui/dr-ui/src/library_ui.rs#L5723), [`ui/dr-ui/src/library_ui.rs:6607`](../ui/dr-ui/src/library_ui.rs#L6607), [`ui/dr-ui/ui/app.slint:160`](../ui/dr-ui/ui/app.slint#L160), [`ui/dr-ui/ui/app.slint:1960`](../ui/dr-ui/ui/app.slint#L1960), [`ui/dr-ui/ui/app.slint:2082`](../ui/dr-ui/ui/app.slint#L2082), [`ui/dr-ui/ui/app.slint:2489`](../ui/dr-ui/ui/app.slint#L2489), [`ui/dr-ui/ui/app.slint:2600`](../ui/dr-ui/ui/app.slint#L2600), [`ui/dr-ui/ui/app.slint:3071`](../ui/dr-ui/ui/app.slint#L3071), [`ui/dr-ui/ui/app.slint:556`](../ui/dr-ui/ui/app.slint#L556), [`ui/dr-ui/ui/app.slint:585`](../ui/dr-ui/ui/app.slint#L585), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:694`](../ui/dr-ui/ui/app.slint#L694), [`ui/dr-ui/ui/collections.slint:75`](../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/gestures.slint:1`](../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1053`](../ui/dr-ui/ui/library.slint#L1053), [`ui/dr-ui/ui/library.slint:1262`](../ui/dr-ui/ui/library.slint#L1262), [`ui/dr-ui/ui/library.slint:1287`](../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1327`](../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:1384`](../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1391`](../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2581`](../ui/dr-ui/ui/library.slint#L2581), [`ui/dr-ui/ui/library.slint:4179`](../ui/dr-ui/ui/library.slint#L4179), [`ui/dr-ui/ui/library.slint:4257`](../ui/dr-ui/ui/library.slint#L4257), [`ui/dr-ui/ui/library.slint:4316`](../ui/dr-ui/ui/library.slint#L4316), [`ui/dr-ui/ui/library.slint:965`](../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:992`](../ui/dr-ui/ui/library.slint#L992), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | +| FR-UI-5 | [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/lib.rs:3063`](../ui/dr-ui/src/lib.rs#L3063), [`ui/dr-ui/src/lib.rs:3892`](../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/lib.rs:4083`](../ui/dr-ui/src/lib.rs#L4083), [`ui/dr-ui/src/masks_ui.rs:1470`](../ui/dr-ui/src/masks_ui.rs#L1470), [`ui/dr-ui/ui/app.slint:2449`](../ui/dr-ui/ui/app.slint#L2449), [`ui/dr-ui/ui/app.slint:2489`](../ui/dr-ui/ui/app.slint#L2489), [`ui/dr-ui/ui/collections.slint:4`](../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/session.slint:75`](../ui/dr-ui/ui/session.slint#L75) | | FR-UI-6 | [`ui/dr-ui/ui/widgets.slint:1`](../ui/dr-ui/ui/widgets.slint#L1) | -| FR-UI-7 | [`core/dr-pipeline/src/descriptor.rs:195`](../core/dr-pipeline/src/descriptor.rs#L195), [`core/dr-pipeline/src/framing.rs:395`](../core/dr-pipeline/src/framing.rs#L395), [`core/dr-types/src/settings.rs:321`](../core/dr-types/src/settings.rs#L321), [`ui/dr-ui/src/develop.rs:1306`](../ui/dr-ui/src/develop.rs#L1306), [`ui/dr-ui/src/lib.rs:3684`](../ui/dr-ui/src/lib.rs#L3684), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2196`](../ui/dr-ui/ui/app.slint#L2196), [`ui/dr-ui/ui/settings.slint:565`](../ui/dr-ui/ui/settings.slint#L565), [`ui/dr-ui/ui/toolrail.slint:89`](../ui/dr-ui/ui/toolrail.slint#L89) | -| FR-UI-8 | [`core/dr-catalog/src/collections.rs:654`](../core/dr-catalog/src/collections.rs#L654), [`core/dr-catalog/src/collections.rs:675`](../core/dr-catalog/src/collections.rs#L675), [`core/dr-types/src/place.rs:1`](../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/derived_sync.rs:188`](../ui/dr-ui/src/derived_sync.rs#L188), [`ui/dr-ui/src/derived_sync.rs:657`](../ui/dr-ui/src/derived_sync.rs#L657), [`ui/dr-ui/src/derived_sync.rs:667`](../ui/dr-ui/src/derived_sync.rs#L667), [`ui/dr-ui/src/derived_sync.rs:749`](../ui/dr-ui/src/derived_sync.rs#L749), [`ui/dr-ui/src/derived_sync.rs:74`](../ui/dr-ui/src/derived_sync.rs#L74), [`ui/dr-ui/src/library.rs:1106`](../ui/dr-ui/src/library.rs#L1106), [`ui/dr-ui/src/library.rs:4723`](../ui/dr-ui/src/library.rs#L4723), [`ui/dr-ui/src/library.rs:5441`](../ui/dr-ui/src/library.rs#L5441), [`ui/dr-ui/src/library.rs:5507`](../ui/dr-ui/src/library.rs#L5507), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2112`](../ui/dr-ui/src/library_ui.rs#L2112), [`ui/dr-ui/src/library_ui.rs:2301`](../ui/dr-ui/src/library_ui.rs#L2301), [`ui/dr-ui/src/library_ui.rs:2318`](../ui/dr-ui/src/library_ui.rs#L2318), [`ui/dr-ui/src/library_ui.rs:2416`](../ui/dr-ui/src/library_ui.rs#L2416), [`ui/dr-ui/src/library_ui.rs:5513`](../ui/dr-ui/src/library_ui.rs#L5513), [`ui/dr-ui/src/library_ui.rs:5553`](../ui/dr-ui/src/library_ui.rs#L5553), [`ui/dr-ui/src/library_ui.rs:5582`](../ui/dr-ui/src/library_ui.rs#L5582), [`ui/dr-ui/src/library_ui.rs:5845`](../ui/dr-ui/src/library_ui.rs#L5845), [`ui/dr-ui/src/library_ui.rs:6068`](../ui/dr-ui/src/library_ui.rs#L6068), [`ui/dr-ui/src/library_ui.rs:6792`](../ui/dr-ui/src/library_ui.rs#L6792), [`ui/dr-ui/src/library_ui.rs:853`](../ui/dr-ui/src/library_ui.rs#L853), [`ui/dr-ui/src/library_ui.rs:886`](../ui/dr-ui/src/library_ui.rs#L886), [`ui/dr-ui/src/library_ui.rs:932`](../ui/dr-ui/src/library_ui.rs#L932), [`ui/dr-ui/src/place.rs:1`](../ui/dr-ui/src/place.rs#L1) | -| NFR-A11Y-2 | [`ui/dr-ui/tests/ui_controls_are_accessible.rs:1`](../ui/dr-ui/tests/ui_controls_are_accessible.rs#L1), [`ui/dr-ui/ui/adjust.slint:171`](../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/app.slint:2591`](../ui/dr-ui/ui/app.slint#L2591), [`ui/dr-ui/ui/app.slint:2629`](../ui/dr-ui/ui/app.slint#L2629) | +| FR-UI-7 | [`core/dr-pipeline/src/descriptor.rs:195`](../core/dr-pipeline/src/descriptor.rs#L195), [`core/dr-pipeline/src/framing.rs:395`](../core/dr-pipeline/src/framing.rs#L395), [`core/dr-types/src/settings.rs:412`](../core/dr-types/src/settings.rs#L412), [`ui/dr-ui/src/develop.rs:1306`](../ui/dr-ui/src/develop.rs#L1306), [`ui/dr-ui/src/lib.rs:3717`](../ui/dr-ui/src/lib.rs#L3717), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2205`](../ui/dr-ui/ui/app.slint#L2205), [`ui/dr-ui/ui/settings.slint:591`](../ui/dr-ui/ui/settings.slint#L591), [`ui/dr-ui/ui/toolrail.slint:89`](../ui/dr-ui/ui/toolrail.slint#L89) | +| FR-UI-8 | [`core/dr-catalog/src/collections.rs:654`](../core/dr-catalog/src/collections.rs#L654), [`core/dr-catalog/src/collections.rs:675`](../core/dr-catalog/src/collections.rs#L675), [`core/dr-types/src/place.rs:1`](../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/derived_sync.rs:208`](../ui/dr-ui/src/derived_sync.rs#L208), [`ui/dr-ui/src/derived_sync.rs:678`](../ui/dr-ui/src/derived_sync.rs#L678), [`ui/dr-ui/src/derived_sync.rs:688`](../ui/dr-ui/src/derived_sync.rs#L688), [`ui/dr-ui/src/derived_sync.rs:74`](../ui/dr-ui/src/derived_sync.rs#L74), [`ui/dr-ui/src/derived_sync.rs:770`](../ui/dr-ui/src/derived_sync.rs#L770), [`ui/dr-ui/src/library.rs:1106`](../ui/dr-ui/src/library.rs#L1106), [`ui/dr-ui/src/library.rs:4726`](../ui/dr-ui/src/library.rs#L4726), [`ui/dr-ui/src/library.rs:5444`](../ui/dr-ui/src/library.rs#L5444), [`ui/dr-ui/src/library.rs:5510`](../ui/dr-ui/src/library.rs#L5510), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2134`](../ui/dr-ui/src/library_ui.rs#L2134), [`ui/dr-ui/src/library_ui.rs:2323`](../ui/dr-ui/src/library_ui.rs#L2323), [`ui/dr-ui/src/library_ui.rs:2340`](../ui/dr-ui/src/library_ui.rs#L2340), [`ui/dr-ui/src/library_ui.rs:2438`](../ui/dr-ui/src/library_ui.rs#L2438), [`ui/dr-ui/src/library_ui.rs:5536`](../ui/dr-ui/src/library_ui.rs#L5536), [`ui/dr-ui/src/library_ui.rs:5576`](../ui/dr-ui/src/library_ui.rs#L5576), [`ui/dr-ui/src/library_ui.rs:5605`](../ui/dr-ui/src/library_ui.rs#L5605), [`ui/dr-ui/src/library_ui.rs:5868`](../ui/dr-ui/src/library_ui.rs#L5868), [`ui/dr-ui/src/library_ui.rs:6091`](../ui/dr-ui/src/library_ui.rs#L6091), [`ui/dr-ui/src/library_ui.rs:6815`](../ui/dr-ui/src/library_ui.rs#L6815), [`ui/dr-ui/src/library_ui.rs:875`](../ui/dr-ui/src/library_ui.rs#L875), [`ui/dr-ui/src/library_ui.rs:908`](../ui/dr-ui/src/library_ui.rs#L908), [`ui/dr-ui/src/library_ui.rs:954`](../ui/dr-ui/src/library_ui.rs#L954), [`ui/dr-ui/src/place.rs:1`](../ui/dr-ui/src/place.rs#L1) | +| NFR-A11Y-2 | [`ui/dr-ui/tests/ui_controls_are_accessible.rs:1`](../ui/dr-ui/tests/ui_controls_are_accessible.rs#L1), [`ui/dr-ui/ui/adjust.slint:171`](../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/app.slint:2600`](../ui/dr-ui/ui/app.slint#L2600), [`ui/dr-ui/ui/app.slint:2638`](../ui/dr-ui/ui/app.slint#L2638) | | NFR-A11Y-3 | [`ui/dr-ui/src/histogram.rs:356`](../ui/dr-ui/src/histogram.rs#L356), [`ui/dr-ui/ui/histogram.slint:137`](../ui/dr-ui/ui/histogram.slint#L137), [`ui/dr-ui/ui/library.slint:761`](../ui/dr-ui/ui/library.slint#L761), [`ui/dr-ui/ui/library.slint:909`](../ui/dr-ui/ui/library.slint#L909), [`ui/dr-ui/ui/peaking.slint:1`](../ui/dr-ui/ui/peaking.slint#L1) | | NFR-ARCH-2 | [`core/dr-catalog/src/jobs.rs:1`](../core/dr-catalog/src/jobs.rs#L1), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/library.rs:3451`](../ui/dr-ui/src/library.rs#L3451) | -| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1809`](../ui/dr-ui/src/export.rs#L1809), [`ui/dr-ui/src/export.rs:1836`](../ui/dr-ui/src/export.rs#L1836), [`ui/dr-ui/src/export.rs:412`](../ui/dr-ui/src/export.rs#L412), [`ui/dr-ui/src/export.rs:438`](../ui/dr-ui/src/export.rs#L438), [`ui/dr-ui/src/lib.rs:2650`](../ui/dr-ui/src/lib.rs#L2650), [`ui/dr-ui/ui/app.slint:1080`](../ui/dr-ui/ui/app.slint#L1080), [`ui/dr-ui/ui/library.slint:4278`](../ui/dr-ui/ui/library.slint#L4278) | +| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1809`](../ui/dr-ui/src/export.rs#L1809), [`ui/dr-ui/src/export.rs:1836`](../ui/dr-ui/src/export.rs#L1836), [`ui/dr-ui/src/export.rs:412`](../ui/dr-ui/src/export.rs#L412), [`ui/dr-ui/src/export.rs:438`](../ui/dr-ui/src/export.rs#L438), [`ui/dr-ui/src/lib.rs:2653`](../ui/dr-ui/src/lib.rs#L2653), [`ui/dr-ui/ui/app.slint:1086`](../ui/dr-ui/ui/app.slint#L1086), [`ui/dr-ui/ui/library.slint:4278`](../ui/dr-ui/ui/library.slint#L4278) | | NFR-ARCH-4 | [`core/dr-catalog/src/error.rs:1`](../core/dr-catalog/src/error.rs#L1), [`core/dr-export/src/error.rs:1`](../core/dr-export/src/error.rs#L1), [`core/dr-thumbs/src/error.rs:1`](../core/dr-thumbs/src/error.rs#L1), [`core/dr-xmp/src/lib.rs:798`](../core/dr-xmp/src/lib.rs#L798), [`platform/dr-plat/src/storage.rs:148`](../platform/dr-plat/src/storage.rs#L148), [`ui/dr-ui/src/export.rs:514`](../ui/dr-ui/src/export.rs#L514) | | NFR-OPS-1 | [`platform/dr-plat/src/diagnostics.rs:1`](../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/state.rs:1`](../platform/dr-plat/src/state.rs#L1) | | NFR-OPS-2 | [`platform/dr-plat/src/crash.rs:1`](../platform/dr-plat/src/crash.rs#L1) | | NFR-OPS-3 | [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1) | | NFR-P1 | [`core/dr-catalog/src/lib.rs:1`](../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/scan.rs:1`](../core/dr-catalog/src/scan.rs#L1), [`core/dr-catalog/src/walk.rs:162`](../core/dr-catalog/src/walk.rs#L162), [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`tools/bench/src/catalog_open.rs:1`](../tools/bench/src/catalog_open.rs#L1) | | NFR-P13 | [`core/dr-decode/src/preview.rs:121`](../core/dr-decode/src/preview.rs#L121) | -| NFR-P14 | [`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/shaders/focus_peak.wgsl:1`](../core/dr-gpu/src/shaders/focus_peak.wgsl#L1), [`ui/dr-ui/src/develop.rs:4186`](../ui/dr-ui/src/develop.rs#L4186), [`ui/dr-ui/src/lib.rs:1966`](../ui/dr-ui/src/lib.rs#L1966) | +| NFR-P14 | [`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/shaders/focus_peak.wgsl:1`](../core/dr-gpu/src/shaders/focus_peak.wgsl#L1), [`ui/dr-ui/src/develop.rs:4186`](../ui/dr-ui/src/develop.rs#L4186), [`ui/dr-ui/src/lib.rs:1969`](../ui/dr-ui/src/lib.rs#L1969) | | NFR-P3 | [`tools/bench/src/thumbnails.rs:1`](../tools/bench/src/thumbnails.rs#L1) | -| NFR-P5 | [`core/dr-catalog/src/schema.rs:374`](../core/dr-catalog/src/schema.rs#L374), [`ui/dr-ui/src/library.rs:4830`](../ui/dr-ui/src/library.rs#L4830), [`ui/dr-ui/src/library.rs:5943`](../ui/dr-ui/src/library.rs#L5943), [`ui/dr-ui/src/library_ui.rs:4720`](../ui/dr-ui/src/library_ui.rs#L4720), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | +| NFR-P5 | [`core/dr-catalog/src/schema.rs:374`](../core/dr-catalog/src/schema.rs#L374), [`ui/dr-ui/src/library.rs:4833`](../ui/dr-ui/src/library.rs#L4833), [`ui/dr-ui/src/library.rs:5946`](../ui/dr-ui/src/library.rs#L5946), [`ui/dr-ui/src/library_ui.rs:4743`](../ui/dr-ui/src/library_ui.rs#L4743), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | | NFR-P9 | [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/export.rs:992`](../ui/dr-ui/src/export.rs#L992), [`ui/dr-ui/src/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1) | | NFR-PORT-1 | [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:272`](../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../core/dr-types/src/lib.rs#L305), [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`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:287`](../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:344`](../platform/dr-plat/src/storage.rs#L344), [`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) | | NFR-PORT-2 | [`core/dr-gpu/src/lib.rs:1`](../core/dr-gpu/src/lib.rs#L1) | @@ -157,7 +157,7 @@ _None._ | NFR-R6 | [`core/dr-catalog/src/error.rs:1`](../core/dr-catalog/src/error.rs#L1), [`core/dr-catalog/src/lib.rs:255`](../core/dr-catalog/src/lib.rs#L255), [`core/dr-catalog/src/recovery.rs:1`](../core/dr-catalog/src/recovery.rs#L1) | | 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:1029`](../core/dr-gpu/src/adjust.rs#L1029), [`core/dr-pipeline/src/history.rs:86`](../core/dr-pipeline/src/history.rs#L86), [`ui/dr-ui/src/develop.rs:4469`](../ui/dr-ui/src/develop.rs#L4469), [`ui/dr-ui/src/identity_ui.rs:121`](../ui/dr-ui/src/identity_ui.rs#L121), [`ui/dr-ui/src/lib.rs:93`](../ui/dr-ui/src/lib.rs#L93), [`ui/dr-ui/src/memory.rs:1`](../ui/dr-ui/src/memory.rs#L1) | +| NFR-RES-1 | [`core/dr-gpu/src/adjust.rs:1029`](../core/dr-gpu/src/adjust.rs#L1029), [`core/dr-pipeline/src/history.rs:86`](../core/dr-pipeline/src/history.rs#L86), [`ui/dr-ui/src/develop.rs:4469`](../ui/dr-ui/src/develop.rs#L4469), [`ui/dr-ui/src/identity_ui.rs:125`](../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:93`](../ui/dr-ui/src/lib.rs#L93), [`ui/dr-ui/src/memory.rs:1`](../ui/dr-ui/src/memory.rs#L1) | | NFR-RES-2 | [`ui/dr-ui/src/faces.rs:347`](../ui/dr-ui/src/faces.rs#L347), [`ui/dr-ui/src/library.rs:3451`](../ui/dr-ui/src/library.rs#L3451), [`ui/dr-ui/src/library.rs:3668`](../ui/dr-ui/src/library.rs#L3668) | | 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:858`](../core/dr-catalog/src/schema.rs#L858), [`core/dr-gpu/src/lib.rs:93`](../core/dr-gpu/src/lib.rs#L93), [`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:376`](../core/dr-thumbs/src/lib.rs#L376), [`ui/dr-ui/src/library.rs:3292`](../ui/dr-ui/src/library.rs#L3292) | | NFR-SEC-1 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1) | diff --git a/models/face/README.md b/models/face/README.md index bcd975a..14b284b 100644 --- a/models/face/README.md +++ b/models/face/README.md @@ -1,7 +1,7 @@ # Face models -The shape-fixed SCRFD detector and ArcFace/MobileFaceNet embedder, in LFS. One copy, packaged by -every platform: +The shape-fixed SCRFD detectors and the ArcFace/MobileFaceNet embedder, in LFS. One copy, packaged +by every platform: | Platform | How it ships | Where it lands | |---|---|---| @@ -11,18 +11,25 @@ every platform: `library::face_models` searches the account's own directory, then the shared user directory, then `$XDG_DATA_DIRS` — so a pair the user placed by hand always outranks the packaged one. - scrfd_500m_640.onnx 2.5 MB + scrfd_500m_640.onnx 2.5 MB "Fast" in settings — what every library was indexed with until 0.12 + scrfd_2.5g_640.onnx 3.3 MB "Balanced" — 14% more faces for 12% more time (faces.md §12.3) + scrfd_10g_640.onnx 17 MB "Thorough" — a further 12% for 3× the time arcface_mbf_b1.onnx 13 MB +Which detector runs is a per-device setting (`FaceSettings::detector`); all three are installed so +the choice exists on every platform. Each is its own `faces.model_id`, so changing it re-indexes. + **A clone without git-lfs gets a ~130-byte pointer where each model should be.** Both packagers check for exactly that and refuse, rather than shipping the pointer and failing inside tract on the user's machine. Fix it with `git lfs pull`. -These are not what InsightFace ships. They came from `buffalo_sc.zip` and `buffalo_s.zip` on the -InsightFace v0.7 release with their input dimensions pinned, because tract cannot parse either graph -while they are dynamic: +These are not what InsightFace ships. They came from `buffalo_sc.zip`, `buffalo_m.zip`, `buffalo_l.zip` +and `buffalo_s.zip` on the InsightFace v0.7 release with their input dimensions pinned, because tract +cannot parse any of the graphs while they are dynamic: ./tools/fix-face-model-shapes.sh det_500m.onnx models/face/scrfd_500m_640.onnx --input input.1=1,3,640,640 + ./tools/fix-face-model-shapes.sh det_2.5g.onnx models/face/scrfd_2.5g_640.onnx --input input.1=1,3,640,640 + ./tools/fix-face-model-shapes.sh det_10g.onnx models/face/scrfd_10g_640.onnx --input input.1=1,3,640,640 ./tools/fix-face-model-shapes.sh w600k_mbf.onnx models/face/arcface_mbf_b1.onnx --dim None=1 The weights carry a non-commercial research-only grant. They are here because this is a private diff --git a/models/face/scrfd_10g_640.onnx b/models/face/scrfd_10g_640.onnx new file mode 100644 index 0000000..e3768f6 --- /dev/null +++ b/models/face/scrfd_10g_640.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66d85c1759c845d25588c5ba4c79e7ca25e4f3e6cdccad91287a223db588e0cb +size 16923827 diff --git a/models/face/scrfd_2.5g_640.onnx b/models/face/scrfd_2.5g_640.onnx new file mode 100644 index 0000000..cb07d78 --- /dev/null +++ b/models/face/scrfd_2.5g_640.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31da314896f5784e57ca909eed5fae72f0ac5484d151aa94f6dae86f724caa33 +size 3292009 diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index 303767a..20bbf43 100644 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -61,7 +61,7 @@ package() { # These live in LFS; a checkout without `git lfs pull` has ~130-byte # pointers here. Installing one produces a package whose face indexing # fails inside the graph loader on the user's machine, so refuse instead. - for _m in scrfd_500m_640.onnx arcface_mbf_b1.onnx; do + for _m in scrfd_500m_640.onnx scrfd_2.5g_640.onnx scrfd_10g_640.onnx arcface_mbf_b1.onnx; do _src="models/face/${_m}" if [[ "$(stat -c%s "${_src}")" -lt 100000 ]]; then echo "error: ${_m} is an LFS pointer, not a model — run: git lfs pull" >&2 diff --git a/packaging/flatpak/paris.tourolle.darkroom.yml b/packaging/flatpak/paris.tourolle.darkroom.yml index 23dec17..7d3aae9 100644 --- a/packaging/flatpak/paris.tourolle.darkroom.yml +++ b/packaging/flatpak/paris.tourolle.darkroom.yml @@ -157,7 +157,7 @@ modules: # inside the graph loader on the user's machine. Refuse instead, with the # command that fixes it. - | - for m in scrfd_500m_640.onnx arcface_mbf_b1.onnx; do + for m in scrfd_500m_640.onnx scrfd_2.5g_640.onnx scrfd_10g_640.onnx arcface_mbf_b1.onnx; do if [ "$(stat -c%s "models/face/$m")" -lt 100000 ]; then echo "error: $m is an LFS pointer, not a model — run: git lfs pull" >&2 exit 1 diff --git a/tools/fix-face-model-shapes.sh b/tools/fix-face-model-shapes.sh index 49acf9d..654f54b 100755 --- a/tools/fix-face-model-shapes.sh +++ b/tools/fix-face-model-shapes.sh @@ -7,6 +7,8 @@ # The two the face pipeline needs, verified 2026-08-26 (docs/faces.md §12 M1): # # ... det_500m.onnx scrfd_500m_640.onnx --input input.1=1,3,640,640 +# ... det_2.5g.onnx scrfd_2.5g_640.onnx --input input.1=1,3,640,640 +# ... det_10g.onnx scrfd_10g_640.onnx --input input.1=1,3,640,640 # ... w600k_mbf.onnx arcface_mbf_b1.onnx --dim None=1 # # ## Why this exists diff --git a/ui/dr-ui/src/derived_sync.rs b/ui/dr-ui/src/derived_sync.rs index db03059..2efd6b4 100644 --- a/ui/dr-ui/src/derived_sync.rs +++ b/ui/dr-ui/src/derived_sync.rs @@ -113,6 +113,11 @@ pub fn spawn_sync( catalog_path: PathBuf, place_path: PathBuf, scratch: PathBuf, + // TRACES: FR-CULL-8 + // Which face pipeline's shards to export and adopt. From the settings + // page by way of the library controller, because a shard written under + // one detector's faces must not be read back as another's. + face_model_id: String, ) -> std::sync::mpsc::Receiver { let (tx, rx) = std::sync::mpsc::channel(); @@ -143,6 +148,7 @@ pub fn spawn_sync( &catalog_path, &place_path, &scratch, + &face_model_id, &tx, ) .await @@ -160,6 +166,10 @@ pub fn spawn_sync( rx } +// Eight, because a sync touches eight distinct things — the same reason +// `spawn_face_sweep` carries the allow: bundling them into a struct would name +// nothing that exists. +#[allow(clippy::too_many_arguments)] async fn run( backend: &dyn RemoteBackend, root: &str, @@ -167,6 +177,7 @@ async fn run( catalog_path: &Path, place_path: &Path, scratch: &Path, + face_model_id: &str, tx: &std::sync::mpsc::Sender, ) -> Result { let mut report = SyncReport::default(); @@ -180,7 +191,16 @@ async fn run( sync_shards(backend, &base, thumbs_dir, scratch, &mut report).await?; let _ = tx.send(SyncMessage::Status("checking faces…".into())); - sync_face_shards(backend, &base, catalog_path, scratch, &mut report, tx).await?; + sync_face_shards( + backend, + &base, + catalog_path, + scratch, + face_model_id, + &mut report, + tx, + ) + .await?; let _ = tx.send(SyncMessage::Status("checking collections…".into())); sync_catalog(backend, &base, catalog_path, scratch, &mut report).await?; @@ -361,6 +381,7 @@ async fn sync_face_shards( base: &RemotePath, catalog_path: &Path, scratch: &Path, + face_model_id: &str, report: &mut SyncReport, tx: &std::sync::mpsc::Sender, ) -> Result<(), String> { @@ -382,7 +403,7 @@ async fn sync_face_shards( }; let client = store.client_id().to_string(); - let model = crate::identity_ui::MODEL_ID; + let model = face_model_id; // ---- everything this device has detected, into the shards ------------ if let Ok(catalog) = dr_catalog::Catalog::open(catalog_path) { diff --git a/ui/dr-ui/src/identity_ui.rs b/ui/dr-ui/src/identity_ui.rs index e4e468f..2832da0 100644 --- a/ui/dr-ui/src/identity_ui.rs +++ b/ui/dr-ui/src/identity_ui.rs @@ -21,10 +21,14 @@ use crate::{AppWindow, IdentityFace, IdentityPerson}; /// Which model's faces the screen is looking at. /// -/// A constant for now because exactly one model is supported at a time; it is -/// named rather than inlined because every query in this file is keyed on it, -/// and a library indexed across a model change holds faces from both. -pub const MODEL_ID: &str = "w600k_mbf"; +/// Every query in this file is keyed on it, and a library indexed across a +/// detector change holds faces from both pipelines: the screen shows the one +/// the settings page currently names (`FaceDetector::model_id`), read at each +/// use rather than captured once, because the page can change it while the +/// screen is open. +pub fn model_id(settings: &crate::settings_ui::SettingsController) -> String { + settings.snapshot().faces.detector.model_id().to_string() +} /// Screen state that outlives a single callback. #[derive(Default)] @@ -148,6 +152,7 @@ pub fn refresh( ctl: &Rc, catalog: &Rc>>, store: Option>, + model_id: &str, ) { let borrow = catalog.borrow(); let Some(cat) = borrow.as_ref() else { @@ -156,7 +161,7 @@ pub fn refresh( return; }; - let view = match identity::load_people(cat, MODEL_ID) { + let view = match identity::load_people(cat, model_id) { Ok(v) => v, Err(e) => { log::warn!("identity: reading people: {e}"); @@ -268,7 +273,7 @@ pub fn refresh( window.set_identity_picked(ctl.picked.borrow().len() as i32); drop(borrow); - refresh_coverage(window, catalog, store.as_deref()); + refresh_coverage(window, catalog, store.as_deref(), model_id); // Last, so a portrait cannot delay anything above it. if let Some(store) = store { @@ -379,13 +384,14 @@ pub fn refresh_coverage( window: &AppWindow, catalog: &Rc>>, store: Option<&ThumbStore>, + model_id: &str, ) { let borrow = catalog.borrow(); let (Some(cat), Some(store)) = (borrow.as_ref(), store) else { window.set_identity_coverage(Default::default()); return; }; - match crate::faces::audit(cat, store, MODEL_ID) { + match crate::faces::audit(cat, store, model_id) { Ok(a) => { window.set_identity_coverage(a.summary().into()); // Complete means nothing left to index, not "every image has a @@ -591,8 +597,8 @@ pub fn wire( // a rejection changes two counts — and a model patched by hand would // drift from the catalog in exactly the cases that matter. macro_rules! reload { - ($w:expr, $ctl:expr, $catalog:expr, $store:expr) => { - refresh(&$w, &$ctl, &$catalog, $store()) + ($w:expr, $ctl:expr, $catalog:expr, $store:expr, $settings:expr) => { + refresh(&$w, &$ctl, &$catalog, $store(), &model_id(&$settings)) }; } @@ -601,6 +607,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); let models_present = models.clone(); window.on_identity_open(move || { let Some(w) = weak.upgrade() else { return }; @@ -615,7 +622,7 @@ pub fn wire( // A fact about the filesystem, so it is re-checked on every open // rather than cached: the user may have just put the models there. w.set_identity_model_missing(models_present().is_none()); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -642,6 +649,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_person_picked(move |id| { let Some(w) = weak.upgrade() else { return }; // Before the selection moves: a name typed into the field and never @@ -653,7 +661,7 @@ pub fn wire( // The offer was about the person being navigated away from. Left // up, its "Merge" would fold whoever is selected *now*. clear_merge_offer(&w, &ctl); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); reset_name_field(&w); }); } @@ -663,6 +671,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_rename(move |name| { let Some(w) = weak.upgrade() else { return }; let Some(person) = ctl.selected.get() else { @@ -697,7 +706,7 @@ pub fn wire( Err(e) => log::warn!("identity: looking for a namesake: {e}"), } } - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); // `rename` trims; the field should show what was actually stored // rather than the spacing the user happened to type. reset_name_field(&w); @@ -714,6 +723,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_merge_accept(move || { let Some(w) = weak.upgrade() else { return }; let (Some(target), Some(source)) = (ctl.merge_offer.get(), ctl.selected.get()) else { @@ -733,7 +743,7 @@ pub fn wire( } } clear_merge_offer(&w, &ctl); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); reset_name_field(&w); }); } @@ -767,6 +777,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_confirm_face(move |id| { let Some(w) = weak.upgrade() else { return }; let Some(person) = ctl.selected.get() else { @@ -777,7 +788,7 @@ pub fn wire( log::warn!("identity: confirm: {e}"); } } - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -786,6 +797,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_reject_face(move |id| { let Some(w) = weak.upgrade() else { return }; let Some(person) = ctl.selected.get() else { @@ -796,7 +808,7 @@ pub fn wire( log::warn!("identity: reject: {e}"); } } - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -827,6 +839,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_confirm_all(move || { let Some(w) = weak.upgrade() else { return }; let Some(person) = ctl.selected.get() else { @@ -838,7 +851,7 @@ pub fn wire( Err(e) => log::warn!("identity: confirm all: {e}"), } } - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -847,6 +860,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_split_picked(move || { let Some(w) = weak.upgrade() else { return }; let Some(person) = ctl.selected.get() else { @@ -870,7 +884,7 @@ pub fn wire( } } ctl.clear_picks(); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -893,7 +907,7 @@ pub fn wire( w.set_identity_previewing(true); *ctl.preview.borrow_mut() = Some(crate::faces::spawn_grouping_preview( catalog_path, - MODEL_ID.to_string(), + model_id(&settings), settings.snapshot().faces, )); @@ -960,7 +974,7 @@ pub fn wire( w.set_identity_regroup_status("regrouping…".into()); *ctl.regroup.borrow_mut() = Some(crate::faces::spawn_recluster( catalog_path, - MODEL_ID.to_string(), + model_id(&settings_for_regroup), settings_for_regroup.snapshot().faces, )); @@ -972,6 +986,7 @@ pub fn wire( let ctl_tick = ctl.clone(); let catalog_tick = catalog.clone(); let store_tick = store.clone(); + let settings_tick = settings_for_regroup.clone(); timer.start( slint::TimerMode::Repeated, Duration::from_millis(100), @@ -1020,7 +1035,13 @@ pub fn wire( // makes new people; a stale cache would draw the // previous pass's faces beside the new groups. ctl_tick.covers.borrow_mut().clear(); - refresh(&w, &ctl_tick, &catalog_tick, store_tick()); + refresh( + &w, + &ctl_tick, + &catalog_tick, + store_tick(), + &model_id(&settings_tick), + ); } }, ); @@ -1036,6 +1057,7 @@ pub fn wire( let models = models.clone(); let paths = paths.clone(); let gpu = gpu.clone(); + let settings_for_sweep = settings.clone(); window.on_identity_index(move || { let Some(w) = weak.upgrade() else { return }; if ctl.sweep.borrow().is_some() { @@ -1066,7 +1088,7 @@ pub fn wire( store_dir, detector, embedder, - MODEL_ID.to_string(), + model_id(&settings_for_sweep), dr_face::DetectOptions::default(), gpu, )); @@ -1083,6 +1105,7 @@ pub fn wire( let ctl_tick = ctl.clone(); let catalog_tick = catalog.clone(); let store_tick = store.clone(); + let settings_tick = settings_for_sweep.clone(); timer.start( slint::TimerMode::Repeated, Duration::from_millis(250), @@ -1165,7 +1188,13 @@ pub fn wire( // grouped, so a sweep ending with an unchanged people // rail is expected. The coverage line is what shows it // worked, and Regroup is the next step. - refresh(&w, &ctl_tick, &catalog_tick, store_tick()); + refresh( + &w, + &ctl_tick, + &catalog_tick, + store_tick(), + &model_id(&settings_tick), + ); } }, ); @@ -1180,6 +1209,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_stop_indexing(move || { let Some(w) = weak.upgrade() else { return }; // Dropping the receiver *is* the cancellation: the worker's next @@ -1190,7 +1220,7 @@ pub fn wire( a.finish("stopped"); } w.set_identity_indexing(false); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -1198,9 +1228,10 @@ pub fn wire( let weak = window.as_weak(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_check_coverage(move || { let Some(w) = weak.upgrade() else { return }; - refresh_coverage(&w, &catalog, store().as_deref()); + refresh_coverage(&w, &catalog, store().as_deref(), &model_id(&settings)); }); } @@ -1209,6 +1240,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_ignore_person(move |id, on| { let Some(w) = weak.upgrade() else { return }; let person = PersonId(id.max(0) as u64); @@ -1225,7 +1257,7 @@ pub fn wire( ctl.selected.set(None); ctl.clear_picks(); } - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -1234,10 +1266,11 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_toggle_show_ignored(move || { let Some(w) = weak.upgrade() else { return }; ctl.show_ignored.set(!ctl.show_ignored.get()); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } @@ -1246,6 +1279,7 @@ pub fn wire( let ctl = ctl.clone(); let catalog = catalog.clone(); let store = store.clone(); + let settings = settings.clone(); window.on_identity_delete_all(move || { let Some(w) = weak.upgrade() else { return }; if let Some(cat) = catalog.borrow().as_ref() { @@ -1257,7 +1291,7 @@ pub fn wire( ctl.selected.set(None); ctl.clear_picks(); ctl.covers.borrow_mut().clear(); - reload!(w, ctl, catalog, store); + reload!(w, ctl, catalog, store, settings); }); } } diff --git a/ui/dr-ui/src/lib.rs b/ui/dr-ui/src/lib.rs index 08c342f..c69a874 100644 --- a/ui/dr-ui/src/lib.rs +++ b/ui/dr-ui/src/lib.rs @@ -1358,9 +1358,10 @@ pub fn run(paths: Vec) -> Result<()> { // and their absence is the ordinary state of a fresh install. { let lib = library.clone(); + let settings = settings.clone(); move || { let conn = lib.session()?; - library::face_models(&conn.account) + library::face_models(&conn.account, settings.snapshot().faces.detector) } }, // The sweep opens its own connection on its own thread, so it @@ -1504,6 +1505,7 @@ pub fn run(paths: Vec) -> Result<()> { library.set_cache_budget(stored.cache.original_budget_bytes); library.set_keep_opened_originals(stored.cache.keep_opened_originals); library.set_timeline_bars(stored.library.timeline_bars); + library.set_face_model_id(stored.faces.detector.model_id()); } // --- the export folder picker ---------------------------------------- @@ -1648,6 +1650,16 @@ pub fn run(paths: Vec) -> Result<()> { } } + // The pipeline the next sync and the next sweep run under, and + // the two lines on the page that describe it: which detector + // file is installed, and how much of the library that + // pipeline has covered — which for a freshly chosen one is + // nothing, and saying so is the point. + lib.set_face_model_id(s.faces.detector.model_id()); + if let Some(w) = weak.upgrade() { + refresh_face_status(&w, &lib, s.faces.detector); + } + // Lowering the ceiling evicts, so the figure beside it has just // changed — leaving the old one would show the cache still over a // limit that was enforced a moment ago. @@ -1662,18 +1674,9 @@ pub fn run(paths: Vec) -> Result<()> { // through here rather than being kept up to date continuously — // they are only ever looked at while this page is on screen. let lib = library.clone(); - let catalog = library.catalog(); let ctl = settings.clone(); move |w: &AppWindow| { - let store = lib.session().and_then(|c| { - dr_thumbs::ThumbStore::open(&library::thumbs_dir(&c.account)).ok() - }); - identity_ui::refresh_coverage(w, &catalog, store.as_ref()); - w.set_identity_model_missing( - lib.session() - .and_then(|c| library::face_models(&c.account)) - .is_none(), - ); + refresh_face_status(w, &lib, ctl.snapshot().faces.detector); // Here rather than at startup, on exactly the reasoning // above: the catalog this reads is opened on a worker now, // so a launch has nothing to describe, and the figure is @@ -3588,6 +3591,36 @@ pub fn run(paths: Vec) -> Result<()> { /// the pinned figure is disk the user asked for and no ceiling will reclaim. /// One combined number would make the budget look wrong whenever a large /// collection was pinned. +/// TRACES: FR-CULL-8 +/// The two face lines on the settings page: whether the chosen detector's file +/// is installed, and how far the chosen pipeline has got through the library. +/// +/// One function because they move together. A detector picked from the list +/// changes which file has to exist *and* which `model_id` the coverage is +/// counted under, and a page that updated one without the other would report +/// "no model installed" over a coverage figure for a different model. +fn refresh_face_status( + window: &AppWindow, + library: &Rc, + detector: dr_types::FaceDetector, +) { + let store = library + .session() + .and_then(|c| dr_thumbs::ThumbStore::open(&library::thumbs_dir(&c.account)).ok()); + identity_ui::refresh_coverage( + window, + &library.catalog(), + store.as_ref(), + detector.model_id(), + ); + window.set_identity_model_missing( + library + .session() + .and_then(|c| library::face_models(&c.account, detector)) + .is_none(), + ); +} + fn describe_cache_usage(library: &Rc) -> String { let Some(cache) = library.cache() else { return String::new(); diff --git a/ui/dr-ui/src/library.rs b/ui/dr-ui/src/library.rs index d2f63a9..af4d121 100644 --- a/ui/dr-ui/src/library.rs +++ b/ui/dr-ui/src/library.rs @@ -4419,12 +4419,15 @@ pub fn shared_face_models_dir() -> PathBuf { /// 3. **The system directories.** Where a package installs them — the Arch /// package puts the pair in `/usr/share/darkroom/models`. Last, so anything /// the user placed themselves outranks what the package shipped. -pub fn face_models(account: &Account) -> Option<(PathBuf, PathBuf)> { - fn pair(dir: PathBuf) -> Option<(PathBuf, PathBuf)> { - let detector = dir.join("scrfd_500m_640.onnx"); +pub fn face_models( + account: &Account, + detector: dr_types::FaceDetector, +) -> Option<(PathBuf, PathBuf)> { + let pair = |dir: PathBuf| { + let detector = dir.join(detector.file_name()); let embedder = dir.join("arcface_mbf_b1.onnx"); (detector.is_file() && embedder.is_file()).then_some((detector, embedder)) - } + }; pair(face_models_dir(account)) .or_else(|| pair(shared_face_models_dir())) .or_else(|| system_face_models_dirs().into_iter().find_map(pair)) diff --git a/ui/dr-ui/src/library_ui.rs b/ui/dr-ui/src/library_ui.rs index 16ffe5a..3771b69 100644 --- a/ui/dr-ui/src/library_ui.rs +++ b/ui/dr-ui/src/library_ui.rs @@ -391,6 +391,15 @@ pub struct LibraryController { /// wrong shape of question. A `Cell` because the page can change it while /// a library is open. timeline_bars: std::cell::Cell, + /// TRACES: FR-CULL-8 + /// Which face pipeline this device indexes with, from the settings page. + /// + /// Held here for the same reason as the two above: the derived sync runs + /// from a sweep's completion and from the Sync button, neither of which + /// has the settings in reach, and the shards it exports and adopts are + /// keyed on this id. A `RefCell` of the id rather than the enum so that + /// nothing here has to know how a detector becomes a model id. + face_model_id: RefCell, /// Where every worker this module starts reports what it is doing. /// /// Held on the controller rather than passed to each function because the @@ -458,9 +467,22 @@ impl LibraryController { dr_types::CacheSettings::default().keep_opened_originals, ), timeline_bars: std::cell::Cell::new(dr_types::LibrarySettings::default().timeline_bars), + face_model_id: RefCell::new(dr_types::FaceDetector::default().model_id().to_string()), }) } + /// TRACES: FR-CULL-8 + /// Which face pipeline the next sync exports and adopts under. + /// + /// Set on every settings edit like the bars above. A sync already running + /// keeps the id it started with, which is right: its shards are half + /// written under that one. + pub fn set_face_model_id(&self, id: &str) { + if *self.face_model_id.borrow() != id { + *self.face_model_id.borrow_mut() = id.to_string(); + } + } + /// TRACES: FR-CAT-6 /// How many bars the capture-time axis is cut into. /// @@ -4016,6 +4038,7 @@ fn start_derived_sync(window: &AppWindow, ctl: &Rc) { catalog_path, library::place_path(&conn.account), scratch, + ctl.face_model_id.borrow().clone(), ); let timer = slint::Timer::default(); diff --git a/ui/dr-ui/src/settings_ui.rs b/ui/dr-ui/src/settings_ui.rs index 8523ffa..57b0934 100644 --- a/ui/dr-ui/src/settings_ui.rs +++ b/ui/dr-ui/src/settings_ui.rs @@ -26,8 +26,8 @@ use std::rc::Rc; use dr_types::settings::budget; use dr_types::{ - CollisionPolicy, ColourSpace, ExportFormat, ExportTarget, GroupNavigation, LibrarySettings, - OutputSharpening, ScreenSize, Settings, SizingMode, + CollisionPolicy, ColourSpace, ExportFormat, ExportTarget, FaceDetector, GroupNavigation, + LibrarySettings, OutputSharpening, ScreenSize, Settings, SizingMode, }; use slint::ComponentHandle; @@ -186,6 +186,24 @@ pub fn render(window: &AppWindow, controller: &SettingsController) { ); window.set_settings_cache_usage(controller.usage_label.borrow().clone().into()); + // --- faces --------------------------------------------------------- + // + // TRACES: FR-CULL-8 + // Labelled from the enum's own order, so the chip index and + // `FaceDetector::ALL` cannot disagree about which detector was picked. + window.set_settings_face_detector_labels(slint::ModelRc::new(slint::VecModel::from( + FaceDetector::ALL + .iter() + .map(|d| slint::SharedString::from(d.label())) + .collect::>(), + ))); + window.set_settings_face_detector_selected( + FaceDetector::ALL + .iter() + .position(|d| *d == s.faces.detector) + .unwrap_or(0) as i32, + ); + // --- library ------------------------------------------------------- // // Labelled here rather than in the page, so the chips cannot offer a count @@ -484,6 +502,28 @@ pub fn wire( }); } + // --- faces --------------------------------------------------------- + // + // TRACES: FR-CULL-8 + // Notified like a budget change, because the effect is outside this + // page: the library controller carries the pipeline id into the next + // sync, and the coverage line under the picker has to be re-counted + // under the new id — which the caller's `on_budget_changed` does. + { + let weak = window.as_weak(); + let ctl = controller.clone(); + let notify = on_budget_changed.clone(); + window.on_settings_face_detector_picked(move |i| { + let Some(w) = weak.upgrade() else { return }; + let Some(choice) = FaceDetector::ALL.get(i as usize).copied() else { + return; + }; + ctl.edit(|s| s.faces.detector = choice); + notify(&ctl.snapshot()); + render(&w, &ctl); + }); + } + // --- export -------------------------------------------------------- { let weak = window.as_weak(); diff --git a/ui/dr-ui/ui/app.slint b/ui/dr-ui/ui/app.slint index 452a86f..d39c2b8 100644 --- a/ui/dr-ui/ui/app.slint +++ b/ui/dr-ui/ui/app.slint @@ -879,6 +879,12 @@ export component AppWindow inherits Window { in property settings-target-selected: 0; in property settings-error: ""; + /// TRACES: FR-CULL-8 + /// Which face detector the indexing pass runs. + in property <[string]> settings-face-detector-labels; + in property settings-face-detector-selected: 0; + callback settings-face-detector-picked(int); + callback settings-group-nav-picked(int); callback settings-format-picked(int); callback settings-quality-changed(int); @@ -1350,6 +1356,9 @@ in property panel-visible: true; face-indexing: root.identity-indexing; face-coverage: root.identity-coverage; face-model-missing: root.identity-model-missing; + face-detector-labels: root.settings-face-detector-labels; + face-detector-selected: root.settings-face-detector-selected; + face-detector-picked(i) => { root.settings-face-detector-picked(i); } library-open: root.library-open; thumbnail-library() => { root.library-thumbnail-all(); } index-faces() => { root.identity-index(); } diff --git a/ui/dr-ui/ui/identity.slint b/ui/dr-ui/ui/identity.slint index 37ab780..4497d83 100644 --- a/ui/dr-ui/ui/identity.slint +++ b/ui/dr-ui/ui/identity.slint @@ -785,7 +785,7 @@ export component IdentityScreen inherits Rectangle { border-radius: Theme.radius; background: Theme.surface-raised; Text { - text: "No face model installed — indexing is off."; + text: "The chosen face detector is not installed — indexing is off."; color: Theme.warn-ink; font-size: Theme.text-sm; } diff --git a/ui/dr-ui/ui/settings.slint b/ui/dr-ui/ui/settings.slint index 7633b74..a4a0477 100644 --- a/ui/dr-ui/ui/settings.slint +++ b/ui/dr-ui/ui/settings.slint @@ -91,6 +91,13 @@ export component SettingsPage inherits Rectangle { /// No model on disk, so the pass cannot run at all. in property face-model-missing: false; callback index-faces(); + /// TRACES: FR-CULL-8 + /// Which detector the pass finds faces with — docs/faces.md §12.3 for + /// what each costs and finds. The choice is a model change: coverage is + /// counted per pipeline, so picking another one starts from nothing. + in property <[string]> face-detector-labels; + in property face-detector-selected: 0; + callback face-detector-picked(int); // --- cache --------------------------------------------------------- in-out property original-budget; @@ -444,13 +451,32 @@ export component SettingsPage inherits Rectangle { wrap: word-wrap; } + if root.library-open: Segmented { + label: "Face detector"; + options: root.face-detector-labels; + selected: root.face-detector-selected; + enabled: !root.face-indexing; + picked(i) => { root.face-detector-picked(i); } + } + + if root.library-open: Caption { + text: "Fast misses the small faces in a group and " + + "mistakes the odd dog for one. Balanced " + + "finds a seventh more for almost the same " + + "time. Thorough finds the most and takes " + + "three times as long. Changing it indexes " + + "the library again; names you have " + + "confirmed are kept."; + wrap: word-wrap; + } + if root.library-open && root.face-coverage != "": Caption { text: root.face-coverage; wrap: word-wrap; } if root.library-open && root.face-model-missing: Caption { - text: "No face model is installed, so this cannot run."; + text: "The chosen detector is not installed, so this cannot run."; wrap: word-wrap; }