From 369eb8fbf07ab2a8e110f3e334d4999163a5564d Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sat, 12 Sep 2026 00:22:26 +0200 Subject: [PATCH] Put the log and the crash records in one file, and show it before writing it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NFR-OPS-1 asks for a diagnostics bundle — the log, the schema version, the GPU and driver, the app version — "with an explicit preview-and-consent step before anything leaves the device". The log and the crash records have existed since August; what did not exist was any way to hand them over that was not `adb pull` and a knowledge of where the state directory is, which on the tablet the requirement was written for is nobody. Nothing here sends anything, and that is the design rather than a gap: crash.rs already says why a transport built ahead of the consent is the shape of thing that gets switched on by default. The bundle writes one text file to a place the user can find, so that they can attach it. That is the moment it leaves, and it is theirs. So the consent guards the write, not a send. Preparing gathers everything into memory and shows what would be written — each section, its size, what was taken out, and where the file would go — and only the second press puts bytes on disk. A user who reads the preview and presses the other button has changed nothing anywhere. The gathered bundle is held between the presses so what is saved is exactly what was shown, not a second gathering that differs by whatever was logged while they were reading. One text file rather than an archive, because a `.txt` opens wherever the user is sitting and pastes into an issue, and because the preview can then be the file rather than a summary of it. Every line goes through the blunter of the two redactions on the way in, whatever the sink already did to it: the log's own rule keeps paths, since a path read over `adb` is context, but a file meant to be attached to a public report by someone who may not read it first is held to the crash record's rule instead. The About page's graphics line gains the driver, which the requirement names and the adapter has always reported. And docs/outstanding.md is corrected on both OPS requirements: it said crash reporting was a log::error! hook and NFR-OPS-1 had nothing behind it, and neither had been true since 2026-08-30. --- core/dr-gpu/src/lib.rs | 14 + docs/gestures.md | 22 +- docs/outstanding.md | 25 +- docs/traceability.md | 106 ++--- platform/dr-plat/src/diagnostics.rs | 1 + platform/dr-plat/src/diagnostics/bundle.rs | 430 +++++++++++++++++++++ ui/dr-ui/src/lib.rs | 73 ++++ ui/dr-ui/ui/app.slint | 15 + ui/dr-ui/ui/settings.slint | 76 ++++ 9 files changed, 688 insertions(+), 74 deletions(-) create mode 100644 platform/dr-plat/src/diagnostics/bundle.rs diff --git a/core/dr-gpu/src/lib.rs b/core/dr-gpu/src/lib.rs index 0d2b392..23d9629 100644 --- a/core/dr-gpu/src/lib.rs +++ b/core/dr-gpu/src/lib.rs @@ -332,6 +332,20 @@ impl GpuContext { pub fn backend(&self) -> wgpu::Backend { self.adapter_info.backend } + + /// TRACES: NFR-OPS-1 + /// The driver, as the adapter reported it, for a diagnostics bundle. + /// Name and version in one string because wgpu splits them by backend + /// and neither half means much without the other. + pub fn driver(&self) -> String { + let info = &self.adapter_info; + match (info.driver.is_empty(), info.driver_info.is_empty()) { + (true, true) => "unknown driver".to_string(), + (false, true) => info.driver.clone(), + (true, false) => info.driver_info.clone(), + (false, false) => format!("{} {}", info.driver, info.driver_info), + } + } } #[repr(C)] diff --git a/docs/gestures.md b/docs/gestures.md index c2778fe..715e9c7 100644 --- a/docs/gestures.md +++ b/docs/gestures.md @@ -25,7 +25,7 @@ Sampling a neutral is the first move of the tonal pass — every colour judgemen Anchored on the fingers' midpoint, and on the pointer, so the gesture reads as magnifying the picture rather than sliding it about. Double-tap is the way to an exact 1:1; this is the way to everything in between. -`ui/dr-ui/ui/app.slint:1950` +`ui/dr-ui/ui/app.slint:1965` ### Move a magnified photograph about @@ -34,7 +34,7 @@ Anchored on the fingers' midpoint, and on the pointer, so the gesture reads as m Only once there is something outside the viewport to reach, which is why the cursor becomes a hand exactly then. The view is clamped to the frame: panning past the edge would show undefined area beside the photograph, and that reads as a rendering fault rather than as the end of the picture. -`ui/dr-ui/ui/app.slint:2041` +`ui/dr-ui/ui/app.slint:2056` ### Paint a mask by hand @@ -43,7 +43,7 @@ Only once there is something outside the viewport to reach, which is why the cur A model's mask stops inside a shoulder and leaks into the hair, and no single edge control fixes two errors that go opposite ways. The whole stroke is one step in the history, so taking a mark back costs one press however long it took to make. -`ui/dr-ui/ui/app.slint:2128` +`ui/dr-ui/ui/app.slint:2143` ### Take back the last change @@ -53,7 +53,7 @@ A model's mask stops inside a shoulder and leaks into the hair, and no single ed A whole drag is one step, so undo takes back a decision rather than a frame of a gesture. The list is there because arriving six steps back costs what arriving from one does. -`ui/dr-ui/ui/app.slint:2349` +`ui/dr-ui/ui/app.slint:2364` ### Do it again after taking it back @@ -61,7 +61,7 @@ A whole drag is one step, so undo takes back a decision rather than a frame of a - **Pointer** — Click it, or press Redo in the History header - **Keyboard** — Ctrl+Shift+Z -`ui/dr-ui/ui/app.slint:2362` +`ui/dr-ui/ui/app.slint:2377` ### Copy the settings from this photograph @@ -71,7 +71,7 @@ A whole drag is one step, so undo takes back a decision rather than a frame of a The panel is the copy that has to work: a tablet has no modifier key to hold and no menu bar to hang the action from. The shortcut is an accelerator for a control that is on screen either way. -`ui/dr-ui/ui/app.slint:2395` +`ui/dr-ui/ui/app.slint:2410` ### Paste the settings onto this photograph @@ -81,7 +81,7 @@ The panel is the copy that has to work: a tablet has no modifier key to hold and The button names what would be pasted — "3 adjustments", and whether the crop is coming with it — which the shortcut cannot say. Both paste the same scope. -`ui/dr-ui/ui/app.slint:2407` +`ui/dr-ui/ui/app.slint:2422` ### Change which group of adjustments is on screen @@ -91,7 +91,7 @@ The button names what would be pasted — "3 adjustments", and whether the crop The groups are whatever the operation set declares itself to be about, so there are as many as the pipeline has and no key can be assigned to one of them by name. Stepping is the binding that survives a node being added. -`ui/dr-ui/ui/app.slint:2435` +`ui/dr-ui/ui/app.slint:2450` ### Look at the photograph at 1:1 @@ -101,7 +101,7 @@ The groups are whatever the operation set declares itself to be about, so there Noise reduction and capture sharpening are judgements about single pixels, and a fitted view averages several of the file's into each one on screen — so the frame looks softer than it is and the correction goes too far. The point and the magnification survive opening the next photograph, which is what makes checking the same eye across forty portraits forty keystrokes rather than forty pans. -`ui/dr-ui/ui/app.slint:2470` +`ui/dr-ui/ui/app.slint:2485` ### Move to the next or previous photograph @@ -111,7 +111,7 @@ Noise reduction and capture sharpening are judgements about single pixels, and a The edit on screen is saved on the way out, so stepping through a folder is as much a departure as going back to the grid and loses nothing. -`ui/dr-ui/ui/app.slint:2522` +`ui/dr-ui/ui/app.slint:2537` ### See the photograph before you edited it @@ -121,7 +121,7 @@ The edit on screen is saved on the way out, so stepping through a folder is as m Held rather than toggled, and no split screen: a split halves the working image on the tablet the column was sized for, and the comparison photographers describe making is a flick back and forth. It takes no history step, so checking whether a frame is overcooked costs nothing to undo afterwards. -`ui/dr-ui/ui/app.slint:2646` +`ui/dr-ui/ui/app.slint:2661` ### Put one control back to its default diff --git a/docs/outstanding.md b/docs/outstanding.md index 2ec0e2b..62b0a38 100644 --- a/docs/outstanding.md +++ b/docs/outstanding.md @@ -244,11 +244,14 @@ requirement singles out are missing: whether `shaderFloat16` and 16-bit storage one it flags as jeopardising R1), minimum RAM, minimum desktop Mesa, and a named reference device from a second GPU vendor. -**NFR-OPS-2 and NFR-OPS-4.** Crash reporting is a `log::error!` panic hook on Android and nothing at -all on desktop: no local crash record, no backtrace capture, no upload path and therefore no opt-in -gate to guard it. Update and first run are undefined; the concrete reason NFR-OPS-4 gives — that D2 -pins rawler at a non-SemVer alpha whose camera-support fixes users will need — is unaddressed, and -there is no update mechanism of any kind. +**NFR-OPS-2 is met, and NFR-OPS-4 is not.** Crash reporting is `platform/dr-plat/src/crash.rs`: a +panic on either platform writes a local record with a redacted message and backtrace, ten are kept, +and there is deliberately no upload path — the requirement's "upload only on explicit opt-in" is +satisfied by there being nothing to opt into, and the module says why a transport built ahead of the +consent is the wrong order. (This paragraph said the opposite until 2026-09-12; the record had landed +on 2026-08-30 and the paragraph had not been read against it.) Update and first run are undefined; +the concrete reason NFR-OPS-4 gives — that D2 pins rawler at a non-SemVer alpha whose camera-support +fixes users will need — is unaddressed, and there is no update mechanism of any kind. --- @@ -388,11 +391,13 @@ line — and R1 is untagged again, which is the honest reading while it has no a tag anything against. NFR-OPS-1 was covered by tags that were real rather than fixtures, which is the worse case of the two: one on `compute_coverage` and one on the gesture extractor, both on the traceability tool. A -coverage calculation and a documentation generator are not diagnostics under any reading, and the -requirement asks for a rotating, size-capped on-disk log in the XDG state directory, credential -redaction, and a consented diagnostics bundle. None of that exists — logging goes to stderr and -logcat — so both tags have been removed and NFR-OPS-1 is untagged. It is the case -[CONTRIBUTING.md](../CONTRIBUTING.md) warns about in its own words: a tag proves a tag exists. +coverage calculation and a documentation generator are not diagnostics under any reading, so both +tags were removed. It is the case [CONTRIBUTING.md](../CONTRIBUTING.md) warns about in its own words: +a tag proves a tag exists. The requirement has since been built where it says: the rotating, +size-capped log and its redaction in `platform/dr-plat/src/diagnostics.rs` (2026-08-30), and the +bundle in `diagnostics/bundle.rs` (2026-09-12) — the log, the crash records, the version, the schema +and the GPU as one text file, shown in full in Settings before a second press writes it, and sent +nowhere by either press. **R2 — Efficient display of huge RAW libraries.** Its acceptance criterion contains "*(figure TBD)*" — the scroll velocity below which no cell may render as a placeholder — and asks for a stated diff --git a/docs/traceability.md b/docs/traceability.md index d814774..ad6d9d7 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -9,18 +9,18 @@ Denominators are parsed from [`requirements.md`](requirements.md) at run time, n | Metric | Value | |---|---| -| Source files scanned | 351 | -| TRACES tags found | 1396 | +| Source files scanned | 352 | +| TRACES tags found | 1403 | | Requirements defined | 191 | -| Requirements covered | 137 | -| **Coverage** | **71.7%** (137/191) | +| Requirements covered | 138 | +| **Coverage** | **72.3%** (138/191) | ### By type | Type | Covered | Defined | |---|---|---| | FR | 104 | 136 | -| NFR | 30 | 49 | +| NFR | 31 | 49 | | R | 3 | 6 | ## Orphan tags @@ -34,65 +34,65 @@ _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: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:1434`](../ui/dr-ui/src/lib.rs#L1434), [`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:1434`](../ui/dr-ui/src/lib.rs#L1434), [`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:1507`](../ui/dr-ui/src/lib.rs#L1507), [`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:1507`](../ui/dr-ui/src/lib.rs#L1507), [`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: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: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-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:383`](../ui/dr-ui/ui/app.slint#L383), [`ui/dr-ui/ui/settings.slint:413`](../ui/dr-ui/ui/settings.slint#L413), [`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: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:3093`](../ui/dr-ui/ui/app.slint#L3093), [`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:1298`](../core/dr-pipeline/src/sidecar.rs#L1298), [`core/dr-pipeline/src/sidecar.rs:2130`](../core/dr-pipeline/src/sidecar.rs#L2130), [`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:5397`](../ui/dr-ui/src/develop.rs#L5397), [`ui/dr-ui/src/develop.rs:5426`](../ui/dr-ui/src/develop.rs#L5426), [`ui/dr-ui/src/develop.rs:6541`](../ui/dr-ui/src/develop.rs#L6541), [`ui/dr-ui/src/develop.rs:6595`](../ui/dr-ui/src/develop.rs#L6595), [`ui/dr-ui/src/develop.rs:6697`](../ui/dr-ui/src/develop.rs#L6697), [`ui/dr-ui/src/export.rs:799`](../ui/dr-ui/src/export.rs#L799), [`ui/dr-ui/src/lib.rs:1211`](../ui/dr-ui/src/lib.rs#L1211), [`ui/dr-ui/src/lib.rs:1730`](../ui/dr-ui/src/lib.rs#L1730), [`ui/dr-ui/src/lib.rs:2278`](../ui/dr-ui/src/lib.rs#L2278), [`ui/dr-ui/src/lib.rs:2416`](../ui/dr-ui/src/lib.rs#L2416), [`ui/dr-ui/src/lib.rs:750`](../ui/dr-ui/src/lib.rs#L750), [`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-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:304`](../ui/dr-ui/ui/app.slint#L304), [`ui/dr-ui/ui/app.slint:569`](../ui/dr-ui/ui/app.slint#L569), [`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:316`](../ui/dr-ui/ui/app.slint#L316), [`ui/dr-ui/ui/app.slint:569`](../ui/dr-ui/ui/app.slint#L569), [`ui/dr-ui/ui/app.slint:845`](../ui/dr-ui/ui/app.slint#L845), [`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:176`](../ui/dr-ui/ui/settings.slint#L176) | +| 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:307`](../ui/dr-ui/ui/app.slint#L307), [`ui/dr-ui/ui/app.slint:3108`](../ui/dr-ui/ui/app.slint#L3108), [`ui/dr-ui/ui/app.slint:564`](../ui/dr-ui/ui/app.slint#L564), [`ui/dr-ui/ui/app.slint:593`](../ui/dr-ui/ui/app.slint#L593), [`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:1298`](../core/dr-pipeline/src/sidecar.rs#L1298), [`core/dr-pipeline/src/sidecar.rs:2130`](../core/dr-pipeline/src/sidecar.rs#L2130), [`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:5397`](../ui/dr-ui/src/develop.rs#L5397), [`ui/dr-ui/src/develop.rs:5426`](../ui/dr-ui/src/develop.rs#L5426), [`ui/dr-ui/src/develop.rs:6541`](../ui/dr-ui/src/develop.rs#L6541), [`ui/dr-ui/src/develop.rs:6595`](../ui/dr-ui/src/develop.rs#L6595), [`ui/dr-ui/src/develop.rs:6697`](../ui/dr-ui/src/develop.rs#L6697), [`ui/dr-ui/src/export.rs:799`](../ui/dr-ui/src/export.rs#L799), [`ui/dr-ui/src/lib.rs:1284`](../ui/dr-ui/src/lib.rs#L1284), [`ui/dr-ui/src/lib.rs:1803`](../ui/dr-ui/src/lib.rs#L1803), [`ui/dr-ui/src/lib.rs:2351`](../ui/dr-ui/src/lib.rs#L2351), [`ui/dr-ui/src/lib.rs:2489`](../ui/dr-ui/src/lib.rs#L2489), [`ui/dr-ui/src/lib.rs:750`](../ui/dr-ui/src/lib.rs#L750), [`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:35`](../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`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:4686`](../ui/dr-ui/src/develop.rs#L4686), [`ui/dr-ui/src/develop.rs:4729`](../ui/dr-ui/src/develop.rs#L4729), [`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:2388`](../ui/dr-ui/src/lib.rs#L2388), [`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:2461`](../ui/dr-ui/src/lib.rs#L2461), [`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:4113`](../ui/dr-ui/src/develop.rs#L4113), [`ui/dr-ui/src/develop.rs:4126`](../ui/dr-ui/src/develop.rs#L4126), [`ui/dr-ui/src/develop.rs:4171`](../ui/dr-ui/src/develop.rs#L4171), [`ui/dr-ui/src/develop.rs:4182`](../ui/dr-ui/src/develop.rs#L4182), [`ui/dr-ui/src/develop.rs:4188`](../ui/dr-ui/src/develop.rs#L4188), [`ui/dr-ui/src/develop.rs:4205`](../ui/dr-ui/src/develop.rs#L4205), [`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:8451`](../ui/dr-ui/src/develop.rs#L8451), [`ui/dr-ui/src/develop.rs:8515`](../ui/dr-ui/src/develop.rs#L8515), [`ui/dr-ui/src/develop.rs:8538`](../ui/dr-ui/src/develop.rs#L8538), [`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:1769`](../ui/dr-ui/src/lib.rs#L1769), [`ui/dr-ui/src/lib.rs:1866`](../ui/dr-ui/src/lib.rs#L1866), [`ui/dr-ui/src/lib.rs:1975`](../ui/dr-ui/src/lib.rs#L1975), [`ui/dr-ui/src/lib.rs:2016`](../ui/dr-ui/src/lib.rs#L2016), [`ui/dr-ui/src/lib.rs:3425`](../ui/dr-ui/src/lib.rs#L3425), [`ui/dr-ui/src/lib.rs:435`](../ui/dr-ui/src/lib.rs#L435), [`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:2915`](../ui/dr-ui/ui/app.slint#L2915), [`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:4113`](../ui/dr-ui/src/develop.rs#L4113), [`ui/dr-ui/src/develop.rs:4126`](../ui/dr-ui/src/develop.rs#L4126), [`ui/dr-ui/src/develop.rs:4171`](../ui/dr-ui/src/develop.rs#L4171), [`ui/dr-ui/src/develop.rs:4182`](../ui/dr-ui/src/develop.rs#L4182), [`ui/dr-ui/src/develop.rs:4188`](../ui/dr-ui/src/develop.rs#L4188), [`ui/dr-ui/src/develop.rs:4205`](../ui/dr-ui/src/develop.rs#L4205), [`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:8451`](../ui/dr-ui/src/develop.rs#L8451), [`ui/dr-ui/src/develop.rs:8515`](../ui/dr-ui/src/develop.rs#L8515), [`ui/dr-ui/src/develop.rs:8538`](../ui/dr-ui/src/develop.rs#L8538), [`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:1842`](../ui/dr-ui/src/lib.rs#L1842), [`ui/dr-ui/src/lib.rs:1939`](../ui/dr-ui/src/lib.rs#L1939), [`ui/dr-ui/src/lib.rs:2048`](../ui/dr-ui/src/lib.rs#L2048), [`ui/dr-ui/src/lib.rs:2089`](../ui/dr-ui/src/lib.rs#L2089), [`ui/dr-ui/src/lib.rs:3498`](../ui/dr-ui/src/lib.rs#L3498), [`ui/dr-ui/src/lib.rs:435`](../ui/dr-ui/src/lib.rs#L435), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:1923`](../ui/dr-ui/ui/app.slint#L1923), [`ui/dr-ui/ui/app.slint:2930`](../ui/dr-ui/ui/app.slint#L2930), [`ui/dr-ui/ui/app.slint:87`](../ui/dr-ui/ui/app.slint#L87), [`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: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:1386`](../ui/dr-ui/src/lib.rs#L1386), [`ui/dr-ui/src/lib.rs:3600`](../ui/dr-ui/src/lib.rs#L3600), [`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-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:1459`](../ui/dr-ui/src/lib.rs#L1459), [`ui/dr-ui/src/lib.rs:3673`](../ui/dr-ui/src/lib.rs#L3673), [`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:890`](../ui/dr-ui/ui/app.slint#L890), [`ui/dr-ui/ui/settings.slint:445`](../ui/dr-ui/ui/settings.slint#L445), [`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:1027`](../core/dr-gpu/src/mask.rs#L1027), [`core/dr-gpu/src/mask.rs:1251`](../core/dr-gpu/src/mask.rs#L1251), [`core/dr-gpu/src/mask.rs:1509`](../core/dr-gpu/src/mask.rs#L1509), [`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:834`](../core/dr-gpu/src/mask.rs#L834), [`core/dr-gpu/src/mask.rs:85`](../core/dr-gpu/src/mask.rs#L85), [`core/dr-gpu/src/mask.rs:913`](../core/dr-gpu/src/mask.rs#L913), [`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:2839`](../core/dr-pipeline/src/mask.rs#L2839), [`core/dr-pipeline/src/mask.rs:2852`](../core/dr-pipeline/src/mask.rs#L2852), [`core/dr-pipeline/src/mask.rs:2871`](../core/dr-pipeline/src/mask.rs#L2871), [`core/dr-pipeline/src/mask.rs:2885`](../core/dr-pipeline/src/mask.rs#L2885), [`core/dr-pipeline/src/mask.rs:2895`](../core/dr-pipeline/src/mask.rs#L2895), [`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:1234`](../core/dr-pipeline/src/sidecar.rs#L1234), [`core/dr-pipeline/src/sidecar.rs:1413`](../core/dr-pipeline/src/sidecar.rs#L1413), [`core/dr-pipeline/src/sidecar.rs:1502`](../core/dr-pipeline/src/sidecar.rs#L1502), [`core/dr-pipeline/src/sidecar.rs:1606`](../core/dr-pipeline/src/sidecar.rs#L1606), [`core/dr-pipeline/src/sidecar.rs:1814`](../core/dr-pipeline/src/sidecar.rs#L1814), [`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:3633`](../ui/dr-ui/src/develop.rs#L3633), [`ui/dr-ui/src/develop.rs:3660`](../ui/dr-ui/src/develop.rs#L3660), [`ui/dr-ui/src/develop.rs:3692`](../ui/dr-ui/src/develop.rs#L3692), [`ui/dr-ui/src/develop.rs:3716`](../ui/dr-ui/src/develop.rs#L3716), [`ui/dr-ui/src/develop.rs:3722`](../ui/dr-ui/src/develop.rs#L3722), [`ui/dr-ui/src/develop.rs:3729`](../ui/dr-ui/src/develop.rs#L3729), [`ui/dr-ui/src/develop.rs:3749`](../ui/dr-ui/src/develop.rs#L3749), [`ui/dr-ui/src/labels.rs:60`](../ui/dr-ui/src/labels.rs#L60), [`ui/dr-ui/src/masks_ui.rs:1150`](../ui/dr-ui/src/masks_ui.rs#L1150), [`ui/dr-ui/src/masks_ui.rs:748`](../ui/dr-ui/src/masks_ui.rs#L748) | | FR-DEV-12 | [`core/dr-pipeline/ops/colour_grading.yaml:1`](../core/dr-pipeline/ops/colour_grading.yaml#L1) | -| FR-DEV-16 | [`ui/dr-ui/src/lib.rs:417`](../ui/dr-ui/src/lib.rs#L417), [`ui/dr-ui/src/masks_ui.rs:670`](../ui/dr-ui/src/masks_ui.rs#L670), [`ui/dr-ui/ui/adjust.slint:998`](../ui/dr-ui/ui/adjust.slint#L998), [`ui/dr-ui/ui/app.slint:2500`](../ui/dr-ui/ui/app.slint#L2500), [`ui/dr-ui/ui/app.slint:2513`](../ui/dr-ui/ui/app.slint#L2513), [`ui/dr-ui/ui/masks.slint:824`](../ui/dr-ui/ui/masks.slint#L824) | +| FR-DEV-16 | [`ui/dr-ui/src/lib.rs:417`](../ui/dr-ui/src/lib.rs#L417), [`ui/dr-ui/src/masks_ui.rs:670`](../ui/dr-ui/src/masks_ui.rs#L670), [`ui/dr-ui/ui/adjust.slint:998`](../ui/dr-ui/ui/adjust.slint#L998), [`ui/dr-ui/ui/app.slint:2515`](../ui/dr-ui/ui/app.slint#L2515), [`ui/dr-ui/ui/app.slint:2528`](../ui/dr-ui/ui/app.slint#L2528), [`ui/dr-ui/ui/masks.slint:824`](../ui/dr-ui/ui/masks.slint#L824) | | 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 | [`core/dr-gpu/src/mask.rs:761`](../core/dr-gpu/src/mask.rs#L761), [`core/dr-pipeline/src/mask.rs:1582`](../core/dr-pipeline/src/mask.rs#L1582), [`core/dr-pipeline/src/mask.rs:2913`](../core/dr-pipeline/src/mask.rs#L2913), [`core/dr-pipeline/src/mask.rs:987`](../core/dr-pipeline/src/mask.rs#L987), [`core/dr-pipeline/src/sidecar.rs:1124`](../core/dr-pipeline/src/sidecar.rs#L1124), [`core/dr-pipeline/tests/mask_sidecar.rs:1347`](../core/dr-pipeline/tests/mask_sidecar.rs#L1347), [`core/dr-pipeline/tests/mask_sidecar.rs:1373`](../core/dr-pipeline/tests/mask_sidecar.rs#L1373), [`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:2977`](../ui/dr-ui/src/develop.rs#L2977), [`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:1017`](../ui/dr-ui/src/masks_ui.rs#L1017), [`ui/dr-ui/src/masks_ui.rs:1089`](../ui/dr-ui/src/masks_ui.rs#L1089), [`ui/dr-ui/src/masks_ui.rs:1448`](../ui/dr-ui/src/masks_ui.rs#L1448), [`ui/dr-ui/src/masks_ui.rs:270`](../ui/dr-ui/src/masks_ui.rs#L270), [`ui/dr-ui/ui/masks.slint:150`](../ui/dr-ui/ui/masks.slint#L150), [`ui/dr-ui/ui/masks.slint:175`](../ui/dr-ui/ui/masks.slint#L175), [`ui/dr-ui/ui/masks.slint:337`](../ui/dr-ui/ui/masks.slint#L337), [`ui/dr-ui/ui/masks.slint:406`](../ui/dr-ui/ui/masks.slint#L406), [`ui/dr-ui/ui/masks.slint:762`](../ui/dr-ui/ui/masks.slint#L762), [`ui/dr-ui/ui/masks.slint:847`](../ui/dr-ui/ui/masks.slint#L847) | -| FR-DEV-19b | [`ui/dr-ui/src/develop.rs:3058`](../ui/dr-ui/src/develop.rs#L3058), [`ui/dr-ui/src/develop.rs:3601`](../ui/dr-ui/src/develop.rs#L3601), [`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:1122`](../ui/dr-ui/src/masks_ui.rs#L1122), [`ui/dr-ui/src/masks_ui.rs:1341`](../ui/dr-ui/src/masks_ui.rs#L1341), [`ui/dr-ui/src/masks_ui.rs:1369`](../ui/dr-ui/src/masks_ui.rs#L1369), [`ui/dr-ui/src/masks_ui.rs:1712`](../ui/dr-ui/src/masks_ui.rs#L1712), [`ui/dr-ui/src/masks_ui.rs:858`](../ui/dr-ui/src/masks_ui.rs#L858), [`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:1118`](../ui/dr-ui/ui/masks.slint#L1118), [`ui/dr-ui/ui/masks.slint:453`](../ui/dr-ui/ui/masks.slint#L453), [`ui/dr-ui/ui/masks.slint:766`](../ui/dr-ui/ui/masks.slint#L766), [`ui/dr-ui/ui/masks.slint:840`](../ui/dr-ui/ui/masks.slint#L840), [`ui/dr-ui/ui/masks.slint:856`](../ui/dr-ui/ui/masks.slint#L856) | +| FR-DEV-19b | [`ui/dr-ui/src/develop.rs:3058`](../ui/dr-ui/src/develop.rs#L3058), [`ui/dr-ui/src/develop.rs:3601`](../ui/dr-ui/src/develop.rs#L3601), [`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:1122`](../ui/dr-ui/src/masks_ui.rs#L1122), [`ui/dr-ui/src/masks_ui.rs:1341`](../ui/dr-ui/src/masks_ui.rs#L1341), [`ui/dr-ui/src/masks_ui.rs:1369`](../ui/dr-ui/src/masks_ui.rs#L1369), [`ui/dr-ui/src/masks_ui.rs:1712`](../ui/dr-ui/src/masks_ui.rs#L1712), [`ui/dr-ui/src/masks_ui.rs:858`](../ui/dr-ui/src/masks_ui.rs#L858), [`ui/dr-ui/ui/app.slint:1000`](../ui/dr-ui/ui/app.slint#L1000), [`ui/dr-ui/ui/app.slint:2155`](../ui/dr-ui/ui/app.slint#L2155), [`ui/dr-ui/ui/masks.slint:1118`](../ui/dr-ui/ui/masks.slint#L1118), [`ui/dr-ui/ui/masks.slint:453`](../ui/dr-ui/ui/masks.slint#L453), [`ui/dr-ui/ui/masks.slint:766`](../ui/dr-ui/ui/masks.slint#L766), [`ui/dr-ui/ui/masks.slint:840`](../ui/dr-ui/ui/masks.slint#L840), [`ui/dr-ui/ui/masks.slint:856`](../ui/dr-ui/ui/masks.slint#L856) | | 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:1790`](../core/dr-pipeline/src/mask.rs#L1790), [`core/dr-pipeline/src/mask.rs:1816`](../core/dr-pipeline/src/mask.rs#L1816), [`core/dr-pipeline/src/mask.rs:1831`](../core/dr-pipeline/src/mask.rs#L1831), [`core/dr-pipeline/src/mask.rs:1951`](../core/dr-pipeline/src/mask.rs#L1951), [`core/dr-pipeline/src/mask.rs:1999`](../core/dr-pipeline/src/mask.rs#L1999), [`core/dr-pipeline/src/mask.rs:2143`](../core/dr-pipeline/src/mask.rs#L2143), [`core/dr-pipeline/src/mask.rs:2380`](../core/dr-pipeline/src/mask.rs#L2380), [`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:4035`](../ui/dr-ui/src/develop.rs#L4035), [`ui/dr-ui/src/develop.rs:6712`](../ui/dr-ui/src/develop.rs#L6712), [`ui/dr-ui/src/develop.rs:6748`](../ui/dr-ui/src/develop.rs#L6748), [`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:1341`](../ui/dr-ui/src/masks_ui.rs#L1341), [`ui/dr-ui/src/masks_ui.rs:152`](../ui/dr-ui/src/masks_ui.rs#L152), [`ui/dr-ui/src/masks_ui.rs:1712`](../ui/dr-ui/src/masks_ui.rs#L1712), [`ui/dr-ui/src/masks_ui.rs:291`](../ui/dr-ui/src/masks_ui.rs#L291), [`ui/dr-ui/src/masks_ui.rs:317`](../ui/dr-ui/src/masks_ui.rs#L317), [`ui/dr-ui/src/masks_ui.rs:634`](../ui/dr-ui/src/masks_ui.rs#L634), [`ui/dr-ui/src/masks_ui.rs:940`](../ui/dr-ui/src/masks_ui.rs#L940), [`ui/dr-ui/src/masks_ui.rs:968`](../ui/dr-ui/src/masks_ui.rs#L968), [`ui/dr-ui/ui/icons.slint:339`](../ui/dr-ui/ui/icons.slint#L339), [`ui/dr-ui/ui/masks.slint:1083`](../ui/dr-ui/ui/masks.slint#L1083), [`ui/dr-ui/ui/masks.slint:183`](../ui/dr-ui/ui/masks.slint#L183), [`ui/dr-ui/ui/masks.slint:292`](../ui/dr-ui/ui/masks.slint#L292), [`ui/dr-ui/ui/masks.slint:517`](../ui/dr-ui/ui/masks.slint#L517), [`ui/dr-ui/ui/masks.slint:70`](../ui/dr-ui/ui/masks.slint#L70), [`ui/dr-ui/ui/masks.slint:774`](../ui/dr-ui/ui/masks.slint#L774), [`ui/dr-ui/ui/masks.slint:842`](../ui/dr-ui/ui/masks.slint#L842), [`ui/dr-ui/ui/masks.slint:930`](../ui/dr-ui/ui/masks.slint#L930) | | 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:1307`](../core/dr-pipeline/src/graph.rs#L1307), [`core/dr-pipeline/src/graph.rs:1338`](../core/dr-pipeline/src/graph.rs#L1338), [`core/dr-pipeline/src/graph.rs:1361`](../core/dr-pipeline/src/graph.rs#L1361), [`core/dr-pipeline/src/graph.rs:1399`](../core/dr-pipeline/src/graph.rs#L1399), [`core/dr-pipeline/src/graph.rs:1430`](../core/dr-pipeline/src/graph.rs#L1430), [`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:1298`](../core/dr-pipeline/src/sidecar.rs#L1298), [`core/dr-pipeline/src/sidecar.rs:160`](../core/dr-pipeline/src/sidecar.rs#L160), [`core/dr-pipeline/src/sidecar.rs:2130`](../core/dr-pipeline/src/sidecar.rs#L2130), [`core/dr-pipeline/src/sidecar.rs:2190`](../core/dr-pipeline/src/sidecar.rs#L2190), [`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:4376`](../ui/dr-ui/src/develop.rs#L4376), [`ui/dr-ui/src/develop.rs:4532`](../ui/dr-ui/src/develop.rs#L4532), [`ui/dr-ui/src/develop.rs:4592`](../ui/dr-ui/src/develop.rs#L4592), [`ui/dr-ui/src/develop.rs:4997`](../ui/dr-ui/src/develop.rs#L4997), [`ui/dr-ui/src/develop.rs:5027`](../ui/dr-ui/src/develop.rs#L5027), [`ui/dr-ui/src/develop.rs:5093`](../ui/dr-ui/src/develop.rs#L5093), [`ui/dr-ui/src/develop.rs:5107`](../ui/dr-ui/src/develop.rs#L5107), [`ui/dr-ui/src/develop.rs:5309`](../ui/dr-ui/src/develop.rs#L5309), [`ui/dr-ui/src/develop.rs:5397`](../ui/dr-ui/src/develop.rs#L5397), [`ui/dr-ui/src/develop.rs:588`](../ui/dr-ui/src/develop.rs#L588), [`ui/dr-ui/src/develop.rs:6187`](../ui/dr-ui/src/develop.rs#L6187), [`ui/dr-ui/src/develop.rs:6260`](../ui/dr-ui/src/develop.rs#L6260), [`ui/dr-ui/src/develop.rs:6453`](../ui/dr-ui/src/develop.rs#L6453), [`ui/dr-ui/src/develop.rs:649`](../ui/dr-ui/src/develop.rs#L649), [`ui/dr-ui/src/develop.rs:6541`](../ui/dr-ui/src/develop.rs#L6541), [`ui/dr-ui/src/develop.rs:6697`](../ui/dr-ui/src/develop.rs#L6697), [`ui/dr-ui/src/develop.rs:6853`](../ui/dr-ui/src/develop.rs#L6853), [`ui/dr-ui/src/develop.rs:6897`](../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:6947`](../ui/dr-ui/src/develop.rs#L6947), [`ui/dr-ui/src/develop.rs:7372`](../ui/dr-ui/src/develop.rs#L7372), [`ui/dr-ui/src/develop.rs:8100`](../ui/dr-ui/src/develop.rs#L8100), [`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:1847`](../ui/dr-ui/src/lib.rs#L1847), [`ui/dr-ui/src/lib.rs:2713`](../ui/dr-ui/src/lib.rs#L2713), [`ui/dr-ui/src/lib.rs:2920`](../ui/dr-ui/src/lib.rs#L2920), [`ui/dr-ui/src/lib.rs:2979`](../ui/dr-ui/src/lib.rs#L2979), [`ui/dr-ui/src/lib.rs:3184`](../ui/dr-ui/src/lib.rs#L3184), [`ui/dr-ui/src/lib.rs:3248`](../ui/dr-ui/src/lib.rs#L3248), [`ui/dr-ui/src/lib.rs:3302`](../ui/dr-ui/src/lib.rs#L3302), [`ui/dr-ui/src/lib.rs:412`](../ui/dr-ui/src/lib.rs#L412), [`ui/dr-ui/src/lib.rs:441`](../ui/dr-ui/src/lib.rs#L441), [`ui/dr-ui/src/lib.rs:547`](../ui/dr-ui/src/lib.rs#L547), [`ui/dr-ui/src/lib.rs:571`](../ui/dr-ui/src/lib.rs#L571), [`ui/dr-ui/src/library.rs:547`](../ui/dr-ui/src/library.rs#L547), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/masks_ui.rs:1585`](../ui/dr-ui/src/masks_ui.rs#L1585), [`ui/dr-ui/src/masks_ui.rs:339`](../ui/dr-ui/src/masks_ui.rs#L339), [`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:1019`](../ui/dr-ui/ui/adjust.slint#L1019), [`ui/dr-ui/ui/adjust.slint:126`](../ui/dr-ui/ui/adjust.slint#L126), [`ui/dr-ui/ui/adjust.slint:1496`](../ui/dr-ui/ui/adjust.slint#L1496), [`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:1208`](../ui/dr-ui/ui/masks.slint#L1208), [`ui/dr-ui/ui/masks.slint:745`](../ui/dr-ui/ui/masks.slint#L745), [`ui/dr-ui/ui/masks.slint:804`](../ui/dr-ui/ui/masks.slint#L804) | -| 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:1693`](../core/dr-pipeline/src/mask.rs#L1693), [`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:7372`](../ui/dr-ui/src/develop.rs#L7372), [`ui/dr-ui/src/develop.rs:7570`](../ui/dr-ui/src/develop.rs#L7570), [`ui/dr-ui/src/lib.rs:872`](../ui/dr-ui/src/lib.rs#L872), [`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:2660`](../ui/dr-ui/ui/app.slint#L2660) | +| 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:1307`](../core/dr-pipeline/src/graph.rs#L1307), [`core/dr-pipeline/src/graph.rs:1338`](../core/dr-pipeline/src/graph.rs#L1338), [`core/dr-pipeline/src/graph.rs:1361`](../core/dr-pipeline/src/graph.rs#L1361), [`core/dr-pipeline/src/graph.rs:1399`](../core/dr-pipeline/src/graph.rs#L1399), [`core/dr-pipeline/src/graph.rs:1430`](../core/dr-pipeline/src/graph.rs#L1430), [`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:1298`](../core/dr-pipeline/src/sidecar.rs#L1298), [`core/dr-pipeline/src/sidecar.rs:160`](../core/dr-pipeline/src/sidecar.rs#L160), [`core/dr-pipeline/src/sidecar.rs:2130`](../core/dr-pipeline/src/sidecar.rs#L2130), [`core/dr-pipeline/src/sidecar.rs:2190`](../core/dr-pipeline/src/sidecar.rs#L2190), [`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:4376`](../ui/dr-ui/src/develop.rs#L4376), [`ui/dr-ui/src/develop.rs:4532`](../ui/dr-ui/src/develop.rs#L4532), [`ui/dr-ui/src/develop.rs:4592`](../ui/dr-ui/src/develop.rs#L4592), [`ui/dr-ui/src/develop.rs:4997`](../ui/dr-ui/src/develop.rs#L4997), [`ui/dr-ui/src/develop.rs:5027`](../ui/dr-ui/src/develop.rs#L5027), [`ui/dr-ui/src/develop.rs:5093`](../ui/dr-ui/src/develop.rs#L5093), [`ui/dr-ui/src/develop.rs:5107`](../ui/dr-ui/src/develop.rs#L5107), [`ui/dr-ui/src/develop.rs:5309`](../ui/dr-ui/src/develop.rs#L5309), [`ui/dr-ui/src/develop.rs:5397`](../ui/dr-ui/src/develop.rs#L5397), [`ui/dr-ui/src/develop.rs:588`](../ui/dr-ui/src/develop.rs#L588), [`ui/dr-ui/src/develop.rs:6187`](../ui/dr-ui/src/develop.rs#L6187), [`ui/dr-ui/src/develop.rs:6260`](../ui/dr-ui/src/develop.rs#L6260), [`ui/dr-ui/src/develop.rs:6453`](../ui/dr-ui/src/develop.rs#L6453), [`ui/dr-ui/src/develop.rs:649`](../ui/dr-ui/src/develop.rs#L649), [`ui/dr-ui/src/develop.rs:6541`](../ui/dr-ui/src/develop.rs#L6541), [`ui/dr-ui/src/develop.rs:6697`](../ui/dr-ui/src/develop.rs#L6697), [`ui/dr-ui/src/develop.rs:6853`](../ui/dr-ui/src/develop.rs#L6853), [`ui/dr-ui/src/develop.rs:6897`](../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:6947`](../ui/dr-ui/src/develop.rs#L6947), [`ui/dr-ui/src/develop.rs:7372`](../ui/dr-ui/src/develop.rs#L7372), [`ui/dr-ui/src/develop.rs:8100`](../ui/dr-ui/src/develop.rs#L8100), [`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:1920`](../ui/dr-ui/src/lib.rs#L1920), [`ui/dr-ui/src/lib.rs:2786`](../ui/dr-ui/src/lib.rs#L2786), [`ui/dr-ui/src/lib.rs:2993`](../ui/dr-ui/src/lib.rs#L2993), [`ui/dr-ui/src/lib.rs:3052`](../ui/dr-ui/src/lib.rs#L3052), [`ui/dr-ui/src/lib.rs:3257`](../ui/dr-ui/src/lib.rs#L3257), [`ui/dr-ui/src/lib.rs:3321`](../ui/dr-ui/src/lib.rs#L3321), [`ui/dr-ui/src/lib.rs:3375`](../ui/dr-ui/src/lib.rs#L3375), [`ui/dr-ui/src/lib.rs:412`](../ui/dr-ui/src/lib.rs#L412), [`ui/dr-ui/src/lib.rs:441`](../ui/dr-ui/src/lib.rs#L441), [`ui/dr-ui/src/lib.rs:547`](../ui/dr-ui/src/lib.rs#L547), [`ui/dr-ui/src/lib.rs:571`](../ui/dr-ui/src/lib.rs#L571), [`ui/dr-ui/src/library.rs:547`](../ui/dr-ui/src/library.rs#L547), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/masks_ui.rs:1585`](../ui/dr-ui/src/masks_ui.rs#L1585), [`ui/dr-ui/src/masks_ui.rs:339`](../ui/dr-ui/src/masks_ui.rs#L339), [`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:1019`](../ui/dr-ui/ui/adjust.slint#L1019), [`ui/dr-ui/ui/adjust.slint:126`](../ui/dr-ui/ui/adjust.slint#L126), [`ui/dr-ui/ui/adjust.slint:1496`](../ui/dr-ui/ui/adjust.slint#L1496), [`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:146`](../ui/dr-ui/ui/app.slint#L146), [`ui/dr-ui/ui/app.slint:2220`](../ui/dr-ui/ui/app.slint#L2220), [`ui/dr-ui/ui/app.slint:2280`](../ui/dr-ui/ui/app.slint#L2280), [`ui/dr-ui/ui/develop.slint:223`](../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1208`](../ui/dr-ui/ui/masks.slint#L1208), [`ui/dr-ui/ui/masks.slint:745`](../ui/dr-ui/ui/masks.slint#L745), [`ui/dr-ui/ui/masks.slint:804`](../ui/dr-ui/ui/masks.slint#L804) | +| 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:1693`](../core/dr-pipeline/src/mask.rs#L1693), [`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:7372`](../ui/dr-ui/src/develop.rs#L7372), [`ui/dr-ui/src/develop.rs:7570`](../ui/dr-ui/src/develop.rs#L7570), [`ui/dr-ui/src/lib.rs:872`](../ui/dr-ui/src/lib.rs#L872), [`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:2464`](../ui/dr-ui/ui/app.slint#L2464) | +| 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:2675`](../ui/dr-ui/ui/app.slint#L2675) | | 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:1693`](../core/dr-pipeline/src/mask.rs#L1693), [`core/dr-pipeline/src/preset.rs:751`](../core/dr-pipeline/src/preset.rs#L751), [`ui/dr-ui/src/develop.rs:7621`](../ui/dr-ui/src/develop.rs#L7621) | | 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:2476`](../core/dr-pipeline/src/sidecar.rs#L2476), [`core/dr-pipeline/src/sidecar.rs:2552`](../core/dr-pipeline/src/sidecar.rs#L2552), [`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:4744`](../ui/dr-ui/src/develop.rs#L4744), [`ui/dr-ui/src/develop.rs:4761`](../ui/dr-ui/src/develop.rs#L4761), [`ui/dr-ui/src/develop.rs:4773`](../ui/dr-ui/src/develop.rs#L4773), [`ui/dr-ui/src/develop.rs:4811`](../ui/dr-ui/src/develop.rs#L4811), [`ui/dr-ui/src/develop.rs:4820`](../ui/dr-ui/src/develop.rs#L4820), [`ui/dr-ui/src/develop.rs:4923`](../ui/dr-ui/src/develop.rs#L4923), [`ui/dr-ui/src/develop.rs:5434`](../ui/dr-ui/src/develop.rs#L5434), [`ui/dr-ui/src/develop.rs:5449`](../ui/dr-ui/src/develop.rs#L5449), [`ui/dr-ui/src/develop.rs:8112`](../ui/dr-ui/src/develop.rs#L8112), [`ui/dr-ui/src/lib.rs:2685`](../ui/dr-ui/src/lib.rs#L2685), [`ui/dr-ui/src/lib.rs:798`](../ui/dr-ui/src/lib.rs#L798), [`ui/dr-ui/src/lib.rs:863`](../ui/dr-ui/src/lib.rs#L863), [`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:1040`](../ui/dr-ui/ui/adjust.slint#L1040), [`ui/dr-ui/ui/adjust.slint:1050`](../ui/dr-ui/ui/adjust.slint#L1050), [`ui/dr-ui/ui/adjust.slint:1268`](../ui/dr-ui/ui/adjust.slint#L1268) | +| 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:2476`](../core/dr-pipeline/src/sidecar.rs#L2476), [`core/dr-pipeline/src/sidecar.rs:2552`](../core/dr-pipeline/src/sidecar.rs#L2552), [`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:4744`](../ui/dr-ui/src/develop.rs#L4744), [`ui/dr-ui/src/develop.rs:4761`](../ui/dr-ui/src/develop.rs#L4761), [`ui/dr-ui/src/develop.rs:4773`](../ui/dr-ui/src/develop.rs#L4773), [`ui/dr-ui/src/develop.rs:4811`](../ui/dr-ui/src/develop.rs#L4811), [`ui/dr-ui/src/develop.rs:4820`](../ui/dr-ui/src/develop.rs#L4820), [`ui/dr-ui/src/develop.rs:4923`](../ui/dr-ui/src/develop.rs#L4923), [`ui/dr-ui/src/develop.rs:5434`](../ui/dr-ui/src/develop.rs#L5434), [`ui/dr-ui/src/develop.rs:5449`](../ui/dr-ui/src/develop.rs#L5449), [`ui/dr-ui/src/develop.rs:8112`](../ui/dr-ui/src/develop.rs#L8112), [`ui/dr-ui/src/lib.rs:2758`](../ui/dr-ui/src/lib.rs#L2758), [`ui/dr-ui/src/lib.rs:798`](../ui/dr-ui/src/lib.rs#L798), [`ui/dr-ui/src/lib.rs:863`](../ui/dr-ui/src/lib.rs#L863), [`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:1040`](../ui/dr-ui/ui/adjust.slint#L1040), [`ui/dr-ui/ui/adjust.slint:1050`](../ui/dr-ui/ui/adjust.slint#L1050), [`ui/dr-ui/ui/adjust.slint:1268`](../ui/dr-ui/ui/adjust.slint#L1268) | | 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:1399`](../core/dr-pipeline/src/graph.rs#L1399), [`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:4376`](../ui/dr-ui/src/develop.rs#L4376), [`ui/dr-ui/src/develop.rs:4773`](../ui/dr-ui/src/develop.rs#L4773), [`ui/dr-ui/src/develop.rs:5449`](../ui/dr-ui/src/develop.rs#L5449), [`ui/dr-ui/src/develop.rs:5479`](../ui/dr-ui/src/develop.rs#L5479), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:5504`](../ui/dr-ui/src/develop.rs#L5504), [`ui/dr-ui/src/develop.rs:5520`](../ui/dr-ui/src/develop.rs#L5520), [`ui/dr-ui/src/develop.rs:5552`](../ui/dr-ui/src/develop.rs#L5552), [`ui/dr-ui/src/develop.rs:5556`](../ui/dr-ui/src/develop.rs#L5556), [`ui/dr-ui/src/develop.rs:5575`](../ui/dr-ui/src/develop.rs#L5575), [`ui/dr-ui/src/develop.rs:5591`](../ui/dr-ui/src/develop.rs#L5591), [`ui/dr-ui/src/develop.rs:6433`](../ui/dr-ui/src/develop.rs#L6433), [`ui/dr-ui/src/develop.rs:6453`](../ui/dr-ui/src/develop.rs#L6453), [`ui/dr-ui/src/develop.rs:6484`](../ui/dr-ui/src/develop.rs#L6484), [`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:274`](../ui/dr-ui/src/labels.rs#L274), [`ui/dr-ui/src/lib.rs:1763`](../ui/dr-ui/src/lib.rs#L1763), [`ui/dr-ui/src/lib.rs:1825`](../ui/dr-ui/src/lib.rs#L1825), [`ui/dr-ui/src/lib.rs:1834`](../ui/dr-ui/src/lib.rs#L1834), [`ui/dr-ui/src/lib.rs:2953`](../ui/dr-ui/src/lib.rs#L2953), [`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:5391`](../ui/dr-ui/src/develop.rs#L5391), [`ui/dr-ui/src/develop.rs:5412`](../ui/dr-ui/src/develop.rs#L5412), [`ui/dr-ui/src/lib.rs:1730`](../ui/dr-ui/src/lib.rs#L1730), [`ui/dr-ui/src/lib.rs:2486`](../ui/dr-ui/src/lib.rs#L2486), [`ui/dr-ui/src/lib.rs:2515`](../ui/dr-ui/src/lib.rs#L2515), [`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:3053`](../ui/dr-ui/ui/app.slint#L3053), [`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:4310`](../ui/dr-ui/src/develop.rs#L4310), [`ui/dr-ui/src/develop.rs:4351`](../ui/dr-ui/src/develop.rs#L4351), [`ui/dr-ui/src/develop.rs:5520`](../ui/dr-ui/src/develop.rs#L5520), [`ui/dr-ui/src/develop.rs:5552`](../ui/dr-ui/src/develop.rs#L5552), [`ui/dr-ui/src/develop.rs:6484`](../ui/dr-ui/src/develop.rs#L6484), [`ui/dr-ui/src/lib.rs:1834`](../ui/dr-ui/src/lib.rs#L1834), [`ui/dr-ui/src/lib.rs:1896`](../ui/dr-ui/src/lib.rs#L1896), [`ui/dr-ui/src/lib.rs:2892`](../ui/dr-ui/src/lib.rs#L2892), [`ui/dr-ui/src/lib.rs:2953`](../ui/dr-ui/src/lib.rs#L2953), [`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:2660`](../ui/dr-ui/ui/app.slint#L2660), [`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:1051`](../core/dr-pipeline/src/graph.rs#L1051), [`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:3176`](../ui/dr-ui/src/develop.rs#L3176), [`ui/dr-ui/src/develop.rs:3214`](../ui/dr-ui/src/develop.rs#L3214), [`ui/dr-ui/src/develop.rs:3279`](../ui/dr-ui/src/develop.rs#L3279), [`ui/dr-ui/src/develop.rs:3362`](../ui/dr-ui/src/develop.rs#L3362), [`ui/dr-ui/src/develop.rs:3376`](../ui/dr-ui/src/develop.rs#L3376), [`ui/dr-ui/src/develop.rs:883`](../ui/dr-ui/src/develop.rs#L883), [`ui/dr-ui/src/labels.rs:77`](../ui/dr-ui/src/labels.rs#L77), [`ui/dr-ui/src/lib.rs:1854`](../ui/dr-ui/src/lib.rs#L1854), [`ui/dr-ui/src/lib.rs:3104`](../ui/dr-ui/src/lib.rs#L3104), [`ui/dr-ui/src/lib.rs:446`](../ui/dr-ui/src/lib.rs#L446), [`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:2959`](../ui/dr-ui/ui/app.slint#L2959), [`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-4 | [`core/dr-gpu/src/adjust.rs:770`](../core/dr-gpu/src/adjust.rs#L770), [`core/dr-gpu/src/lib.rs:365`](../core/dr-gpu/src/lib.rs#L365), [`ui/dr-ui/ui/crop.slint:1`](../ui/dr-ui/ui/crop.slint#L1) | +| FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1399`](../core/dr-pipeline/src/graph.rs#L1399), [`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:4376`](../ui/dr-ui/src/develop.rs#L4376), [`ui/dr-ui/src/develop.rs:4773`](../ui/dr-ui/src/develop.rs#L4773), [`ui/dr-ui/src/develop.rs:5449`](../ui/dr-ui/src/develop.rs#L5449), [`ui/dr-ui/src/develop.rs:5479`](../ui/dr-ui/src/develop.rs#L5479), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:5504`](../ui/dr-ui/src/develop.rs#L5504), [`ui/dr-ui/src/develop.rs:5520`](../ui/dr-ui/src/develop.rs#L5520), [`ui/dr-ui/src/develop.rs:5552`](../ui/dr-ui/src/develop.rs#L5552), [`ui/dr-ui/src/develop.rs:5556`](../ui/dr-ui/src/develop.rs#L5556), [`ui/dr-ui/src/develop.rs:5575`](../ui/dr-ui/src/develop.rs#L5575), [`ui/dr-ui/src/develop.rs:5591`](../ui/dr-ui/src/develop.rs#L5591), [`ui/dr-ui/src/develop.rs:6433`](../ui/dr-ui/src/develop.rs#L6433), [`ui/dr-ui/src/develop.rs:6453`](../ui/dr-ui/src/develop.rs#L6453), [`ui/dr-ui/src/develop.rs:6484`](../ui/dr-ui/src/develop.rs#L6484), [`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:274`](../ui/dr-ui/src/labels.rs#L274), [`ui/dr-ui/src/lib.rs:1836`](../ui/dr-ui/src/lib.rs#L1836), [`ui/dr-ui/src/lib.rs:1898`](../ui/dr-ui/src/lib.rs#L1898), [`ui/dr-ui/src/lib.rs:1907`](../ui/dr-ui/src/lib.rs#L1907), [`ui/dr-ui/src/lib.rs:3026`](../ui/dr-ui/src/lib.rs#L3026), [`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:5391`](../ui/dr-ui/src/develop.rs#L5391), [`ui/dr-ui/src/develop.rs:5412`](../ui/dr-ui/src/develop.rs#L5412), [`ui/dr-ui/src/lib.rs:1803`](../ui/dr-ui/src/lib.rs#L1803), [`ui/dr-ui/src/lib.rs:2559`](../ui/dr-ui/src/lib.rs#L2559), [`ui/dr-ui/src/lib.rs:2588`](../ui/dr-ui/src/lib.rs#L2588), [`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:1605`](../ui/dr-ui/ui/app.slint#L1605), [`ui/dr-ui/ui/app.slint:2433`](../ui/dr-ui/ui/app.slint#L2433), [`ui/dr-ui/ui/app.slint:3068`](../ui/dr-ui/ui/app.slint#L3068), [`ui/dr-ui/ui/app.slint:755`](../ui/dr-ui/ui/app.slint#L755), [`ui/dr-ui/ui/app.slint:766`](../ui/dr-ui/ui/app.slint#L766), [`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:632`](../ui/dr-ui/ui/settings.slint#L632) | +| 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:4310`](../ui/dr-ui/src/develop.rs#L4310), [`ui/dr-ui/src/develop.rs:4351`](../ui/dr-ui/src/develop.rs#L4351), [`ui/dr-ui/src/develop.rs:5520`](../ui/dr-ui/src/develop.rs#L5520), [`ui/dr-ui/src/develop.rs:5552`](../ui/dr-ui/src/develop.rs#L5552), [`ui/dr-ui/src/develop.rs:6484`](../ui/dr-ui/src/develop.rs#L6484), [`ui/dr-ui/src/lib.rs:1907`](../ui/dr-ui/src/lib.rs#L1907), [`ui/dr-ui/src/lib.rs:1969`](../ui/dr-ui/src/lib.rs#L1969), [`ui/dr-ui/src/lib.rs:2965`](../ui/dr-ui/src/lib.rs#L2965), [`ui/dr-ui/src/lib.rs:3026`](../ui/dr-ui/src/lib.rs#L3026), [`ui/dr-ui/src/lib.rs:404`](../ui/dr-ui/src/lib.rs#L404), [`ui/dr-ui/ui/app.slint:128`](../ui/dr-ui/ui/app.slint#L128), [`ui/dr-ui/ui/app.slint:2340`](../ui/dr-ui/ui/app.slint#L2340), [`ui/dr-ui/ui/app.slint:2355`](../ui/dr-ui/ui/app.slint#L2355), [`ui/dr-ui/ui/app.slint:2675`](../ui/dr-ui/ui/app.slint#L2675), [`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:1051`](../core/dr-pipeline/src/graph.rs#L1051), [`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:3176`](../ui/dr-ui/src/develop.rs#L3176), [`ui/dr-ui/src/develop.rs:3214`](../ui/dr-ui/src/develop.rs#L3214), [`ui/dr-ui/src/develop.rs:3279`](../ui/dr-ui/src/develop.rs#L3279), [`ui/dr-ui/src/develop.rs:3362`](../ui/dr-ui/src/develop.rs#L3362), [`ui/dr-ui/src/develop.rs:3376`](../ui/dr-ui/src/develop.rs#L3376), [`ui/dr-ui/src/develop.rs:883`](../ui/dr-ui/src/develop.rs#L883), [`ui/dr-ui/src/labels.rs:77`](../ui/dr-ui/src/labels.rs#L77), [`ui/dr-ui/src/lib.rs:1927`](../ui/dr-ui/src/lib.rs#L1927), [`ui/dr-ui/src/lib.rs:3177`](../ui/dr-ui/src/lib.rs#L3177), [`ui/dr-ui/src/lib.rs:446`](../ui/dr-ui/src/lib.rs#L446), [`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:2196`](../ui/dr-ui/ui/app.slint#L2196), [`ui/dr-ui/ui/app.slint:2398`](../ui/dr-ui/ui/app.slint#L2398), [`ui/dr-ui/ui/app.slint:2974`](../ui/dr-ui/ui/app.slint#L2974), [`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:3997`](../ui/dr-ui/src/develop.rs#L3997), [`ui/dr-ui/src/develop.rs:5259`](../ui/dr-ui/src/develop.rs#L5259), [`ui/dr-ui/src/develop.rs:5846`](../ui/dr-ui/src/develop.rs#L5846), [`ui/dr-ui/src/develop.rs:7071`](../ui/dr-ui/src/develop.rs#L7071), [`ui/dr-ui/src/develop.rs:7105`](../ui/dr-ui/src/develop.rs#L7105), [`ui/dr-ui/src/lib.rs:1019`](../ui/dr-ui/src/lib.rs#L1019), [`ui/dr-ui/src/lib.rs:1078`](../ui/dr-ui/src/lib.rs#L1078), [`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:4027`](../ui/dr-ui/src/develop.rs#L4027), [`ui/dr-ui/src/develop.rs:8684`](../ui/dr-ui/src/develop.rs#L8684), [`ui/dr-ui/src/lib.rs:1810`](../ui/dr-ui/src/lib.rs#L1810), [`ui/dr-ui/src/lib.rs:3495`](../ui/dr-ui/src/lib.rs#L3495) | -| 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:4081`](../ui/dr-ui/src/develop.rs#L4081), [`ui/dr-ui/src/develop.rs:783`](../ui/dr-ui/src/develop.rs#L783), [`ui/dr-ui/src/develop.rs:8358`](../ui/dr-ui/src/develop.rs#L8358), [`ui/dr-ui/src/develop.rs:8390`](../ui/dr-ui/src/develop.rs#L8390), [`ui/dr-ui/src/histogram.rs:1`](../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:1930`](../ui/dr-ui/src/lib.rs#L1930), [`ui/dr-ui/src/lib.rs:423`](../ui/dr-ui/src/lib.rs#L423), [`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:3973`](../ui/dr-ui/src/develop.rs#L3973), [`ui/dr-ui/src/develop.rs:4027`](../ui/dr-ui/src/develop.rs#L4027), [`ui/dr-ui/src/develop.rs:8684`](../ui/dr-ui/src/develop.rs#L8684), [`ui/dr-ui/src/develop.rs:8730`](../ui/dr-ui/src/develop.rs#L8730), [`ui/dr-ui/src/develop.rs:8749`](../ui/dr-ui/src/develop.rs#L8749), [`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:1752`](../ui/dr-ui/src/lib.rs#L1752), [`ui/dr-ui/src/lib.rs:1810`](../ui/dr-ui/src/lib.rs#L1810), [`ui/dr-ui/src/lib.rs:3402`](../ui/dr-ui/src/lib.rs#L3402), [`ui/dr-ui/src/lib.rs:3495`](../ui/dr-ui/src/lib.rs#L3495), [`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-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:4027`](../ui/dr-ui/src/develop.rs#L4027), [`ui/dr-ui/src/develop.rs:8684`](../ui/dr-ui/src/develop.rs#L8684), [`ui/dr-ui/src/lib.rs:1883`](../ui/dr-ui/src/lib.rs#L1883), [`ui/dr-ui/src/lib.rs:3568`](../ui/dr-ui/src/lib.rs#L3568) | +| 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:4081`](../ui/dr-ui/src/develop.rs#L4081), [`ui/dr-ui/src/develop.rs:783`](../ui/dr-ui/src/develop.rs#L783), [`ui/dr-ui/src/develop.rs:8358`](../ui/dr-ui/src/develop.rs#L8358), [`ui/dr-ui/src/develop.rs:8390`](../ui/dr-ui/src/develop.rs#L8390), [`ui/dr-ui/src/histogram.rs:1`](../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:2003`](../ui/dr-ui/src/lib.rs#L2003), [`ui/dr-ui/src/lib.rs:423`](../ui/dr-ui/src/lib.rs#L423), [`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:3973`](../ui/dr-ui/src/develop.rs#L3973), [`ui/dr-ui/src/develop.rs:4027`](../ui/dr-ui/src/develop.rs#L4027), [`ui/dr-ui/src/develop.rs:8684`](../ui/dr-ui/src/develop.rs#L8684), [`ui/dr-ui/src/develop.rs:8730`](../ui/dr-ui/src/develop.rs#L8730), [`ui/dr-ui/src/develop.rs:8749`](../ui/dr-ui/src/develop.rs#L8749), [`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:1825`](../ui/dr-ui/src/lib.rs#L1825), [`ui/dr-ui/src/lib.rs:1883`](../ui/dr-ui/src/lib.rs#L1883), [`ui/dr-ui/src/lib.rs:3475`](../ui/dr-ui/src/lib.rs#L3475), [`ui/dr-ui/src/lib.rs:3568`](../ui/dr-ui/src/lib.rs#L3568), [`ui/dr-ui/ui/app.slint:1876`](../ui/dr-ui/ui/app.slint#L1876), [`ui/dr-ui/ui/app.slint:61`](../ui/dr-ui/ui/app.slint#L61), [`ui/dr-ui/ui/settings.slint:150`](../ui/dr-ui/ui/settings.slint#L150), [`ui/dr-ui/ui/settings.slint:869`](../ui/dr-ui/ui/settings.slint#L869) | | 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:852`](../core/dr-types/src/settings.rs#L852), [`ui/dr-ui/src/develop.rs:8749`](../ui/dr-ui/src/develop.rs#L8749), [`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-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:772`](../ui/dr-ui/ui/settings.slint#L772), [`ui/dr-ui/ui/settings.slint:782`](../ui/dr-ui/ui/settings.slint#L782) | | 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:600`](../ui/dr-ui/src/lib.rs#L600), [`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:261`](../ui/dr-ui/src/lib.rs#L261), [`ui/dr-ui/src/lib.rs:2625`](../ui/dr-ui/src/lib.rs#L2625), [`ui/dr-ui/src/lib.rs:600`](../ui/dr-ui/src/lib.rs#L600), [`ui/dr-ui/src/lib.rs:646`](../ui/dr-ui/src/lib.rs#L646), [`ui/dr-ui/src/lib.rs:673`](../ui/dr-ui/src/lib.rs#L673), [`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-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:261`](../ui/dr-ui/src/lib.rs#L261), [`ui/dr-ui/src/lib.rs:2698`](../ui/dr-ui/src/lib.rs#L2698), [`ui/dr-ui/src/lib.rs:600`](../ui/dr-ui/src/lib.rs#L600), [`ui/dr-ui/src/lib.rs:646`](../ui/dr-ui/src/lib.rs#L646), [`ui/dr-ui/src/lib.rs:673`](../ui/dr-ui/src/lib.rs#L673), [`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:1083`](../ui/dr-ui/ui/app.slint#L1083), [`ui/dr-ui/ui/app.slint:1615`](../ui/dr-ui/ui/app.slint#L1615), [`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:4515`](../ui/dr-ui/src/develop.rs#L4515), [`ui/dr-ui/src/develop.rs:4627`](../ui/dr-ui/src/develop.rs#L4627), [`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:632`](../ui/dr-ui/src/lib.rs#L632), [`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:4648`](../ui/dr-ui/src/develop.rs#L4648), [`ui/dr-ui/src/develop.rs:4686`](../ui/dr-ui/src/develop.rs#L4686), [`ui/dr-ui/src/develop.rs:6595`](../ui/dr-ui/src/develop.rs#L6595), [`ui/dr-ui/src/lib.rs:600`](../ui/dr-ui/src/lib.rs#L600), [`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) | @@ -100,23 +100,23 @@ _None._ | FR-NC-12 | [`core/dr-sync-folder/src/lib.rs:1`](../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs: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: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-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:383`](../ui/dr-ui/ui/app.slint#L383), [`ui/dr-ui/ui/settings.slint:413`](../ui/dr-ui/ui/settings.slint#L413), [`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:2308`](../ui/dr-ui/src/lib.rs#L2308), [`ui/dr-ui/src/lib.rs:3592`](../ui/dr-ui/src/lib.rs#L3592), [`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:3043`](../ui/dr-ui/ui/app.slint#L3043), [`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-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:2381`](../ui/dr-ui/src/lib.rs#L2381), [`ui/dr-ui/src/lib.rs:3665`](../ui/dr-ui/src/lib.rs#L3665), [`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:1509`](../ui/dr-ui/ui/app.slint#L1509), [`ui/dr-ui/ui/app.slint:3058`](../ui/dr-ui/ui/app.slint#L3058), [`ui/dr-ui/ui/app.slint:535`](../ui/dr-ui/ui/app.slint#L535), [`ui/dr-ui/ui/app.slint:543`](../ui/dr-ui/ui/app.slint#L543), [`ui/dr-ui/ui/app.slint:549`](../ui/dr-ui/ui/app.slint#L549), [`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:172`](../core/dr-sync-nextcloud/src/desktop_client.rs#L172), [`core/dr-sync-nextcloud/src/desktop_client.rs:35`](../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`core/dr-sync/src/capability.rs:41`](../core/dr-sync/src/capability.rs#L41), [`core/dr-sync/src/error.rs:39`](../core/dr-sync/src/error.rs#L39), [`core/dr-sync/src/lib.rs: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: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:1434`](../ui/dr-ui/src/lib.rs#L1434), [`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:1434`](../ui/dr-ui/src/lib.rs#L1434) | -| 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:2786`](../core/dr-pipeline/src/sidecar.rs#L2786), [`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:2278`](../ui/dr-ui/src/lib.rs#L2278), [`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-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:413`](../ui/dr-ui/ui/settings.slint#L413) | +| 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:1507`](../ui/dr-ui/src/lib.rs#L1507), [`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:1507`](../ui/dr-ui/src/lib.rs#L1507) | +| 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:2786`](../core/dr-pipeline/src/sidecar.rs#L2786), [`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:2351`](../ui/dr-ui/src/lib.rs#L2351), [`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:2552`](../core/dr-pipeline/src/sidecar.rs#L2552), [`core/dr-pipeline/src/sidecar.rs:2786`](../core/dr-pipeline/src/sidecar.rs#L2786), [`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:4488`](../ui/dr-ui/src/develop.rs#L4488), [`ui/dr-ui/src/identity_ui.rs:125`](../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:1252`](../ui/dr-ui/src/lib.rs#L1252), [`ui/dr-ui/src/lib.rs:1704`](../ui/dr-ui/src/lib.rs#L1704), [`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-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:4488`](../ui/dr-ui/src/develop.rs#L4488), [`ui/dr-ui/src/identity_ui.rs:125`](../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:1325`](../ui/dr-ui/src/lib.rs#L1325), [`ui/dr-ui/src/lib.rs:1777`](../ui/dr-ui/src/lib.rs#L1777), [`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:1128`](../ui/dr-ui/src/lib.rs#L1128), [`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) | @@ -129,25 +129,25 @@ _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: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:2523`](../ui/dr-ui/src/lib.rs#L2523), [`ui/dr-ui/src/lib.rs:3704`](../ui/dr-ui/src/lib.rs#L3704), [`ui/dr-ui/src/lib.rs:3723`](../ui/dr-ui/src/lib.rs#L3723), [`ui/dr-ui/src/lib.rs:3750`](../ui/dr-ui/src/lib.rs#L3750), [`ui/dr-ui/src/lib.rs:3801`](../ui/dr-ui/src/lib.rs#L3801), [`ui/dr-ui/src/lib.rs:3834`](../ui/dr-ui/src/lib.rs#L3834), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`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:2722`](../ui/dr-ui/ui/app.slint#L2722), [`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:626`](../ui/dr-ui/ui/controls.slint#L626), [`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:3214`](../ui/dr-ui/src/develop.rs#L3214), [`ui/dr-ui/src/library_ui.rs:5503`](../ui/dr-ui/src/library_ui.rs#L5503), [`ui/dr-ui/src/masks_ui.rs:1563`](../ui/dr-ui/src/masks_ui.rs#L1563), [`ui/dr-ui/src/masks_ui.rs:1585`](../ui/dr-ui/src/masks_ui.rs#L1585), [`ui/dr-ui/src/masks_ui.rs:339`](../ui/dr-ui/src/masks_ui.rs#L339), [`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:1208`](../ui/dr-ui/ui/masks.slint#L1208), [`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:5259`](../ui/dr-ui/src/develop.rs#L5259), [`ui/dr-ui/src/develop.rs:5284`](../ui/dr-ui/src/develop.rs#L5284), [`ui/dr-ui/src/develop.rs:5295`](../ui/dr-ui/src/develop.rs#L5295), [`ui/dr-ui/src/develop.rs:5309`](../ui/dr-ui/src/develop.rs#L5309), [`ui/dr-ui/src/develop.rs:6381`](../ui/dr-ui/src/develop.rs#L6381), [`ui/dr-ui/src/develop.rs:6412`](../ui/dr-ui/src/develop.rs#L6412), [`ui/dr-ui/src/develop.rs:6433`](../ui/dr-ui/src/develop.rs#L6433), [`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:1781`](../ui/dr-ui/src/lib.rs#L1781), [`ui/dr-ui/src/lib.rs:2190`](../ui/dr-ui/src/lib.rs#L2190), [`ui/dr-ui/src/lib.rs:2430`](../ui/dr-ui/src/lib.rs#L2430), [`ui/dr-ui/src/lib.rs:3024`](../ui/dr-ui/src/lib.rs#L3024), [`ui/dr-ui/src/lib.rs:3938`](../ui/dr-ui/src/lib.rs#L3938), [`ui/dr-ui/src/lib.rs:453`](../ui/dr-ui/src/lib.rs#L453), [`ui/dr-ui/src/lib.rs:482`](../ui/dr-ui/src/lib.rs#L482), [`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:2622`](../ui/dr-ui/ui/app.slint#L2622), [`ui/dr-ui/ui/app.slint:3093`](../ui/dr-ui/ui/app.slint#L3093), [`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:3069`](../ui/dr-ui/src/lib.rs#L3069), [`ui/dr-ui/src/lib.rs:3898`](../ui/dr-ui/src/lib.rs#L3898), [`ui/dr-ui/src/lib.rs:4089`](../ui/dr-ui/src/lib.rs#L4089), [`ui/dr-ui/src/masks_ui.rs:1518`](../ui/dr-ui/src/masks_ui.rs#L1518), [`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-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:2596`](../ui/dr-ui/src/lib.rs#L2596), [`ui/dr-ui/src/lib.rs:3777`](../ui/dr-ui/src/lib.rs#L3777), [`ui/dr-ui/src/lib.rs:3796`](../ui/dr-ui/src/lib.rs#L3796), [`ui/dr-ui/src/lib.rs:3823`](../ui/dr-ui/src/lib.rs#L3823), [`ui/dr-ui/src/lib.rs:3874`](../ui/dr-ui/src/lib.rs#L3874), [`ui/dr-ui/src/lib.rs:3907`](../ui/dr-ui/src/lib.rs#L3907), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`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:2737`](../ui/dr-ui/ui/app.slint#L2737), [`ui/dr-ui/ui/app.slint:850`](../ui/dr-ui/ui/app.slint#L850), [`ui/dr-ui/ui/app.slint:954`](../ui/dr-ui/ui/app.slint#L954), [`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:602`](../ui/dr-ui/ui/settings.slint#L602), [`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:588`](../ui/dr-ui/ui/app.slint#L588), [`ui/dr-ui/ui/app.slint:602`](../ui/dr-ui/ui/app.slint#L602), [`ui/dr-ui/ui/app.slint:68`](../ui/dr-ui/ui/app.slint#L68), [`ui/dr-ui/ui/app.slint:938`](../ui/dr-ui/ui/app.slint#L938), [`ui/dr-ui/ui/controls.slint:626`](../ui/dr-ui/ui/controls.slint#L626), [`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:3214`](../ui/dr-ui/src/develop.rs#L3214), [`ui/dr-ui/src/library_ui.rs:5503`](../ui/dr-ui/src/library_ui.rs#L5503), [`ui/dr-ui/src/masks_ui.rs:1563`](../ui/dr-ui/src/masks_ui.rs#L1563), [`ui/dr-ui/src/masks_ui.rs:1585`](../ui/dr-ui/src/masks_ui.rs#L1585), [`ui/dr-ui/src/masks_ui.rs:339`](../ui/dr-ui/src/masks_ui.rs#L339), [`ui/dr-ui/src/spots_ui.rs:19`](../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/ui/app.slint:2280`](../ui/dr-ui/ui/app.slint#L2280), [`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:1208`](../ui/dr-ui/ui/masks.slint#L1208), [`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:5259`](../ui/dr-ui/src/develop.rs#L5259), [`ui/dr-ui/src/develop.rs:5284`](../ui/dr-ui/src/develop.rs#L5284), [`ui/dr-ui/src/develop.rs:5295`](../ui/dr-ui/src/develop.rs#L5295), [`ui/dr-ui/src/develop.rs:5309`](../ui/dr-ui/src/develop.rs#L5309), [`ui/dr-ui/src/develop.rs:6381`](../ui/dr-ui/src/develop.rs#L6381), [`ui/dr-ui/src/develop.rs:6412`](../ui/dr-ui/src/develop.rs#L6412), [`ui/dr-ui/src/develop.rs:6433`](../ui/dr-ui/src/develop.rs#L6433), [`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:1854`](../ui/dr-ui/src/lib.rs#L1854), [`ui/dr-ui/src/lib.rs:2263`](../ui/dr-ui/src/lib.rs#L2263), [`ui/dr-ui/src/lib.rs:2503`](../ui/dr-ui/src/lib.rs#L2503), [`ui/dr-ui/src/lib.rs:3097`](../ui/dr-ui/src/lib.rs#L3097), [`ui/dr-ui/src/lib.rs:4011`](../ui/dr-ui/src/lib.rs#L4011), [`ui/dr-ui/src/lib.rs:453`](../ui/dr-ui/src/lib.rs#L453), [`ui/dr-ui/src/lib.rs:482`](../ui/dr-ui/src/lib.rs#L482), [`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:168`](../ui/dr-ui/ui/app.slint#L168), [`ui/dr-ui/ui/app.slint:1975`](../ui/dr-ui/ui/app.slint#L1975), [`ui/dr-ui/ui/app.slint:2097`](../ui/dr-ui/ui/app.slint#L2097), [`ui/dr-ui/ui/app.slint:2504`](../ui/dr-ui/ui/app.slint#L2504), [`ui/dr-ui/ui/app.slint:2637`](../ui/dr-ui/ui/app.slint#L2637), [`ui/dr-ui/ui/app.slint:3108`](../ui/dr-ui/ui/app.slint#L3108), [`ui/dr-ui/ui/app.slint:564`](../ui/dr-ui/ui/app.slint#L564), [`ui/dr-ui/ui/app.slint:593`](../ui/dr-ui/ui/app.slint#L593), [`ui/dr-ui/ui/app.slint:602`](../ui/dr-ui/ui/app.slint#L602), [`ui/dr-ui/ui/app.slint:702`](../ui/dr-ui/ui/app.slint#L702), [`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:3142`](../ui/dr-ui/src/lib.rs#L3142), [`ui/dr-ui/src/lib.rs:3971`](../ui/dr-ui/src/lib.rs#L3971), [`ui/dr-ui/src/lib.rs:4162`](../ui/dr-ui/src/lib.rs#L4162), [`ui/dr-ui/src/masks_ui.rs:1518`](../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2464`](../ui/dr-ui/ui/app.slint#L2464), [`ui/dr-ui/ui/app.slint:2504`](../ui/dr-ui/ui/app.slint#L2504), [`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: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:3723`](../ui/dr-ui/src/lib.rs#L3723), [`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-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:3796`](../ui/dr-ui/src/lib.rs#L3796), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2220`](../ui/dr-ui/ui/app.slint#L2220), [`ui/dr-ui/ui/settings.slint:602`](../ui/dr-ui/ui/settings.slint#L602), [`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:2622`](../ui/dr-ui/ui/app.slint#L2622), [`ui/dr-ui/ui/app.slint:2660`](../ui/dr-ui/ui/app.slint#L2660) | +| 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:2637`](../ui/dr-ui/ui/app.slint#L2637), [`ui/dr-ui/ui/app.slint:2675`](../ui/dr-ui/ui/app.slint#L2675) | | 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:2659`](../ui/dr-ui/src/lib.rs#L2659), [`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-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:2732`](../ui/dr-ui/src/lib.rs#L2732), [`ui/dr-ui/ui/app.slint:1094`](../ui/dr-ui/ui/app.slint#L1094), [`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-1 | [`core/dr-gpu/src/lib.rs:336`](../core/dr-gpu/src/lib.rs#L336), [`platform/dr-plat/src/diagnostics.rs:1`](../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/state.rs:1`](../platform/dr-plat/src/state.rs#L1), [`ui/dr-ui/src/lib.rs:1195`](../ui/dr-ui/src/lib.rs#L1195), [`ui/dr-ui/ui/app.slint:1374`](../ui/dr-ui/ui/app.slint#L1374), [`ui/dr-ui/ui/app.slint:72`](../ui/dr-ui/ui/app.slint#L72), [`ui/dr-ui/ui/settings.slint:139`](../ui/dr-ui/ui/settings.slint#L139), [`ui/dr-ui/ui/settings.slint:916`](../ui/dr-ui/ui/settings.slint#L916) | | 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:4205`](../ui/dr-ui/src/develop.rs#L4205), [`ui/dr-ui/src/lib.rs:1975`](../ui/dr-ui/src/lib.rs#L1975) | +| 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:4205`](../ui/dr-ui/src/develop.rs#L4205), [`ui/dr-ui/src/lib.rs:2048`](../ui/dr-ui/src/lib.rs#L2048) | | 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: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) | @@ -164,16 +164,17 @@ _None._ | 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) | -| NFR-SEC-2 | [`core/dr-sync/src/account.rs:298`](../core/dr-sync/src/account.rs#L298), [`platform/dr-plat/src/crash.rs:1`](../platform/dr-plat/src/crash.rs#L1), [`platform/dr-plat/src/diagnostics.rs:1`](../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/redact.rs:1`](../platform/dr-plat/src/diagnostics/redact.rs#L1), [`platform/dr-plat/src/secrets.rs:82`](../platform/dr-plat/src/secrets.rs#L82) | +| NFR-SEC-2 | [`core/dr-sync/src/account.rs:298`](../core/dr-sync/src/account.rs#L298), [`platform/dr-plat/src/crash.rs:1`](../platform/dr-plat/src/crash.rs#L1), [`platform/dr-plat/src/diagnostics.rs:1`](../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/diagnostics/redact.rs:1`](../platform/dr-plat/src/diagnostics/redact.rs#L1), [`platform/dr-plat/src/secrets.rs:82`](../platform/dr-plat/src/secrets.rs#L82) | | NFR-SEC-3 | [`core/dr-sync-nextcloud/src/lib.rs:1`](../core/dr-sync-nextcloud/src/lib.rs#L1), [`core/dr-sync-nextcloud/src/provider.rs:1`](../core/dr-sync-nextcloud/src/provider.rs#L1) | -| NFR-SEC-5 | [`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/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/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | +| NFR-SEC-4 | [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../platform/dr-plat/src/diagnostics/bundle.rs#L1) | +| NFR-SEC-5 | [`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), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`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/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | | R3 | [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-pipeline/src/lib.rs:1`](../core/dr-pipeline/src/lib.rs#L1) | -| R4 | [`core/dr-gpu/src/lib.rs:351`](../core/dr-gpu/src/lib.rs#L351) | +| R4 | [`core/dr-gpu/src/lib.rs:365`](../core/dr-gpu/src/lib.rs#L365) | | R6 | [`core/dr-sync-nextcloud/src/lib.rs:1`](../core/dr-sync-nextcloud/src/lib.rs#L1) | ## Not yet tagged -54 of 191 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built. +53 of 191 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built.
Show untagged requirements @@ -226,7 +227,6 @@ _None._ - NFR-R3 - NFR-R4 - NFR-RES-3 -- NFR-SEC-4 - NFR-SEC-6 - R1 - R2 diff --git a/platform/dr-plat/src/diagnostics.rs b/platform/dr-plat/src/diagnostics.rs index bffe4a7..6b06110 100644 --- a/platform/dr-plat/src/diagnostics.rs +++ b/platform/dr-plat/src/diagnostics.rs @@ -61,6 +61,7 @@ //! [`redact::redact`] is public so the record gets the same treatment as the //! lines around it. +pub mod bundle; pub mod redact; use std::fmt::Write as _; diff --git a/platform/dr-plat/src/diagnostics/bundle.rs b/platform/dr-plat/src/diagnostics/bundle.rs new file mode 100644 index 0000000..c030b1a --- /dev/null +++ b/platform/dr-plat/src/diagnostics/bundle.rs @@ -0,0 +1,430 @@ +//! TRACES: NFR-OPS-1 | NFR-SEC-2 | NFR-SEC-4 | NFR-SEC-5 +//! The diagnostics bundle: one file, shown before it is written. +//! +//! NFR-OPS-1's second sentence asks for "a one-click diagnostics bundle" of +//! the log, the schema version, the GPU and driver, and the app version — +//! "with an explicit preview-and-consent step before anything leaves the +//! device". The log and the crash records have existed since the sink and the +//! panic hook landed; what did not exist was any way to hand them over that +//! was not `adb pull` and a knowledge of where the state directory is. +//! +//! # What "leaves the device" means here, and why the step is where it is +//! +//! Nothing in this module sends anything. There is no endpoint, no upload, +//! no queue — `crash.rs` says why, and the reason holds: a transport built +//! ahead of the consent is the shape of thing that gets switched on by +//! default. What the bundle does is write **one text file** to a place the +//! user can find, so that *they* can attach it to a message. That is the +//! moment it leaves, and it is theirs. +//! +//! So the consent step guards the write, not a send. [`Bundle::gather`] reads +//! everything into memory and touches no file; [`Bundle::preview`] says what +//! was gathered, how much of it, and what was taken out; and only +//! [`Bundle::write_to`] puts bytes on disk. A user who reads the preview and +//! closes the panel has changed nothing anywhere. The interface has to keep +//! those as two presses, and does. +//! +//! # One file, and text +//! +//! A directory is a thing to zip and a zip is a thing to explain. A single +//! `.txt` opens on every platform the user might be sitting at, pastes into +//! an issue, and can be read *in the preview* as exactly the bytes that will +//! be written — which is what makes the consent honest rather than a summary +//! of something else. The sections are separated by a fence no log line can +//! produce, so a reader can find the seams and a tool could split them. +//! +//! # Redacted again, on the way in +//! +//! Every line here has already been through a redaction: the log at its sink +//! ([`super::redact`]), the crash records when they were composed +//! ([`crate::crash::redact`]). The bundle runs the *blunter* of the two over +//! all of it regardless. The log's own rule keeps file paths, because a path +//! in the log a developer reads over `adb` is context; the bundle is a file +//! meant to be attached to a public report by someone who may not read it +//! first, and a directory listing of their photographs is the thing the +//! preview exists to prevent. Redacting twice costs nothing and makes the +//! promise in the preview a property of this module rather than of the +//! modules upstream having done their part. +//! +//! NFR-SEC-5 needs no work here and gets a tag anyway: no face data can reach +//! this bundle because nothing in `dr-plat` can see a catalog, an embedding +//! or a crop. The tag records that the property was checked, not that it was +//! built. + +use std::fmt::Write as _; +use std::fs; +use std::io; +use std::path::{Path, PathBuf}; +use std::time::{SystemTime, UNIX_EPOCH}; + +use crate::crash; + +/// The facts the requirement names beside the log, supplied by the caller +/// because none of them is this crate's to know: the running version, the +/// catalog schema, and what the GPU said it was. +#[derive(Debug, Clone, Default)] +pub struct Facts { + pub app_version: String, + pub schema_version: i64, + /// Adapter, backend, and driver, in whatever words the GPU gave. + pub graphics: String, +} + +/// One section of the bundle: a named piece of text and how big it is. +#[derive(Debug, Clone)] +pub struct Item { + /// What the section is called in the file — a filename, or `manifest`. + pub name: String, + pub lines: usize, + pub bytes: usize, + text: String, +} + +/// Everything the bundle would write, gathered and held in memory. +#[derive(Debug, Clone)] +pub struct Bundle { + when: u64, + items: Vec, +} + +/// The fence between sections. Long enough that no redacted log line is it. +const FENCE: &str = "================================================================"; + +impl Bundle { + /// Gather the log, its rotated predecessor, and every crash record on + /// disk, redacted. Reads files; writes none. + pub fn gather(facts: &Facts) -> Self { + let log = super::log_path(); + let previous = log + .as_deref() + .and_then(Path::parent) + .map(|dir| dir.join(format!("{}.1", super::FILE_NAME))); + Self::from_sources( + facts, + now(), + log.as_deref(), + previous.as_deref(), + &crash::records(), + ) + } + + /// The gathering, with every path handed in — so a test can build a + /// bundle from a directory of its own without touching the process-wide + /// log. + pub fn from_sources( + facts: &Facts, + when: u64, + log: Option<&Path>, + previous: Option<&Path>, + crashes: &[PathBuf], + ) -> Self { + let mut items = vec![manifest(facts, when, log)]; + for path in [log, previous].into_iter().flatten() { + if let Some(item) = read_item(path) { + items.push(item); + } + } + for path in crashes { + if let Some(item) = read_item(path) { + items.push(item); + } + } + Self { when, items } + } + + pub fn items(&self) -> &[Item] { + &self.items + } + + /// The name the file is written under: stamped, so two bundles from one + /// machine do not overwrite each other, and matching the crash records' + /// convention so a directory of both sorts by time. + pub fn file_name(&self) -> String { + format!("darkroom-diagnostics-{}.txt", self.when) + } + + /// What the user reads before deciding. Every claim in it is a property + /// of [`Self::render`], which is the same items in the same order. + pub fn preview(&self, destination: &Path) -> String { + let mut out = String::new(); + let _ = writeln!(out, "Nothing has been written yet. This is what would be:"); + let _ = writeln!(out); + for item in &self.items { + let _ = writeln!( + out, + " {:<32} {:>7} lines {}", + item.name, + item.lines, + size(item.bytes) + ); + } + let total: usize = self.items.iter().map(|i| i.bytes).sum(); + let _ = writeln!(out); + let _ = writeln!( + out, + "Credentials, tokens, and anything that reads as a file path or a web \ + address have been replaced in every line; the names of Rust source \ + files in a backtrace are kept. No photograph, thumbnail, face or \ + person is in it — nothing here can read the catalog." + ); + let _ = writeln!(out); + let _ = writeln!( + out, + "Saving writes one text file, {} ({}), to:\n {}\n\ + It is sent nowhere. Attaching it to a report is yours to do.", + self.file_name(), + size(total), + destination.display() + ); + out + } + + /// The whole bundle as the text that would be written. + pub fn render(&self) -> String { + let mut out = String::new(); + for item in &self.items { + let _ = writeln!(out, "{FENCE}"); + let _ = writeln!(out, "== {}", item.name); + let _ = writeln!(out, "{FENCE}"); + out.push_str(&item.text); + if !item.text.ends_with('\n') { + out.push('\n'); + } + out.push('\n'); + } + out + } + + /// Write the bundle into `dir`, creating it, and return the file's path. + /// The only function here that writes. + pub fn write_to(&self, dir: &Path) -> io::Result { + fs::create_dir_all(dir)?; + let path = dir.join(self.file_name()); + fs::write(&path, self.render())?; + Ok(path) + } +} + +/// Where a bundle is written when nobody says otherwise. +/// +/// The desktop gets the downloads directory — the one place a file can be +/// put that every "attach a file" dialog opens on, and that the user already +/// knows how to find and how to clear. `XDG_DOWNLOAD_DIR` is only in +/// `user-dirs.dirs`, which nothing here parses, so the conventional name +/// under the home directory stands in for it; failing a home, the state +/// directory, which always exists by the time this can be called. +/// +/// Android has no downloads directory an app may write without a permission +/// prompt, and the state directory there *is* the externally readable one — +/// `adb pull` and the files app both reach it — so it is used directly. +pub fn default_dir() -> PathBuf { + if cfg!(target_os = "android") { + return crate::state::state_dir(); + } + std::env::var_os("HOME") + .map(|home| PathBuf::from(home).join("Downloads")) + .filter(|d| d.is_dir()) + .unwrap_or_else(crate::state::state_dir) +} + +/// The section that carries what the requirement asks for beside the log. +/// First, so the version is the first thing anyone reading the file sees. +fn manifest(facts: &Facts, when: u64, log: Option<&Path>) -> Item { + let mut text = String::new(); + let _ = writeln!(text, "darkroom {}", facts.app_version); + let _ = writeln!(text, "catalog schema {}", facts.schema_version); + let _ = writeln!(text, "graphics {}", facts.graphics); + let _ = writeln!( + text, + "platform {} {}", + std::env::consts::OS, + std::env::consts::ARCH + ); + let _ = writeln!(text, "gathered {when} (unix seconds, UTC)"); + let _ = writeln!( + text, + "log {}", + match log { + // The basename only: the directory is a path, and the manifest + // is held to the same rule as everything under it. + Some(p) => p.file_name().map_or_else( + || "present".to_string(), + |n| n.to_string_lossy().into_owned() + ), + None => "none — this session logs to the console only".to_string(), + } + ); + let _ = writeln!( + text, + "log cap {} bytes per file, {} rotated file kept", + super::MAX_FILE_BYTES, + super::RETAINED_GENERATIONS + ); + item("manifest", text) +} + +/// A file on disk as a redacted section, or nothing if it cannot be read — +/// an unreadable log is reported in the preview by its absence, which is the +/// truthful thing, rather than by a bundle that fails to build. +fn read_item(path: &Path) -> Option { + let raw = fs::read(path).ok()?; + let name = path.file_name()?.to_string_lossy().into_owned(); + let text = String::from_utf8_lossy(&raw); + let text: String = text + .lines() + .map(crash::redact) + .collect::>() + .join("\n"); + Some(item(&name, text)) +} + +fn item(name: &str, text: String) -> Item { + Item { + name: name.to_string(), + lines: text.lines().count(), + bytes: text.len(), + text, + } +} + +fn size(bytes: usize) -> String { + if bytes < 1024 { + format!("{bytes} B") + } else if bytes < 1024 * 1024 { + format!("{} KB", bytes / 1024) + } else { + format!("{:.1} MB", bytes as f64 / (1024.0 * 1024.0)) + } +} + +fn now() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|d| d.as_secs()) + .unwrap_or(0) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn facts() -> Facts { + Facts { + app_version: "0.12.0".into(), + schema_version: 14, + graphics: "Test GPU (VULKAN) driver 1.0".into(), + } + } + + fn dir(name: &str) -> PathBuf { + let dir = std::env::temp_dir().join(format!("dr-bundle-{name}-{}", std::process::id())); + let _ = fs::remove_dir_all(&dir); + fs::create_dir_all(&dir).unwrap(); + dir + } + + /// The property the consent rests on: the preview describes the file, + /// and building the preview writes nothing. + #[test] + fn gathering_and_previewing_write_nothing() { + let d = dir("preview"); + let log = d.join("darkroom.log"); + fs::write(&log, "one\ntwo\n").unwrap(); + let before = fs::read_dir(&d).unwrap().flatten().count(); + + let bundle = Bundle::from_sources(&facts(), 1_700_000_000, Some(&log), None, &[]); + let preview = bundle.preview(&d); + + assert!(preview.contains("darkroom.log"), "{preview}"); + assert!(preview.contains("2 lines"), "{preview}"); + assert!( + preview.contains("Nothing has been written yet"), + "{preview}" + ); + assert_eq!( + fs::read_dir(&d).unwrap().flatten().count(), + before, + "the preview put a file on disk" + ); + } + + /// And the write is one file, named as the preview said, holding the + /// sections the preview listed in the order it listed them. + #[test] + fn saving_writes_one_file_with_every_section() { + let d = dir("save"); + let log = d.join("darkroom.log"); + let previous = d.join("darkroom.log.1"); + let crash = d.join("crash-1700000000-1.txt"); + fs::write(&log, "current\n").unwrap(); + fs::write(&previous, "older\n").unwrap(); + fs::write(&crash, "panicked at library.rs:12\n").unwrap(); + + let bundle = Bundle::from_sources( + &facts(), + 1_700_000_001, + Some(&log), + Some(&previous), + &[crash], + ); + let out = d.join("out"); + let written = bundle.write_to(&out).unwrap(); + + assert_eq!( + written.file_name().unwrap(), + "darkroom-diagnostics-1700000001.txt" + ); + assert_eq!(fs::read_dir(&out).unwrap().flatten().count(), 1); + let text = fs::read_to_string(&written).unwrap(); + let names: Vec<&str> = text.lines().filter_map(|l| l.strip_prefix("== ")).collect(); + assert_eq!( + names, + [ + "manifest", + "darkroom.log", + "darkroom.log.1", + "crash-1700000000-1.txt" + ] + ); + assert!(text.contains("darkroom 0.12.0"), "{text}"); + assert!(text.contains("catalog schema 14"), "{text}"); + assert!(text.contains("Test GPU"), "{text}"); + assert!( + text.contains("library.rs:12"), + "a backtrace keeps its source names" + ); + } + + /// The redaction is this module's promise, not an assumption about the + /// files it read: a path or a secret that reached the log unredacted + /// still does not reach the bundle. + #[test] + fn a_path_in_the_log_does_not_reach_the_bundle() { + let d = dir("redact"); + let log = d.join("darkroom.log"); + fs::write( + &log, + "opened /home/someone/Photos/2024/wedding/IMG_0001.CR3\npassword=hunter2hunter2\n", + ) + .unwrap(); + + let bundle = Bundle::from_sources(&facts(), 1, Some(&log), None, &[]); + let text = bundle.render(); + assert!(!text.contains("wedding"), "{text}"); + assert!(!text.contains("hunter2"), "{text}"); + assert!( + text.contains("opened"), + "the rest of the line survives: {text}" + ); + } + + /// A session logging to the console only still gets a bundle — the + /// manifest and the crash records — and the manifest says the log is + /// missing rather than the bundle failing to build. + #[test] + fn no_log_is_a_bundle_that_says_so() { + let bundle = Bundle::from_sources(&facts(), 1, None, None, &[]); + assert_eq!(bundle.items().len(), 1); + assert!(bundle.render().contains("console only")); + } +} diff --git a/ui/dr-ui/src/lib.rs b/ui/dr-ui/src/lib.rs index 9adbcdd..dbb8b57 100644 --- a/ui/dr-ui/src/lib.rs +++ b/ui/dr-ui/src/lib.rs @@ -1192,6 +1192,79 @@ pub fn run(paths: Vec) -> Result<()> { None => window.set_backend("NO GPU".into()), } + // TRACES: NFR-OPS-1 + // The diagnostics bundle, wired as the two presses the requirement + // describes. Preparing gathers the log and the crash records into memory + // and shows what would be written; saving writes it; discarding drops it + // and writes nothing. The gathered bundle is held between the presses so + // that what is saved is exactly what was shown — a bundle gathered again + // at save time could differ from its own preview by whatever was logged + // while the user was reading. + { + use dr_plat::diagnostics::bundle::{Bundle, Facts}; + let facts = Facts { + app_version: env!("CARGO_PKG_VERSION").to_string(), + schema_version: dr_catalog::schema::SCHEMA_VERSION, + graphics: match &gpu { + Some(ctx) => format!( + "{} ({:?}), {}", + ctx.adapter_name(), + ctx.backend(), + ctx.driver() + ), + None => "no GPU".to_string(), + }, + }; + let pending: Rc>> = Rc::new(RefCell::new(None)); + { + let weak = window.as_weak(); + let pending = pending.clone(); + window.on_diagnostics_prepare(move || { + let Some(w) = weak.upgrade() else { return }; + let bundle = Bundle::gather(&facts); + w.set_diagnostics_preview( + bundle + .preview(&dr_plat::diagnostics::bundle::default_dir()) + .into(), + ); + w.set_diagnostics_result("".into()); + *pending.borrow_mut() = Some(bundle); + }); + } + { + let weak = window.as_weak(); + let pending = pending.clone(); + window.on_diagnostics_save(move || { + let Some(w) = weak.upgrade() else { return }; + let Some(bundle) = pending.borrow_mut().take() else { + return; + }; + let dir = dr_plat::diagnostics::bundle::default_dir(); + let result = match bundle.write_to(&dir) { + Ok(path) => { + log::info!("diagnostics bundle written: {}", path.display()); + format!("Saved as {}", path.display()) + } + Err(e) => { + log::warn!("diagnostics bundle not written: {e}"); + format!("Could not save the bundle to {}: {e}", dir.display()) + } + }; + w.set_diagnostics_preview("".into()); + w.set_diagnostics_result(result.into()); + }); + } + { + let weak = window.as_weak(); + window.on_diagnostics_discard(move || { + let Some(w) = weak.upgrade() else { return }; + *pending.borrow_mut() = None; + w.set_diagnostics_preview("".into()); + w.set_diagnostics_result("".into()); + }); + } + } + // Every background job reports here, and this draws the bar across the top // of the shell and fills the settings page's list. Built before the // controllers because they take a handle to it: a job that starts during diff --git a/ui/dr-ui/ui/app.slint b/ui/dr-ui/ui/app.slint index 9886f43..6653c1b 100644 --- a/ui/dr-ui/ui/app.slint +++ b/ui/dr-ui/ui/app.slint @@ -69,6 +69,14 @@ export component AppWindow inherits Window { /// Set from `CARGO_PKG_VERSION`, so the About line cannot disagree with /// the binary it is part of. in property app-version: "unknown"; + /// TRACES: NFR-OPS-1 + /// The diagnostics bundle's preview and the last save's outcome — see + /// `SettingsPage`, which is the only reader. + in property diagnostics-preview; + in property diagnostics-result; + callback diagnostics-prepare(); + callback diagnostics-save(); + callback diagnostics-discard(); // Current image, for the status strip and empty state. in property filename: ""; @@ -1363,6 +1371,13 @@ in property panel-visible: true; thumbnail-library() => { root.library-thumbnail-all(); } index-faces() => { root.identity-index(); } + // TRACES: NFR-OPS-1 + diagnostics-preview: root.diagnostics-preview; + diagnostics-result: root.diagnostics-result; + diagnostics-prepare() => { root.diagnostics-prepare(); } + diagnostics-save() => { root.diagnostics-save(); } + diagnostics-discard() => { root.diagnostics-discard(); } + close() => { root.settings-close(); } reset-defaults() => { root.settings-reset(); } } diff --git a/ui/dr-ui/ui/settings.slint b/ui/dr-ui/ui/settings.slint index a4a0477..87c4559 100644 --- a/ui/dr-ui/ui/settings.slint +++ b/ui/dr-ui/ui/settings.slint @@ -136,6 +136,17 @@ export component SettingsPage inherits Rectangle { in property layout-class; in property app-version; + /// TRACES: NFR-OPS-1 + /// The diagnostics bundle, in its two states. `diagnostics-preview` is + /// empty until the user asks for one; while it is not, the panel shows + /// what would be written and offers the write. `diagnostics-result` is + /// what the last save said — a path, or why it failed. + in property diagnostics-preview; + in property diagnostics-result; + callback diagnostics-prepare(); + callback diagnostics-save(); + callback diagnostics-discard(); + /// TRACES: FR-DSP-8 /// The display showing the canvas, and the colour it is being given. /// @@ -900,6 +911,71 @@ export component SettingsPage inherits Rectangle { } } + // --- diagnostics ----------------------------------------- + // + // TRACES: NFR-OPS-1 + // Two presses, never one. The first gathers and shows; the + // second writes. The requirement asks for a preview-and- + // consent step before anything leaves the device, and a + // single button that gathered and saved would be the step + // skipped under the name of convenience. Nothing is sent by + // either press — the file is for the user to attach. + Rectangle { + width: content.column; + height: diagnostics.preferred-height; + + diagnostics := Panel { + width: 100%; + spacing: Theme.gap; + + PanelHeading { text: "DIAGNOSTICS"; } + + Caption { + text: "The log, any crash records, and the facts " + + "above, as one text file to attach to a bug " + + "report. Credentials and file paths are " + + "removed first, and you see what is in it " + + "before anything is written."; + wrap: word-wrap; + } + + if root.diagnostics-preview == "": Rectangle { + height: Theme.control-height; + + Button { + x: 0; + text: "Show what a bundle would contain"; + clicked => { root.diagnostics-prepare(); } + } + } + + if root.diagnostics-preview != "": Value { + text: root.diagnostics-preview; + wrap: word-wrap; + } + + if root.diagnostics-preview != "": HorizontalLayout { + spacing: Theme.gap; + alignment: start; + + Button { + text: "Save the bundle"; + clicked => { root.diagnostics-save(); } + } + + Button { + text: "Don't"; + clicked => { root.diagnostics-discard(); } + } + } + + if root.diagnostics-result != "": Caption { + text: root.diagnostics-result; + wrap: word-wrap; + } + } + } + // --- naming and destination ------------------------------ // // Its own panel rather than more of the export one: format and