From 6507593715090e01bedd92921f39d68cab80a2a5 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 15:58:21 +0200 Subject: [PATCH 01/13] Hand the drag ghost to the renderer through a file, so it draws MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bitmap under the cursor was a solid red rectangle. Slint's drag overlay uploads the image as a texture, draws it and drops the texture in one call; with the wgpu FemtoVG renderer the drop is immediate and the draw is deferred to the flush, so the frame binds femtovg's placeholder — which is red. An image with a cache key survives in the texture cache until after the flush, and only a path gives one. So the composite goes to the data directory's scratch as a PNG and comes back through load_from_path; one file per drag, removed when the drag ends. A workaround for Slint 1.17.1, written up as one beside the code. --- Cargo.lock | 1 + docs/gestures.md | 20 ++++---- docs/traceability.md | 38 +++++++------- ui/dr-ui/Cargo.toml | 4 ++ ui/dr-ui/src/collections_ui.rs | 94 +++++++++++++++++++++++++++++++++- ui/dr-ui/src/library.rs | 9 ++++ 6 files changed, 136 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ddc1e6e..363b576 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1706,6 +1706,7 @@ dependencies = [ "jni 0.22.4", "log", "ndk-context", + "png", "pollster", "reqwest", "rusqlite", diff --git a/docs/gestures.md b/docs/gestures.md index 506f08f..9beba6e 100644 --- a/docs/gestures.md +++ b/docs/gestures.md @@ -308,7 +308,7 @@ This replaced a double tap, which had no visible state and could take forty phot Face indexing reads each face's eyes. The chip drops frames where the chosen people are caught blinking, and leaves sunglasses and eyes it could not read alone. -`ui/dr-ui/ui/library.slint:2106` +`ui/dr-ui/ui/library.slint:2113` ### Find photographs with two people in them @@ -317,7 +317,7 @@ Face indexing reads each face's eyes. The chip drops frames where the chosen peo "Any of them" is a union and "all of them" is an intersection. The tray is where both terms and the choice between them live, because a filter belongs on the filter bar. -`ui/dr-ui/ui/library.slint:2135` +`ui/dr-ui/ui/library.slint:2142` ### Resize the thumbnails @@ -326,7 +326,7 @@ Face indexing reads each face's eyes. The chip drops frames where the chosen peo There is no wheel on a tablet, so without the pinch the cell size could only be changed by a control a finger cannot reach. -`ui/dr-ui/ui/library.slint:2795` +`ui/dr-ui/ui/library.slint:2802` ### File photographs in a collection @@ -335,7 +335,7 @@ There is no wheel on a tablet, so without the pinch the cell size could only be The selection is what the drag carries, which is why selecting several is worth the mode: forty photographs file in one gesture. -`ui/dr-ui/ui/library.slint:2992` +`ui/dr-ui/ui/library.slint:2999` ### Open a photograph @@ -344,7 +344,7 @@ The selection is what the drag carries, which is why selecting several is worth A tap opens; a tap that *moved* does not. Travel is what separates a deliberate tap from a hand brushing past, and it is the only thing that does: the two are the same length. An earlier version required the finger to dwell 120 ms instead, and that rejected ordinary taps — a real tap is often quicker than a brush. -`ui/dr-ui/ui/library.slint:3260` +`ui/dr-ui/ui/library.slint:3267` ### Rate a photograph without opening it @@ -354,7 +354,7 @@ A tap opens; a tap that *moved* does not. Travel is what separates a deliberate A star has to take the press without it also reaching the cell, or every rating throws the user into develop. -`ui/dr-ui/ui/library.slint:3380` +`ui/dr-ui/ui/library.slint:3387` ### Choose the frame a folded burst shows @@ -363,7 +363,7 @@ A star has to take the press without it also reaching the cell, or every rating A folded burst draws its earliest frame, which is a fact about the clock and not a judgement about the photograph — nothing in this application ranks a frame (FR-CULL-5). But the point of a burst is that one of the twelve is better than the other eleven, and the photographer is the only one who knows which. So the choice is offered on the frames themselves, while they are open and side by side, which is the one moment the alternatives are on screen to be compared. -`ui/dr-ui/ui/library.slint:3511` +`ui/dr-ui/ui/library.slint:3518` ### Drop the selection but keep selecting @@ -372,7 +372,7 @@ A folded burst draws its earliest frame, which is a fact about the clock and not Distinct from Done, which leaves the mode entirely. Clearing keeps it, so the next selection can start straight away. -`ui/dr-ui/ui/library.slint:4177` +`ui/dr-ui/ui/library.slint:4184` ### Select everything the grid is showing @@ -381,7 +381,7 @@ Distinct from Done, which leaves the mode entirely. Clearing keeps it, so the ne A scoped grid of two hundred frames is two hundred taps otherwise, and "all of them, except those three" is a far more common shape than the taps it took to say it. -`ui/dr-ui/ui/library.slint:4194` +`ui/dr-ui/ui/library.slint:4201` ### Take photographs out of a collection @@ -390,4 +390,4 @@ A scoped grid of two hundred frames is two hundred taps otherwise, and "all of t The badge on a cell says a photograph is filed in three collections and never which. This is the sheet that names them, and the only way out of one the grid is not currently scoped to. -`ui/dr-ui/ui/library.slint:4318` +`ui/dr-ui/ui/library.slint:4325` diff --git a/docs/traceability.md b/docs/traceability.md index 42375bf..3fffc58 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -39,27 +39,27 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:3396`](../ui/dr-ui/src/library.rs#L3396), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | | FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137) | | FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library.rs:1564`](../ui/dr-ui/src/library.rs#L1564), [`ui/dr-ui/src/library.rs:1627`](../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library.rs:1750`](../ui/dr-ui/src/library.rs#L1750), [`ui/dr-ui/src/library_ui.rs:1322`](../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:540`](../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:900`](../ui/dr-ui/ui/app.slint#L900), [`ui/dr-ui/ui/settings.slint:1093`](../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../ui/dr-ui/ui/settings.slint#L199) | -| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../core/dr-thumbs/src/lib.rs#L393), [`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:4592`](../ui/dr-ui/src/library.rs#L4592), [`ui/dr-ui/src/library.rs:4626`](../ui/dr-ui/src/library.rs#L4626), [`ui/dr-ui/src/library_ui.rs:238`](../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../ui/dr-ui/src/library_ui.rs#L914), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:745`](../ui/dr-ui/ui/collections.slint#L745) | +| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../core/dr-thumbs/src/lib.rs#L393), [`core/dr-types/src/place.rs:91`](../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1526`](../ui/dr-ui/src/collections_ui.rs#L1526), [`ui/dr-ui/src/collections_ui.rs:2433`](../ui/dr-ui/src/collections_ui.rs#L2433), [`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:4601`](../ui/dr-ui/src/library.rs#L4601), [`ui/dr-ui/src/library.rs:4635`](../ui/dr-ui/src/library.rs#L4635), [`ui/dr-ui/src/library_ui.rs:238`](../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../ui/dr-ui/src/library_ui.rs#L914), [`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:105`](../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs: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:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:177`](../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:387`](../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435), [`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:564`](../core/dr-catalog/src/schema.rs#L564), [`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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`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:4640`](../ui/dr-ui/src/library.rs#L4640), [`ui/dr-ui/src/library_ui.rs:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4246`](../ui/dr-ui/ui/library.slint#L4246) | -| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:5116`](../ui/dr-ui/src/library.rs#L5116), [`ui/dr-ui/src/library_ui.rs:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | -| 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:4921`](../ui/dr-ui/src/library.rs#L4921), [`ui/dr-ui/src/library.rs:4947`](../ui/dr-ui/src/library.rs#L4947), [`ui/dr-ui/src/library.rs:5002`](../ui/dr-ui/src/library.rs#L5002), [`ui/dr-ui/src/library_ui.rs:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2942`](../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | -| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:7386`](../ui/dr-ui/src/library.rs#L7386), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:274`](../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5224`](../ui/dr-ui/src/library.rs#L5224), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../ui/dr-ui/src/presets.rs#L498), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | +| FR-CAT-5 | [`core/dr-catalog/src/keywords.rs:1`](../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../ui/dr-ui/src/collections_ui.rs#L1977), [`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:4649`](../ui/dr-ui/src/library.rs#L4649), [`ui/dr-ui/src/library_ui.rs:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4246`](../ui/dr-ui/ui/library.slint#L4246) | +| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:5125`](../ui/dr-ui/src/library.rs#L5125), [`ui/dr-ui/src/library_ui.rs:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | +| 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:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:4930`](../ui/dr-ui/src/library.rs#L4930), [`ui/dr-ui/src/library.rs:4956`](../ui/dr-ui/src/library.rs#L4956), [`ui/dr-ui/src/library.rs:5011`](../ui/dr-ui/src/library.rs#L5011), [`ui/dr-ui/src/library_ui.rs:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2942`](../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | +| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:7395`](../ui/dr-ui/src/library.rs#L7395), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:274`](../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5233`](../ui/dr-ui/src/library.rs#L5233), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../ui/dr-ui/src/presets.rs#L498), [`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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:781`](../core/dr-catalog/src/schema.rs#L781), [`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-face/src/references.rs:1`](../core/dr-face/src/references.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`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:2416`](../ui/dr-ui/src/develop.rs#L2416), [`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:1325`](../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2576`](../ui/dr-ui/src/lib.rs#L2576), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1), [`ui/dr-ui/ui/settings.slint:529`](../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:94`](../ui/dr-ui/ui/settings.slint#L94) | | FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../core/dr-catalog/src/schema.rs#L1011), [`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:345`](../ui/dr-ui/src/library.rs#L345), [`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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`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-13 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7219`](../ui/dr-ui/src/library.rs#L7219), [`ui/dr-ui/src/library.rs:7262`](../ui/dr-ui/src/library.rs#L7262), [`ui/dr-ui/src/library.rs:7300`](../ui/dr-ui/src/library.rs#L7300), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-13 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7228`](../ui/dr-ui/src/library.rs#L7228), [`ui/dr-ui/src/library.rs:7271`](../ui/dr-ui/src/library.rs#L7271), [`ui/dr-ui/src/library.rs:7309`](../ui/dr-ui/src/library.rs#L7309), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | | 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:4146`](../ui/dr-ui/src/develop.rs#L4146), [`ui/dr-ui/src/develop.rs:4159`](../ui/dr-ui/src/develop.rs#L4159), [`ui/dr-ui/src/develop.rs:4204`](../ui/dr-ui/src/develop.rs#L4204), [`ui/dr-ui/src/develop.rs:4215`](../ui/dr-ui/src/develop.rs#L4215), [`ui/dr-ui/src/develop.rs:4221`](../ui/dr-ui/src/develop.rs#L4221), [`ui/dr-ui/src/develop.rs:4238`](../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/develop.rs:810`](../ui/dr-ui/src/develop.rs#L810), [`ui/dr-ui/src/develop.rs:830`](../ui/dr-ui/src/develop.rs#L830), [`ui/dr-ui/src/develop.rs:836`](../ui/dr-ui/src/develop.rs#L836), [`ui/dr-ui/src/develop.rs:8992`](../ui/dr-ui/src/develop.rs#L8992), [`ui/dr-ui/src/develop.rs:9056`](../ui/dr-ui/src/develop.rs#L9056), [`ui/dr-ui/src/develop.rs:9079`](../ui/dr-ui/src/develop.rs#L9079), [`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:1932`](../ui/dr-ui/src/lib.rs#L1932), [`ui/dr-ui/src/lib.rs:2040`](../ui/dr-ui/src/lib.rs#L2040), [`ui/dr-ui/src/lib.rs:2153`](../ui/dr-ui/src/lib.rs#L2153), [`ui/dr-ui/src/lib.rs:2194`](../ui/dr-ui/src/lib.rs#L2194), [`ui/dr-ui/src/lib.rs:3685`](../ui/dr-ui/src/lib.rs#L3685), [`ui/dr-ui/src/lib.rs:442`](../ui/dr-ui/src/lib.rs#L442), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:2028`](../ui/dr-ui/ui/app.slint#L2028), [`ui/dr-ui/ui/app.slint:3035`](../ui/dr-ui/ui/app.slint#L3035), [`ui/dr-ui/ui/app.slint:90`](../ui/dr-ui/ui/app.slint#L90), [`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:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`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:564`](../ui/dr-ui/src/library.rs#L564) | -| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`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:6039`](../ui/dr-ui/src/library.rs#L6039) | +| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`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:6048`](../ui/dr-ui/src/library.rs#L6048) | | 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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:714`](../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1325`](../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:603`](../ui/dr-ui/src/identity_ui.rs#L603), [`ui/dr-ui/src/lib.rs:1511`](../ui/dr-ui/src/lib.rs#L1511), [`ui/dr-ui/src/lib.rs:3940`](../ui/dr-ui/src/lib.rs#L3940), [`ui/dr-ui/src/library.rs:3624`](../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/library.rs:3889`](../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/src/library_ui.rs:406`](../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:552`](../ui/dr-ui/src/settings_ui.rs#L552), [`ui/dr-ui/ui/app.slint:946`](../ui/dr-ui/ui/app.slint#L946), [`ui/dr-ui/ui/settings.slint:100`](../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../ui/dr-ui/ui/settings.slint#L529), [`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-8a | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7219`](../ui/dr-ui/src/library.rs#L7219), [`ui/dr-ui/src/library.rs:7262`](../ui/dr-ui/src/library.rs#L7262), [`ui/dr-ui/src/library.rs:7300`](../ui/dr-ui/src/library.rs#L7300), [`ui/dr-ui/src/repairs.rs:571`](../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7228`](../ui/dr-ui/src/library.rs#L7228), [`ui/dr-ui/src/library.rs:7271`](../ui/dr-ui/src/library.rs#L7271), [`ui/dr-ui/src/library.rs:7309`](../ui/dr-ui/src/library.rs#L7309), [`ui/dr-ui/src/repairs.rs:571`](../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | | FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:781`](../core/dr-catalog/src/schema.rs#L781), [`core/dr-face/src/assign.rs:1`](../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:584`](../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:517`](../ui/dr-ui/src/repairs.rs#L517), [`ui/dr-ui/ui/identity.slint:347`](../ui/dr-ui/ui/identity.slint#L347) | | 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:2845`](../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1336`](../core/dr-pipeline/src/sidecar.rs#L1336), [`core/dr-pipeline/src/sidecar.rs:1515`](../core/dr-pipeline/src/sidecar.rs#L1515), [`core/dr-pipeline/src/sidecar.rs:1604`](../core/dr-pipeline/src/sidecar.rs#L1604), [`core/dr-pipeline/src/sidecar.rs:1708`](../core/dr-pipeline/src/sidecar.rs#L1708), [`core/dr-pipeline/src/sidecar.rs:1916`](../core/dr-pipeline/src/sidecar.rs#L1916), [`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:2318`](../ui/dr-ui/src/develop.rs#L2318), [`ui/dr-ui/src/develop.rs:3666`](../ui/dr-ui/src/develop.rs#L3666), [`ui/dr-ui/src/develop.rs:3693`](../ui/dr-ui/src/develop.rs#L3693), [`ui/dr-ui/src/develop.rs:3725`](../ui/dr-ui/src/develop.rs#L3725), [`ui/dr-ui/src/develop.rs:3749`](../ui/dr-ui/src/develop.rs#L3749), [`ui/dr-ui/src/develop.rs:3755`](../ui/dr-ui/src/develop.rs#L3755), [`ui/dr-ui/src/develop.rs:3762`](../ui/dr-ui/src/develop.rs#L3762), [`ui/dr-ui/src/develop.rs:3782`](../ui/dr-ui/src/develop.rs#L3782), [`ui/dr-ui/src/labels.rs:63`](../ui/dr-ui/src/labels.rs#L63), [`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) | @@ -105,7 +105,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../core/dr-gpu/src/shaders/merge.wgsl#L1) | | FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | | FR-MRG-3 | [`core/dr-decode/examples/linear_dng.rs:1`](../core/dr-decode/examples/linear_dng.rs#L1), [`core/dr-decode/src/lib.rs:137`](../core/dr-decode/src/lib.rs#L137), [`core/dr-decode/src/lib.rs:144`](../core/dr-decode/src/lib.rs#L144), [`core/dr-decode/src/lib.rs:598`](../core/dr-decode/src/lib.rs#L598), [`core/dr-decode/src/profile.rs:395`](../core/dr-decode/src/profile.rs#L395), [`core/dr-export/src/dng.rs:1`](../core/dr-export/src/dng.rs#L1), [`core/dr-gpu/src/demosaic.rs:254`](../core/dr-gpu/src/demosaic.rs#L254), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | -| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4457`](../ui/dr-ui/src/library.rs#L4457), [`ui/dr-ui/src/library.rs:4461`](../ui/dr-ui/src/library.rs#L4461), [`ui/dr-ui/src/merge.rs:143`](../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../ui/dr-ui/ui/merge.slint#L46) | +| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4466`](../ui/dr-ui/src/library.rs#L4466), [`ui/dr-ui/src/library.rs:4470`](../ui/dr-ui/src/library.rs#L4470), [`ui/dr-ui/src/merge.rs:143`](../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../ui/dr-ui/ui/merge.slint#L46) | | FR-MRG-5 | [`core/dr-pano/src/align.rs:1`](../core/dr-pano/src/align.rs#L1), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | | FR-MRG-6 | [`core/dr-pipeline/src/sidecar.rs:1033`](../core/dr-pipeline/src/sidecar.rs#L1033), [`core/dr-pipeline/src/sidecar.rs:113`](../core/dr-pipeline/src/sidecar.rs#L113), [`core/dr-pipeline/src/sidecar.rs:123`](../core/dr-pipeline/src/sidecar.rs#L123), [`core/dr-pipeline/src/sidecar.rs:2241`](../core/dr-pipeline/src/sidecar.rs#L2241), [`core/dr-pipeline/src/sidecar.rs:841`](../core/dr-pipeline/src/sidecar.rs#L841), [`ui/dr-ui/src/merge.rs:842`](../ui/dr-ui/src/merge.rs#L842) | | FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:829`](../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | @@ -119,15 +119,15 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:129`](../core/dr-sync/src/scan.rs#L129), [`ui/dr-ui/src/launch.rs:61`](../ui/dr-ui/src/launch.rs#L61) | | FR-NC-5 | [`core/dr-sync-nextcloud/src/propfind.rs:51`](../core/dr-sync-nextcloud/src/propfind.rs#L51), [`ui/dr-ui/src/import.rs: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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../core/dr-catalog/src/schema.rs#L1637), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:2487`](../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:3852`](../ui/dr-ui/src/lib.rs#L3852), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:3892`](../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/library.rs:2173`](../ui/dr-ui/src/library.rs#L2173), [`ui/dr-ui/src/library.rs:2196`](../ui/dr-ui/src/library.rs#L2196), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2652`](../ui/dr-ui/src/library.rs#L2652), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:1482`](../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6881`](../ui/dr-ui/src/library_ui.rs#L6881), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/library_ui.rs:709`](../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:1610`](../ui/dr-ui/ui/app.slint#L1610), [`ui/dr-ui/ui/app.slint:3163`](../ui/dr-ui/ui/app.slint#L3163), [`ui/dr-ui/ui/app.slint:541`](../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/app.slint:549`](../ui/dr-ui/ui/app.slint#L549), [`ui/dr-ui/ui/app.slint:555`](../ui/dr-ui/ui/app.slint#L555), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | +| 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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../core/dr-catalog/src/schema.rs#L1637), [`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:3032`](../ui/dr-ui/src/collections_ui.rs#L3032), [`ui/dr-ui/src/collections_ui.rs:3274`](../ui/dr-ui/src/collections_ui.rs#L3274), [`ui/dr-ui/src/collections_ui.rs:4175`](../ui/dr-ui/src/collections_ui.rs#L4175), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:2487`](../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:3852`](../ui/dr-ui/src/lib.rs#L3852), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:3892`](../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/library.rs:2173`](../ui/dr-ui/src/library.rs#L2173), [`ui/dr-ui/src/library.rs:2196`](../ui/dr-ui/src/library.rs#L2196), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2652`](../ui/dr-ui/src/library.rs#L2652), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:1482`](../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6881`](../ui/dr-ui/src/library_ui.rs#L6881), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/library_ui.rs:709`](../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:1610`](../ui/dr-ui/ui/app.slint#L1610), [`ui/dr-ui/ui/app.slint:3163`](../ui/dr-ui/ui/app.slint#L3163), [`ui/dr-ui/ui/app.slint:541`](../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/app.slint:549`](../ui/dr-ui/ui/app.slint#L549), [`ui/dr-ui/ui/app.slint:555`](../ui/dr-ui/ui/app.slint#L555), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | | FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1711`](../ui/dr-ui/src/library_ui.rs#L1711), [`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:1042`](../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library.rs:1084`](../ui/dr-ui/src/library.rs#L1084), [`ui/dr-ui/src/library.rs:2293`](../ui/dr-ui/src/library.rs#L2293), [`ui/dr-ui/src/library.rs:2383`](../ui/dr-ui/src/library.rs#L2383), [`ui/dr-ui/src/library.rs:4060`](../ui/dr-ui/src/library.rs#L4060), [`ui/dr-ui/src/library_ui.rs:1482`](../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../ui/dr-ui/src/repairs.rs#L1140), [`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-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:4175`](../ui/dr-ui/src/collections_ui.rs#L4175), [`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:1042`](../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library.rs:1084`](../ui/dr-ui/src/library.rs#L1084), [`ui/dr-ui/src/library.rs:2293`](../ui/dr-ui/src/library.rs#L2293), [`ui/dr-ui/src/library.rs:2383`](../ui/dr-ui/src/library.rs#L2383), [`ui/dr-ui/src/library.rs:4060`](../ui/dr-ui/src/library.rs#L4060), [`ui/dr-ui/src/library_ui.rs:1482`](../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../ui/dr-ui/src/repairs.rs#L1140), [`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:120`](../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435) | | FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs: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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../ui/dr-ui/src/lib.rs#L1559) | -| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7554`](../ui/dr-ui/src/library.rs#L7554), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336) | -| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`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:1070`](../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:7386`](../ui/dr-ui/src/library.rs#L7386), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7554`](../ui/dr-ui/src/library.rs#L7554), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287) | +| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7563`](../ui/dr-ui/src/library.rs#L7563), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336) | +| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`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:1070`](../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:7395`](../ui/dr-ui/src/library.rs#L7395), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7563`](../ui/dr-ui/src/library.rs#L7563), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287) | | 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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-sync/src/scan.rs:545`](../core/dr-sync/src/scan.rs#L545), [`core/dr-sync/src/scan.rs:574`](../core/dr-sync/src/scan.rs#L574), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library_ui.rs:1310`](../ui/dr-ui/src/library_ui.rs#L1310), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:2005`](../ui/dr-ui/src/library_ui.rs#L2005), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573) | | 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) | @@ -143,13 +143,13 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268) | | FR-RAW-5 | [`core/dr-decode/src/lib.rs:183`](../core/dr-decode/src/lib.rs#L183), [`core/dr-gpu/src/demosaic.rs:34`](../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:734`](../core/dr-gpu/src/demosaic.rs#L734), [`core/dr-gpu/src/demosaic.rs:813`](../core/dr-gpu/src/demosaic.rs#L813), [`core/dr-gpu/src/demosaic.rs:937`](../core/dr-gpu/src/demosaic.rs#L937) | | FR-UI-1 | [`core/dr-types/src/settings.rs:1377`](../core/dr-types/src/settings.rs#L1377), [`core/dr-types/src/settings.rs:492`](../core/dr-types/src/settings.rs#L492), [`core/dr-types/src/settings.rs:512`](../core/dr-types/src/settings.rs#L512), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/lib.rs:123`](../ui/dr-ui/src/lib.rs#L123), [`ui/dr-ui/src/lib.rs:145`](../ui/dr-ui/src/lib.rs#L145), [`ui/dr-ui/src/lib.rs:2711`](../ui/dr-ui/src/lib.rs#L2711), [`ui/dr-ui/src/lib.rs:4043`](../ui/dr-ui/src/lib.rs#L4043), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/src/lib.rs:4089`](../ui/dr-ui/src/lib.rs#L4089), [`ui/dr-ui/src/lib.rs:4140`](../ui/dr-ui/src/lib.rs#L4140), [`ui/dr-ui/src/lib.rs:4173`](../ui/dr-ui/src/lib.rs#L4173), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/settings_ui.rs:179`](../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:1010`](../ui/dr-ui/ui/app.slint#L1010), [`ui/dr-ui/ui/app.slint:2842`](../ui/dr-ui/ui/app.slint#L2842), [`ui/dr-ui/ui/app.slint:906`](../ui/dr-ui/ui/app.slint#L906), [`ui/dr-ui/ui/identity.slint:246`](../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`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:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../ui/dr-ui/ui/app.slint#L994), [`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:2621`](../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../ui/dr-ui/ui/library.slint#L4370), [`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:136`](../ui/dr-ui/ui/settings.slint#L136) | -| 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:2859`](../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../ui/dr-ui/ui/masks.slint#L1216), [`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:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../ui/dr-ui/ui/app.slint#L712), [`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:2621`](../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../ui/dr-ui/ui/library.slint#L4370), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | +| 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:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../ui/dr-ui/ui/app.slint#L994), [`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:2621`](../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../ui/dr-ui/ui/library.slint#L4370), [`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:136`](../ui/dr-ui/ui/settings.slint#L136) | +| 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:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`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:2859`](../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../ui/dr-ui/ui/masks.slint#L1216), [`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:126`](../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2207`](../ui/dr-ui/src/collections_ui.rs#L2207), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../ui/dr-ui/ui/app.slint#L712), [`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:2621`](../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../ui/dr-ui/ui/library.slint#L4370), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | | 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:3329`](../ui/dr-ui/src/lib.rs#L3329), [`ui/dr-ui/src/lib.rs:4237`](../ui/dr-ui/src/lib.rs#L4237), [`ui/dr-ui/src/lib.rs:4428`](../ui/dr-ui/src/lib.rs#L4428), [`ui/dr-ui/src/masks_ui.rs:1518`](../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2569`](../ui/dr-ui/ui/app.slint#L2569), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`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:492`](../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop.rs:1330`](../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2325`](../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`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:216`](../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4708`](../ui/dr-ui/src/library.rs#L4708), [`ui/dr-ui/src/library.rs:5476`](../ui/dr-ui/src/library.rs#L5476), [`ui/dr-ui/src/library.rs:5542`](../ui/dr-ui/src/library.rs#L5542), [`ui/dr-ui/src/library_ui.rs:1007`](../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../ui/dr-ui/src/library_ui.rs#L968), [`ui/dr-ui/src/place.rs:1`](../ui/dr-ui/src/place.rs#L1) | +| 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:216`](../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4717`](../ui/dr-ui/src/library.rs#L4717), [`ui/dr-ui/src/library.rs:5485`](../ui/dr-ui/src/library.rs#L5485), [`ui/dr-ui/src/library.rs:5551`](../ui/dr-ui/src/library.rs#L5551), [`ui/dr-ui/src/library_ui.rs:1007`](../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../ui/dr-ui/src/library_ui.rs#L968), [`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:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:2780`](../ui/dr-ui/ui/app.slint#L2780) | | 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/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1) | @@ -163,7 +163,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:4238`](../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/lib.rs:2153`](../ui/dr-ui/src/lib.rs#L2153) | | NFR-P3 | [`tools/bench/src/thumbnails.rs:1`](../tools/bench/src/thumbnails.rs#L1) | -| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4815`](../ui/dr-ui/src/library.rs#L4815), [`ui/dr-ui/src/library.rs:5978`](../ui/dr-ui/src/library.rs#L5978), [`ui/dr-ui/src/library_ui.rs:5005`](../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | +| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4824`](../ui/dr-ui/src/library.rs#L4824), [`ui/dr-ui/src/library.rs:5987`](../ui/dr-ui/src/library.rs#L5987), [`ui/dr-ui/src/library_ui.rs:5005`](../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | | NFR-P9 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/references.rs:1`](../core/dr-face/src/references.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/export.rs:1005`](../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1) | | NFR-PORT-1 | [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:272`](../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../core/dr-types/src/lib.rs#L305), [`platform/dr-plat/src/dirs.rs:1`](../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/storage.rs:1`](../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:287`](../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:344`](../platform/dr-plat/src/storage.rs#L344), [`platform/dr-plat/src/volumes.rs:1`](../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../platform/dr-plat/src/volumes.rs#L62) | | NFR-PORT-2 | [`core/dr-gpu/src/lib.rs:1`](../core/dr-gpu/src/lib.rs#L1) | diff --git a/ui/dr-ui/Cargo.toml b/ui/dr-ui/Cargo.toml index f048684..7f554ae 100644 --- a/ui/dr-ui/Cargo.toml +++ b/ui/dr-ui/Cargo.toml @@ -53,6 +53,10 @@ dr-face = { workspace = true, features = ["inference"] } # runtime file; the build stays C-free either way (docs/inference.md §3). dr-inference-engine = { workspace = true, features = ["native"] } dr-thumbs.workspace = true +# For the drag ghost only: the composite under the cursor has to reach the +# renderer through a file, and the fan of thumbnails needs alpha, which the +# thumbnail store's JPEG cannot carry. See `collections_ui::drag_image_via_file`. +png = "0.18" # The library module writes scan results straight into the catalog, so it # needs the same SQLite types dr-catalog exposes. rusqlite.workspace = true diff --git a/ui/dr-ui/src/collections_ui.rs b/ui/dr-ui/src/collections_ui.rs index a923669..3728ca8 100644 --- a/ui/dr-ui/src/collections_ui.rs +++ b/ui/dr-ui/src/collections_ui.rs @@ -1006,6 +1006,97 @@ fn compose_drag_image(thumbs: &[slint::Image]) -> slint::Image { slint::Image::from_rgba8_premultiplied(canvas) } +/// Hand the composite to the renderer by way of a file. +/// +/// **A workaround for a renderer fault, and it should read as one.** The +/// ghost under the cursor is drawn by Slint's own drag overlay, which +/// uploads the image as a texture, draws it, and drops the texture in the +/// same call. With the wgpu FemtoVG renderer that drop is immediate and +/// the draw is deferred to the frame's flush, so by the time the frame is +/// rendered the texture is gone and the renderer binds its placeholder +/// instead — a solid red rectangle the size of the ghost. An image with a +/// cache key is kept in the renderer's texture cache until after the +/// flush; an image built from pixels has none, and only a path gives one. +/// So the composite goes to disk as a PNG and comes back through +/// `load_from_path`. Slint 1.17.1, `draw_image_direct` in the FemtoVG +/// item renderer; the GL FemtoVG renderer is not affected. +/// +/// One file per drag, named uniquely: the core caches decoded images by +/// path, so reusing a name would show the previous drag's ghost. The file +/// is removed when the drag ends, or when the next one begins. +/// +/// If anything on the way fails the composite is handed over as it is, +/// which on the affected renderer draws the placeholder — no worse than +/// before, and a log line says why. +fn drag_image_via_file(composite: slint::Image) -> slint::Image { + let Some(buffer) = composite.to_rgba8() else { + log::warn!("drag ghost: the composite has no pixels to write"); + return composite; + }; + log::debug!("drag ghost: {}×{}", buffer.width(), buffer.height()); + if buffer.width() == 0 || buffer.height() == 0 { + return composite; + } + match write_drag_image(&buffer) { + Ok(path) => match slint::Image::load_from_path(&path) { + Ok(image) => { + forget_drag_image_file(); + *DRAG_IMAGE_FILE.lock().unwrap() = Some(path); + image + } + Err(_) => { + log::warn!("drag ghost: {} did not load back", path.display()); + let _ = std::fs::remove_file(&path); + composite + } + }, + Err(e) => { + log::warn!("drag ghost: {e}"); + composite + } + } +} + +/// The file the current drag's ghost is loaded from, if any. +static DRAG_IMAGE_FILE: std::sync::Mutex> = std::sync::Mutex::new(None); + +fn write_drag_image( + buffer: &slint::SharedPixelBuffer, +) -> std::io::Result { + use std::sync::atomic::{AtomicU64, Ordering}; + static SERIAL: AtomicU64 = AtomicU64::new(0); + + let dir = crate::library::scratch_dir(); + std::fs::create_dir_all(&dir)?; + let path = dir.join(format!( + "drag-{}-{}.png", + std::process::id(), + SERIAL.fetch_add(1, Ordering::Relaxed) + )); + let file = std::fs::File::create(&path)?; + let mut encoder = png::Encoder::new( + std::io::BufWriter::new(file), + buffer.width(), + buffer.height(), + ); + encoder.set_color(png::ColorType::Rgba); + encoder.set_depth(png::BitDepth::Eight); + // Fastest: this is a 160px bitmap written once per drag and read once. + encoder.set_compression(png::Compression::Fastest); + let mut writer = encoder.write_header().map_err(std::io::Error::other)?; + writer + .write_image_data(buffer.as_bytes()) + .map_err(std::io::Error::other)?; + writer.finish().map_err(std::io::Error::other)?; + Ok(path) +} + +fn forget_drag_image_file() { + if let Some(path) = DRAG_IMAGE_FILE.lock().unwrap().take() { + let _ = std::fs::remove_file(path); + } +} + /// Draw one thumbnail into the composite, scaled to `tw`×`th` at `dx`,`dy`. /// /// Nearest-neighbour: this is a transient 160px cursor bitmap, and a filtered @@ -2161,7 +2252,7 @@ pub fn wire( .map(|c| c.thumbnail) .collect() }; - w.set_library_drag_image(compose_drag_image(&thumbs)); + w.set_library_drag_image(drag_image_via_file(compose_drag_image(&thumbs))); *ctl.dragging.borrow_mut() = carried.clone(); sync_selection(&w, &ctl, &ids); @@ -2311,6 +2402,7 @@ pub fn wire( // released — it holds a copy of every thumbnail it composited. sync_lifted(&w, &[], &visible()); w.set_library_drag_image(slint::Image::default()); + forget_drag_image_file(); if landed.is_some() { let borrow = catalog.borrow(); diff --git a/ui/dr-ui/src/library.rs b/ui/dr-ui/src/library.rs index b0a6442..2e31075 100644 --- a/ui/dr-ui/src/library.rs +++ b/ui/dr-ui/src/library.rs @@ -4340,6 +4340,15 @@ pub fn inference_cache_dir() -> PathBuf { data_root().join("inference") } +/// Somewhere to put a file that only needs to exist for a moment. +/// +/// Under the data root rather than `std::env::temp_dir()`, which on Android +/// names a directory the app cannot write to. Nothing here survives a +/// launch on purpose: whoever writes into it deletes what they wrote. +pub fn scratch_dir() -> PathBuf { + data_root().join("scratch") +} + /// The detector and embedder files, if both are present — and the eye /// models beside them, if those are. /// From 2afc2a7890ab100f4731b25adb69298b9fb96077 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 15:58:26 +0200 Subject: [PATCH 02/13] Report the grid's column count on creation, not only on change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `changed columns` fires on a change, and a first evaluation is not one: a grid built after the window had settled at its size never said how wide it was, so Rust placed month headings for the one column it was told about at start-up — every month began a row, and was announced wherever its first cell fell, mid-row included. Opening a collection showed "October 2025" stranded over a row of August. --- ui/dr-ui/ui/library.slint | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ui/dr-ui/ui/library.slint b/ui/dr-ui/ui/library.slint index 0475cc9..bde934d 100644 --- a/ui/dr-ui/ui/library.slint +++ b/ui/dr-ui/ui/library.slint @@ -1771,6 +1771,13 @@ export component LibraryGrid inherits Rectangle { // Reported out so Rust can place month headings: a heading belongs on a // cell that begins a row, and only the grid knows how wide a row is. changed columns => { root.columns-changed(root.columns); } + // And once on creation. `changed` reports a change, and the first + // evaluation is not one — so a grid built after the window has already + // settled at its size never said how wide it was, and Rust went on + // placing headings for the one column it had been told about at + // start-up. Every month then began a row and was announced wherever + // its first cell fell, mid-row included. + init => { root.columns-changed(root.columns); } property row-count: ceil(root.cells.length / max(1, columns)); // --- while a pinch is happening, and just after ----------------------- From 5b4ad11853f0df3076512340b1057708f9b3ef0a Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 15:58:27 +0200 Subject: [PATCH 03/13] Manual: nested collections, and the ghost drawn as it should be A scene that makes a parent, nests two collections in it by drag and by the menu, files frames into a child and opens the parent to see it count both; stills of the tree and of the menu. The collections recording is re-made now that the bitmap under the cursor is the photograph. drive.py grows a multi-leg drag: a diagonal with much vertical in it is taken by the grid's Flickable as a scroll before the DragArea can claim it, so a drag to the sidebar goes sideways first. --- docs/manual/README.md | 12 +++++ docs/manual/media/library-collection-menu.png | 3 ++ docs/manual/media/library-collections.gif | 4 +- docs/manual/media/library-nesting.gif | 3 ++ docs/manual/media/library-nesting.png | 3 ++ docs/traceability.md | 18 ++++---- tools/manual/drive.py | 20 +++++++++ tools/manual/scenes.py | 44 +++++++++++++++++-- 8 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 docs/manual/media/library-collection-menu.png create mode 100644 docs/manual/media/library-nesting.gif create mode 100644 docs/manual/media/library-nesting.png diff --git a/docs/manual/README.md b/docs/manual/README.md index 7c6303d..54f91c8 100644 --- a/docs/manual/README.md +++ b/docs/manual/README.md @@ -74,6 +74,18 @@ photograph can be in several, and the badge on its cell counts them. ![Filing photographs in a collection by dragging them onto it](media/library-collections.gif) +Collections nest. Drag one onto another to put it inside; `+` with a +collection selected — or `New collection inside` from its menu — makes a +child. A parent shows everything its children hold, and its count says so. +Right-click a row (hold it, on a tablet) for the menu: rename, nest, +move back to the top level, keep it offline, delete. + +![Making Trips, nesting Alps and New York inside it, and opening the parent](media/library-nesting.gif) + +![Trips showing both of its children's photographs](media/library-nesting.png) + +![The menu on a collection](media/library-collection-menu.png) + ## Developing a photograph Click a thumbnail to open it. The column on the right is every adjustment; diff --git a/docs/manual/media/library-collection-menu.png b/docs/manual/media/library-collection-menu.png new file mode 100644 index 0000000..5e233ea --- /dev/null +++ b/docs/manual/media/library-collection-menu.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d39e4d07042839516b1a6eed7a1c126fb7058a9f394f23a3bf019f5209ad01d7 +size 216510 diff --git a/docs/manual/media/library-collections.gif b/docs/manual/media/library-collections.gif index be47da1..bd071d1 100644 --- a/docs/manual/media/library-collections.gif +++ b/docs/manual/media/library-collections.gif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:debe0992b031d5e94e741c8f815577a15c9509a7458e95033d0914263eb0228d -size 551511 +oid sha256:6eb6c54ac139ee07ba616e99ca672c5b3ee4e4bff472ccc6a1299a05bb488246 +size 701171 diff --git a/docs/manual/media/library-nesting.gif b/docs/manual/media/library-nesting.gif new file mode 100644 index 0000000..2e29e87 --- /dev/null +++ b/docs/manual/media/library-nesting.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:306b0d30a9b7a92dd409b6d1a0f973aa0ce7bfeb5a1e31fc1394761c8b967c5a +size 920770 diff --git a/docs/manual/media/library-nesting.png b/docs/manual/media/library-nesting.png new file mode 100644 index 0000000..dbc2411 --- /dev/null +++ b/docs/manual/media/library-nesting.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b479c2fcf4ba5641accf06b0cee67cbbd406f5905de59ab6f53de137fec2476f +size 357747 diff --git a/docs/traceability.md b/docs/traceability.md index 3fffc58..e1317ea 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -44,9 +44,9 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:105`](../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs: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:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:177`](../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:387`](../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435), [`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:564`](../core/dr-catalog/src/schema.rs#L564), [`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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../ui/dr-ui/src/collections_ui.rs#L1977), [`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:4649`](../ui/dr-ui/src/library.rs#L4649), [`ui/dr-ui/src/library_ui.rs:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4246`](../ui/dr-ui/ui/library.slint#L4246) | -| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:5125`](../ui/dr-ui/src/library.rs#L5125), [`ui/dr-ui/src/library_ui.rs:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | -| 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:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:4930`](../ui/dr-ui/src/library.rs#L4930), [`ui/dr-ui/src/library.rs:4956`](../ui/dr-ui/src/library.rs#L4956), [`ui/dr-ui/src/library.rs:5011`](../ui/dr-ui/src/library.rs#L5011), [`ui/dr-ui/src/library_ui.rs:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2942`](../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | +| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../ui/dr-ui/src/collections_ui.rs#L1977), [`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:4649`](../ui/dr-ui/src/library.rs#L4649), [`ui/dr-ui/src/library_ui.rs:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4253`](../ui/dr-ui/ui/library.slint#L4253) | +| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:5125`](../ui/dr-ui/src/library.rs#L5125), [`ui/dr-ui/src/library_ui.rs:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4253`](../ui/dr-ui/ui/library.slint#L4253), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | +| 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:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:4930`](../ui/dr-ui/src/library.rs#L4930), [`ui/dr-ui/src/library.rs:4956`](../ui/dr-ui/src/library.rs#L4956), [`ui/dr-ui/src/library.rs:5011`](../ui/dr-ui/src/library.rs#L5011), [`ui/dr-ui/src/library_ui.rs:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2949`](../ui/dr-ui/ui/library.slint#L2949), [`ui/dr-ui/ui/library.slint:4231`](../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | | FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:7395`](../ui/dr-ui/src/library.rs#L7395), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:274`](../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5233`](../ui/dr-ui/src/library.rs#L5233), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../ui/dr-ui/src/presets.rs#L498), [`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) | @@ -82,7 +82,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-DEV-3i | [`core/dr-pipeline/src/mask.rs:558`](../core/dr-pipeline/src/mask.rs#L558), [`core/dr-segment/src/lib.rs:1`](../core/dr-segment/src/lib.rs#L1), [`ui/dr-ui/src/segmentation.rs:1`](../ui/dr-ui/src/segmentation.rs#L1) | | FR-DEV-4 | [`core/dr-gpu/src/adjust.rs:798`](../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:368`](../core/dr-gpu/src/lib.rs#L368), [`ui/dr-ui/ui/crop.slint:1`](../ui/dr-ui/ui/crop.slint#L1) | | FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1440`](../core/dr-pipeline/src/graph.rs#L1440), [`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/sidecar.rs:1045`](../core/dr-pipeline/src/sidecar.rs#L1045), [`core/dr-pipeline/src/sidecar.rs:144`](../core/dr-pipeline/src/sidecar.rs#L144), [`core/dr-pipeline/src/sidecar.rs:2472`](../core/dr-pipeline/src/sidecar.rs#L2472), [`core/dr-pipeline/src/sidecar.rs:2508`](../core/dr-pipeline/src/sidecar.rs#L2508), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:303`](../core/dr-pipeline/src/sidecar.rs#L303), [`core/dr-pipeline/src/sidecar.rs:694`](../core/dr-pipeline/src/sidecar.rs#L694), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:857`](../core/dr-pipeline/src/sidecar.rs#L857), [`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:4409`](../ui/dr-ui/src/develop.rs#L4409), [`ui/dr-ui/src/develop.rs:4839`](../ui/dr-ui/src/develop.rs#L4839), [`ui/dr-ui/src/develop.rs:5517`](../ui/dr-ui/src/develop.rs#L5517), [`ui/dr-ui/src/develop.rs:5535`](../ui/dr-ui/src/develop.rs#L5535), [`ui/dr-ui/src/develop.rs:5574`](../ui/dr-ui/src/develop.rs#L5574), [`ui/dr-ui/src/develop.rs:5588`](../ui/dr-ui/src/develop.rs#L5588), [`ui/dr-ui/src/develop.rs:5599`](../ui/dr-ui/src/develop.rs#L5599), [`ui/dr-ui/src/develop.rs:5658`](../ui/dr-ui/src/develop.rs#L5658), [`ui/dr-ui/src/develop.rs:5671`](../ui/dr-ui/src/develop.rs#L5671), [`ui/dr-ui/src/develop.rs:5701`](../ui/dr-ui/src/develop.rs#L5701), [`ui/dr-ui/src/develop.rs:5714`](../ui/dr-ui/src/develop.rs#L5714), [`ui/dr-ui/src/develop.rs:5726`](../ui/dr-ui/src/develop.rs#L5726), [`ui/dr-ui/src/develop.rs:5742`](../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:5778`](../ui/dr-ui/src/develop.rs#L5778), [`ui/dr-ui/src/develop.rs:5797`](../ui/dr-ui/src/develop.rs#L5797), [`ui/dr-ui/src/develop.rs:5813`](../ui/dr-ui/src/develop.rs#L5813), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`ui/dr-ui/src/develop.rs:6675`](../ui/dr-ui/src/develop.rs#L6675), [`ui/dr-ui/src/develop.rs:6897`](../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:6954`](../ui/dr-ui/src/develop.rs#L6954), [`ui/dr-ui/src/develop.rs:7014`](../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:772`](../ui/dr-ui/src/develop.rs#L772), [`ui/dr-ui/src/develop.rs:781`](../ui/dr-ui/src/develop.rs#L781), [`ui/dr-ui/src/labels.rs:12`](../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:278`](../ui/dr-ui/src/labels.rs#L278), [`ui/dr-ui/src/labels.rs:31`](../ui/dr-ui/src/labels.rs#L31), [`ui/dr-ui/src/lib.rs:1921`](../ui/dr-ui/src/lib.rs#L1921), [`ui/dr-ui/src/lib.rs:1926`](../ui/dr-ui/src/lib.rs#L1926), [`ui/dr-ui/src/lib.rs:1989`](../ui/dr-ui/src/lib.rs#L1989), [`ui/dr-ui/src/lib.rs:1998`](../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2010`](../ui/dr-ui/src/lib.rs#L2010), [`ui/dr-ui/src/lib.rs:3139`](../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3159`](../ui/dr-ui/src/lib.rs#L3159), [`ui/dr-ui/src/library.rs:611`](../ui/dr-ui/src/library.rs#L611), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/presets.rs:1678`](../ui/dr-ui/src/presets.rs#L1678), [`ui/dr-ui/src/presets.rs:373`](../ui/dr-ui/src/presets.rs#L373), [`ui/dr-ui/src/presets.rs:437`](../ui/dr-ui/src/presets.rs#L437), [`ui/dr-ui/src/presets.rs:557`](../ui/dr-ui/src/presets.rs#L557), [`ui/dr-ui/ui/history.slint:191`](../ui/dr-ui/ui/history.slint#L191), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:218`](../ui/dr-ui/ui/history.slint#L218), [`ui/dr-ui/ui/history.slint:303`](../ui/dr-ui/ui/history.slint#L303), [`ui/dr-ui/ui/history.slint:43`](../ui/dr-ui/ui/history.slint#L43), [`ui/dr-ui/ui/history.slint:53`](../ui/dr-ui/ui/history.slint#L53) | -| 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:443`](../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop.rs:5457`](../ui/dr-ui/src/develop.rs#L5457), [`ui/dr-ui/src/develop.rs:5478`](../ui/dr-ui/src/develop.rs#L5478), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2674`](../ui/dr-ui/src/lib.rs#L2674), [`ui/dr-ui/src/lib.rs:2703`](../ui/dr-ui/src/lib.rs#L2703), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:592`](../ui/dr-ui/src/library.rs#L592), [`ui/dr-ui/src/library_ui.rs:3255`](../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`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:707`](../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../ui/dr-ui/src/presets.rs#L741), [`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:1706`](../ui/dr-ui/ui/app.slint#L1706), [`ui/dr-ui/ui/app.slint:2538`](../ui/dr-ui/ui/app.slint#L2538), [`ui/dr-ui/ui/app.slint:3173`](../ui/dr-ui/ui/app.slint#L3173), [`ui/dr-ui/ui/app.slint:765`](../ui/dr-ui/ui/app.slint#L765), [`ui/dr-ui/ui/app.slint:776`](../ui/dr-ui/ui/app.slint#L776), [`ui/dr-ui/ui/library.slint:1579`](../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4262`](../ui/dr-ui/ui/library.slint#L4262), [`ui/dr-ui/ui/library.slint:4286`](../ui/dr-ui/ui/library.slint#L4286), [`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:119`](../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../ui/dr-ui/ui/settings.slint#L711) | +| 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:443`](../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop.rs:5457`](../ui/dr-ui/src/develop.rs#L5457), [`ui/dr-ui/src/develop.rs:5478`](../ui/dr-ui/src/develop.rs#L5478), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2674`](../ui/dr-ui/src/lib.rs#L2674), [`ui/dr-ui/src/lib.rs:2703`](../ui/dr-ui/src/lib.rs#L2703), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:592`](../ui/dr-ui/src/library.rs#L592), [`ui/dr-ui/src/library_ui.rs:3255`](../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`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:707`](../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../ui/dr-ui/src/presets.rs#L741), [`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:1706`](../ui/dr-ui/ui/app.slint#L1706), [`ui/dr-ui/ui/app.slint:2538`](../ui/dr-ui/ui/app.slint#L2538), [`ui/dr-ui/ui/app.slint:3173`](../ui/dr-ui/ui/app.slint#L3173), [`ui/dr-ui/ui/app.slint:765`](../ui/dr-ui/ui/app.slint#L765), [`ui/dr-ui/ui/app.slint:776`](../ui/dr-ui/ui/app.slint#L776), [`ui/dr-ui/ui/library.slint:1579`](../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4269`](../ui/dr-ui/ui/library.slint#L4269), [`ui/dr-ui/ui/library.slint:4293`](../ui/dr-ui/ui/library.slint#L4293), [`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:119`](../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../ui/dr-ui/ui/settings.slint#L711) | | 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:4343`](../ui/dr-ui/src/develop.rs#L4343), [`ui/dr-ui/src/develop.rs:4384`](../ui/dr-ui/src/develop.rs#L4384), [`ui/dr-ui/src/develop.rs:5613`](../ui/dr-ui/src/develop.rs#L5613), [`ui/dr-ui/src/develop.rs:5630`](../ui/dr-ui/src/develop.rs#L5630), [`ui/dr-ui/src/develop.rs:5742`](../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:6897`](../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:7014`](../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:797`](../ui/dr-ui/src/develop.rs#L797), [`ui/dr-ui/src/lib.rs:1998`](../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2070`](../ui/dr-ui/src/lib.rs#L2070), [`ui/dr-ui/src/lib.rs:2084`](../ui/dr-ui/src/lib.rs#L2084), [`ui/dr-ui/src/lib.rs:3080`](../ui/dr-ui/src/lib.rs#L3080), [`ui/dr-ui/src/lib.rs:3139`](../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3211`](../ui/dr-ui/src/lib.rs#L3211), [`ui/dr-ui/src/lib.rs:411`](../ui/dr-ui/src/lib.rs#L411), [`ui/dr-ui/ui/app.slint:131`](../ui/dr-ui/ui/app.slint#L131), [`ui/dr-ui/ui/app.slint:2445`](../ui/dr-ui/ui/app.slint#L2445), [`ui/dr-ui/ui/app.slint:2460`](../ui/dr-ui/ui/app.slint#L2460), [`ui/dr-ui/ui/app.slint:2780`](../ui/dr-ui/ui/app.slint#L2780), [`ui/dr-ui/ui/history.slint:102`](../ui/dr-ui/ui/history.slint#L102), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:226`](../ui/dr-ui/ui/history.slint#L226), [`ui/dr-ui/ui/history.slint:53`](../ui/dr-ui/ui/history.slint#L53), [`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:1092`](../core/dr-pipeline/src/graph.rs#L1092), [`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:717`](../core/dr-pipeline/src/operation.rs#L717), [`core/dr-pipeline/src/sidecar.rs:1071`](../core/dr-pipeline/src/sidecar.rs#L1071), [`core/dr-pipeline/src/sidecar.rs:1125`](../core/dr-pipeline/src/sidecar.rs#L1125), [`core/dr-pipeline/src/sidecar.rs:1155`](../core/dr-pipeline/src/sidecar.rs#L1155), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:888`](../core/dr-pipeline/src/sidecar.rs#L888), [`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:3209`](../ui/dr-ui/src/develop.rs#L3209), [`ui/dr-ui/src/develop.rs:3247`](../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/develop.rs:3312`](../ui/dr-ui/src/develop.rs#L3312), [`ui/dr-ui/src/develop.rs:3395`](../ui/dr-ui/src/develop.rs#L3395), [`ui/dr-ui/src/develop.rs:3409`](../ui/dr-ui/src/develop.rs#L3409), [`ui/dr-ui/src/develop.rs:904`](../ui/dr-ui/src/develop.rs#L904), [`ui/dr-ui/src/labels.rs:80`](../ui/dr-ui/src/labels.rs#L80), [`ui/dr-ui/src/lib.rs:2028`](../ui/dr-ui/src/lib.rs#L2028), [`ui/dr-ui/src/lib.rs:3364`](../ui/dr-ui/src/lib.rs#L3364), [`ui/dr-ui/src/lib.rs:453`](../ui/dr-ui/src/lib.rs#L453), [`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:2301`](../ui/dr-ui/ui/app.slint#L2301), [`ui/dr-ui/ui/app.slint:2503`](../ui/dr-ui/ui/app.slint#L2503), [`ui/dr-ui/ui/app.slint:3079`](../ui/dr-ui/ui/app.slint#L3079), [`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:2366`](../core/dr-gpu/src/adjust.rs#L2366), [`core/dr-gpu/src/adjust.rs:2443`](../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:2528`](../core/dr-gpu/src/adjust.rs#L2528), [`core/dr-gpu/src/adjust.rs:54`](../core/dr-gpu/src/adjust.rs#L54), [`core/dr-gpu/src/adjust.rs:798`](../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:174`](../core/dr-gpu/src/lib.rs#L174), [`core/dr-gpu/src/lib.rs:194`](../core/dr-gpu/src/lib.rs#L194), [`core/dr-gpu/src/lib.rs:72`](../core/dr-gpu/src/lib.rs#L72), [`core/dr-gpu/src/lib.rs:95`](../core/dr-gpu/src/lib.rs#L95), [`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:922`](../core/dr-pipeline/src/graph.rs#L922), [`core/dr-pipeline/src/graph.rs:952`](../core/dr-pipeline/src/graph.rs#L952), [`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:4030`](../ui/dr-ui/src/develop.rs#L4030), [`ui/dr-ui/src/develop.rs:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:6068`](../ui/dr-ui/src/develop.rs#L6068), [`ui/dr-ui/src/develop.rs:7608`](../ui/dr-ui/src/develop.rs#L7608), [`ui/dr-ui/src/develop.rs:7642`](../ui/dr-ui/src/develop.rs#L7642), [`ui/dr-ui/src/lib.rs:100`](../ui/dr-ui/src/lib.rs#L100), [`ui/dr-ui/src/lib.rs:1026`](../ui/dr-ui/src/lib.rs#L1026), [`ui/dr-ui/src/lib.rs:1085`](../ui/dr-ui/src/lib.rs#L1085) | @@ -97,10 +97,10 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:607`](../ui/dr-ui/src/lib.rs#L607), [`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:815`](../ui/dr-ui/src/settings_ui.rs#L815) | -| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1005`](../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:2813`](../ui/dr-ui/src/lib.rs#L2813), [`ui/dr-ui/src/lib.rs:607`](../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/lib.rs:653`](../ui/dr-ui/src/lib.rs#L653), [`ui/dr-ui/src/lib.rs:680`](../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library_ui.rs:4249`](../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8149`](../ui/dr-ui/src/library_ui.rs#L8149), [`ui/dr-ui/src/library_ui.rs:821`](../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8226`](../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8238`](../ui/dr-ui/src/library_ui.rs#L8238), [`ui/dr-ui/src/library_ui.rs:878`](../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1139`](../ui/dr-ui/ui/app.slint#L1139), [`ui/dr-ui/ui/app.slint:1716`](../ui/dr-ui/ui/app.slint#L1716), [`ui/dr-ui/ui/library.slint:1588`](../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4332`](../ui/dr-ui/ui/library.slint#L4332) | +| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1005`](../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:2813`](../ui/dr-ui/src/lib.rs#L2813), [`ui/dr-ui/src/lib.rs:607`](../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/lib.rs:653`](../ui/dr-ui/src/lib.rs#L653), [`ui/dr-ui/src/lib.rs:680`](../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library_ui.rs:4249`](../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8149`](../ui/dr-ui/src/library_ui.rs#L8149), [`ui/dr-ui/src/library_ui.rs:821`](../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8226`](../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8238`](../ui/dr-ui/src/library_ui.rs#L8238), [`ui/dr-ui/src/library_ui.rs:878`](../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1139`](../ui/dr-ui/ui/app.slint#L1139), [`ui/dr-ui/ui/app.slint:1716`](../ui/dr-ui/ui/app.slint#L1716), [`ui/dr-ui/ui/library.slint:1588`](../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4339`](../ui/dr-ui/ui/library.slint#L4339) | | FR-EXP-8 | [`core/dr-decode/src/lib.rs:366`](../core/dr-decode/src/lib.rs#L366), [`core/dr-decode/src/lib.rs:390`](../core/dr-decode/src/lib.rs#L390), [`core/dr-decode/src/lib.rs:404`](../core/dr-decode/src/lib.rs#L404), [`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:1233`](../core/dr-decode/src/locate.rs#L1233), [`core/dr-decode/src/locate.rs:1292`](../core/dr-decode/src/locate.rs#L1292), [`core/dr-decode/src/locate.rs:359`](../core/dr-decode/src/locate.rs#L359), [`core/dr-decode/src/locate.rs:556`](../core/dr-decode/src/locate.rs#L556), [`core/dr-decode/src/locate.rs:640`](../core/dr-decode/src/locate.rs#L640), [`core/dr-decode/src/locate.rs:653`](../core/dr-decode/src/locate.rs#L653), [`core/dr-decode/src/locate.rs:736`](../core/dr-decode/src/locate.rs#L736), [`core/dr-export/examples/export.rs:99`](../core/dr-export/examples/export.rs#L99), [`core/dr-export/src/encode.rs:117`](../core/dr-export/src/encode.rs#L117), [`core/dr-export/src/encode.rs:161`](../core/dr-export/src/encode.rs#L161), [`core/dr-export/src/encode.rs:1`](../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/encode.rs:206`](../core/dr-export/src/encode.rs#L206), [`core/dr-export/src/encode.rs:235`](../core/dr-export/src/encode.rs#L235), [`core/dr-export/src/encode.rs:311`](../core/dr-export/src/encode.rs#L311), [`core/dr-export/src/encode.rs:325`](../core/dr-export/src/encode.rs#L325), [`core/dr-export/src/encode.rs:408`](../core/dr-export/src/encode.rs#L408), [`core/dr-export/src/encode.rs:456`](../core/dr-export/src/encode.rs#L456), [`core/dr-export/src/encode.rs:70`](../core/dr-export/src/encode.rs#L70), [`core/dr-export/src/encode.rs:795`](../core/dr-export/src/encode.rs#L795), [`core/dr-export/src/encode.rs:809`](../core/dr-export/src/encode.rs#L809), [`core/dr-export/src/encode.rs:850`](../core/dr-export/src/encode.rs#L850), [`core/dr-export/src/encode.rs:898`](../core/dr-export/src/encode.rs#L898), [`core/dr-export/src/exif.rs:1`](../core/dr-export/src/exif.rs#L1), [`core/dr-export/src/lib.rs:140`](../core/dr-export/src/lib.rs#L140), [`core/dr-export/src/metadata.rs:1`](../core/dr-export/src/metadata.rs#L1), [`core/dr-export/src/metadata.rs:41`](../core/dr-export/src/metadata.rs#L41), [`core/dr-export/src/metadata.rs:74`](../core/dr-export/src/metadata.rs#L74), [`core/dr-types/src/lib.rs:655`](../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:671`](../core/dr-types/src/settings.rs#L671), [`ui/dr-ui/src/develop.rs:4581`](../ui/dr-ui/src/develop.rs#L4581), [`ui/dr-ui/src/develop.rs:4693`](../ui/dr-ui/src/develop.rs#L4693), [`ui/dr-ui/src/develop.rs:729`](../ui/dr-ui/src/develop.rs#L729), [`ui/dr-ui/src/export.rs:474`](../ui/dr-ui/src/export.rs#L474), [`ui/dr-ui/src/export.rs:641`](../ui/dr-ui/src/export.rs#L641), [`ui/dr-ui/src/export.rs:687`](../ui/dr-ui/src/export.rs#L687), [`ui/dr-ui/src/export.rs:715`](../ui/dr-ui/src/export.rs#L715), [`ui/dr-ui/src/export.rs:839`](../ui/dr-ui/src/export.rs#L839), [`ui/dr-ui/src/export.rs:857`](../ui/dr-ui/src/export.rs#L857), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:291`](../ui/dr-ui/src/lib.rs#L291), [`ui/dr-ui/src/lib.rs:639`](../ui/dr-ui/src/lib.rs#L639), [`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:546`](../core/dr-decode/src/lib.rs#L546), [`core/dr-export/src/lib.rs:132`](../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1134`](../core/dr-gpu/src/adjust.rs#L1134), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/develop.rs:4714`](../ui/dr-ui/src/develop.rs#L4714), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/lib.rs:607`](../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/library.rs:3889`](../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | -| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1576`](../ui/dr-ui/src/lib.rs#L1576), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1721`](../ui/dr-ui/ui/app.slint#L1721), [`ui/dr-ui/ui/app.slint:829`](../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/library.slint:1596`](../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4277`](../ui/dr-ui/ui/library.slint#L4277), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | +| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1576`](../ui/dr-ui/src/lib.rs#L1576), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1721`](../ui/dr-ui/ui/app.slint#L1721), [`ui/dr-ui/ui/app.slint:829`](../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/library.slint:1596`](../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4284`](../ui/dr-ui/ui/library.slint#L4284), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | | FR-MRG-10 | [`core/dr-gpu/src/merge.rs:1`](../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../core/dr-gpu/src/shaders/merge.wgsl#L1), [`core/dr-pano/src/lib.rs:1`](../core/dr-pano/src/lib.rs#L1) | | FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../core/dr-gpu/src/shaders/merge.wgsl#L1) | | FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | @@ -143,9 +143,9 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268) | | FR-RAW-5 | [`core/dr-decode/src/lib.rs:183`](../core/dr-decode/src/lib.rs#L183), [`core/dr-gpu/src/demosaic.rs:34`](../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:734`](../core/dr-gpu/src/demosaic.rs#L734), [`core/dr-gpu/src/demosaic.rs:813`](../core/dr-gpu/src/demosaic.rs#L813), [`core/dr-gpu/src/demosaic.rs:937`](../core/dr-gpu/src/demosaic.rs#L937) | | FR-UI-1 | [`core/dr-types/src/settings.rs:1377`](../core/dr-types/src/settings.rs#L1377), [`core/dr-types/src/settings.rs:492`](../core/dr-types/src/settings.rs#L492), [`core/dr-types/src/settings.rs:512`](../core/dr-types/src/settings.rs#L512), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/lib.rs:123`](../ui/dr-ui/src/lib.rs#L123), [`ui/dr-ui/src/lib.rs:145`](../ui/dr-ui/src/lib.rs#L145), [`ui/dr-ui/src/lib.rs:2711`](../ui/dr-ui/src/lib.rs#L2711), [`ui/dr-ui/src/lib.rs:4043`](../ui/dr-ui/src/lib.rs#L4043), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/src/lib.rs:4089`](../ui/dr-ui/src/lib.rs#L4089), [`ui/dr-ui/src/lib.rs:4140`](../ui/dr-ui/src/lib.rs#L4140), [`ui/dr-ui/src/lib.rs:4173`](../ui/dr-ui/src/lib.rs#L4173), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/settings_ui.rs:179`](../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:1010`](../ui/dr-ui/ui/app.slint#L1010), [`ui/dr-ui/ui/app.slint:2842`](../ui/dr-ui/ui/app.slint#L2842), [`ui/dr-ui/ui/app.slint:906`](../ui/dr-ui/ui/app.slint#L906), [`ui/dr-ui/ui/identity.slint:246`](../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`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:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../ui/dr-ui/ui/app.slint#L994), [`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:2621`](../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../ui/dr-ui/ui/library.slint#L4370), [`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:136`](../ui/dr-ui/ui/settings.slint#L136) | +| 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:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../ui/dr-ui/ui/app.slint#L994), [`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:2628`](../ui/dr-ui/ui/library.slint#L2628), [`ui/dr-ui/ui/library.slint:4377`](../ui/dr-ui/ui/library.slint#L4377), [`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:136`](../ui/dr-ui/ui/settings.slint#L136) | | 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:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`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:2859`](../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../ui/dr-ui/ui/masks.slint#L1216), [`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:126`](../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2207`](../ui/dr-ui/src/collections_ui.rs#L2207), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../ui/dr-ui/ui/app.slint#L712), [`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:2621`](../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../ui/dr-ui/ui/library.slint#L4370), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | +| 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:126`](../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2207`](../ui/dr-ui/src/collections_ui.rs#L2207), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../ui/dr-ui/ui/app.slint#L712), [`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:2628`](../ui/dr-ui/ui/library.slint#L2628), [`ui/dr-ui/ui/library.slint:4231`](../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:4377`](../ui/dr-ui/ui/library.slint#L4377), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | | 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:3329`](../ui/dr-ui/src/lib.rs#L3329), [`ui/dr-ui/src/lib.rs:4237`](../ui/dr-ui/src/lib.rs#L4237), [`ui/dr-ui/src/lib.rs:4428`](../ui/dr-ui/src/lib.rs#L4428), [`ui/dr-ui/src/masks_ui.rs:1518`](../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2569`](../ui/dr-ui/ui/app.slint#L2569), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`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:492`](../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop.rs:1330`](../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2325`](../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`ui/dr-ui/ui/toolrail.slint:89`](../ui/dr-ui/ui/toolrail.slint#L89) | @@ -153,7 +153,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:2780`](../ui/dr-ui/ui/app.slint#L2780) | | 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/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1) | -| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1822`](../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/src/lib.rs:2847`](../ui/dr-ui/src/lib.rs#L2847), [`ui/dr-ui/ui/app.slint:1150`](../ui/dr-ui/ui/app.slint#L1150), [`ui/dr-ui/ui/library.slint:4332`](../ui/dr-ui/ui/library.slint#L4332) | +| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1822`](../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/src/lib.rs:2847`](../ui/dr-ui/src/lib.rs#L2847), [`ui/dr-ui/ui/app.slint:1150`](../ui/dr-ui/ui/app.slint#L1150), [`ui/dr-ui/ui/library.slint:4339`](../ui/dr-ui/ui/library.slint#L4339) | | 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:521`](../ui/dr-ui/src/export.rs#L521) | | NFR-COMPAT-1 | [`core/dr-gpu/src/lib.rs:286`](../core/dr-gpu/src/lib.rs#L286) | | NFR-OPS-1 | [`core/dr-gpu/src/lib.rs:339`](../core/dr-gpu/src/lib.rs#L339), [`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:1241`](../ui/dr-ui/src/lib.rs#L1241), [`ui/dr-ui/ui/app.slint:1473`](../ui/dr-ui/ui/app.slint#L1473), [`ui/dr-ui/ui/app.slint:75`](../ui/dr-ui/ui/app.slint#L75), [`ui/dr-ui/ui/settings.slint:1015`](../ui/dr-ui/ui/settings.slint#L1015), [`ui/dr-ui/ui/settings.slint:154`](../ui/dr-ui/ui/settings.slint#L154) | diff --git a/tools/manual/drive.py b/tools/manual/drive.py index 5a87533..659f6d2 100755 --- a/tools/manual/drive.py +++ b/tools/manual/drive.py @@ -122,6 +122,26 @@ def drag(x1, y1, x2, y2, steps=20): x('mouseup', 1) +def drag_path(points, steps=20): + """A drag through several points: out of the grid sideways first, then + to the row. A diagonal with much vertical in it is taken by the grid's + Flickable as a scroll before the DragArea can claim it.""" + x('windowfocus', '--sync', win(), check=False) + (x1, y1), rest = points[0], points[1:] + move(x1, y1) + time.sleep(0.15) + x('mousedown', 1) + time.sleep(0.15) + for x2, y2 in rest: + for i in range(1, int(steps) + 1): + t = i / int(steps) + move(int(x1 + (x2 - x1) * t), int(y1 + (y2 - y1) * t)) + time.sleep(0.03) + x1, y1 = x2, y2 + time.sleep(0.4) + x('mouseup', 1) + + def rec_start(out): size = x('getwindowgeometry', win()).split('Geometry: ')[1].strip() ox, oy = geometry() diff --git a/tools/manual/scenes.py b/tools/manual/scenes.py index a07b834..97b0fa5 100755 --- a/tools/manual/scenes.py +++ b/tools/manual/scenes.py @@ -151,9 +151,21 @@ def library_keywords(): dr.click(*SELECT); pause(0.5) # leave selecting +def new_collection(name): + # `+` makes a collection inside whichever row is selected, so select the + # top first for a top-level one. + dr.click(60, 48); pause(0.5) + dr.click(212, 22); pause(0.4) + dr.x('type', '--delay', 90, name); dr.x('key', 'Return'); pause(1.2) + + +# The menu a right-click on a collection opens, at 1600×1100. +MENU = {'rename': (800, 496), 'inside': (800, 536), 'top': (800, 576), + 'offline': (800, 616), 'delete': (800, 669), 'cancel': (800, 709)} + + def library_collections(): - dr.click(212, 22); pause(0.3) # + in the collections header - dr.x('type', '--delay', 90, 'Alps'); dr.x('key', 'Return'); pause(1.2) + new_collection('Alps') rec('library-collections') dr.drag(*CELL_PANO_FIRST, *COLLECTION_ROW, 40); pause(1.5) dr.click(*SELECT); pause(0.5) @@ -163,10 +175,34 @@ def library_collections(): dr.click(*SELECT); pause(0.5) dr.click(*COLLECTION_ROW); pause(1.5) cut() - shot('library-collection') dr.click(60, 48); pause(1.2) # All photographs +def library_nesting(): + # Continues from library_collections: "Alps" exists with photographs in + # it. Make "Trips", drag Alps into it, make "New York" inside Trips from + # the menu, file frames there, then open Trips to see it count both. + new_collection('Trips') + rec('library-nesting') + pause(0.5) + dr.drag(60, 90, 60, 128, 30); pause(1.5) # Alps onto Trips + dr.click(60, 90, 3); pause(1.2) # the menu, on Trips + dr.click(*MENU['inside']); pause(0.6) + dr.x('type', '--delay', 90, 'New York'); dr.x('key', 'Return'); pause(1.2) + dr.click(*SELECT); pause(0.5) + dr.click(963, 525); pause(0.3) + dr.x('keydown', 'shift'); dr.click(1502, 525); dr.x('keyup', 'shift'); pause(0.8) + dr.drag_path([(1143, 525), (200, 525), (90, 146)], 25); pause(1.5) # four frames into New York + dr.click(*SELECT); pause(0.5) + dr.click(60, 90); pause(1.5) # Trips: both children + cut() + shot('library-nesting') + dr.click(90, 146, 3); pause(1.2) # the menu, on New York + shot('library-collection-menu') + dr.click(*MENU['cancel']); pause(0.8) + dr.click(60, 48); pause(1.2) + + # --- develop ---------------------------------------------------------------- def develop(): open_chinatown() @@ -309,7 +345,7 @@ def settings(): ALL = [ 'library', 'library_rating', 'library_timeline', 'library_thumbsize', - 'library_selection', 'library_keywords', 'library_collections', + 'library_selection', 'library_keywords', 'library_collections', 'library_nesting', 'develop', 'develop_groups', 'develop_light', 'develop_zoom', 'develop_wb', 'compose', 'local_segment', 'local_paint', 'local_done', 'repair', 'film', 'presets', 'panorama', 'settings', From 39a22875b126231033cb4152fb78e14d3e42cf29 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 19:21:44 +0200 Subject: [PATCH 04/13] Add the MIGraphX rung for AMD GPUs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measured on a Radeon RX 7900 XT against Arch's onnxruntime-rocm 1.29 (docs/inference.md §1.3): MIGraphX fp16 runs the detectors at 2.4–3.4 ms against 10–58 ms on the CPU provider, the inpainter at 8 ms against 514, with a 15–135 s compile per graph the first time and under a second from its cache after. A compiling rung on TensorRT's terms, wired the same way. The ROCm execution provider is gone (removed in ONNX Runtime 1.23), so the AMD ladder is MIGraphX then the CPU, with no non-compiling rung between. MIGraphX is registered through the runtime's generic key/value entry point rather than ort's builder: 1.29 reads the legacy options struct for its precision flags only, and the compiled-program cache directory (`migraphx_model_cache_dir`) only travels the generic way. The provider's cache key omits the precision, so f32 and fp16 programs get their own directories. The probe fingerprint now includes the provider libraries beside the runtime and the ROCm version, since a distribution's CPU and ROCm builds are the same file at the same path. `status().failed` reports only the rungs above the selection, so an AMD desktop's About line says why MIGraphX won rather than that the NVIDIA providers are not in the build. Two examples: `ep_probe` times each provider cold and from cache, and `ladder` drives `init` as the app does to watch the first-run sequence. Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 24 ++ Cargo.lock | 1 + core/dr-inference-engine/Cargo.toml | 10 +- core/dr-inference-engine/examples/ep_probe.rs | 207 ++++++++++++++++++ core/dr-inference-engine/examples/ladder.rs | 100 +++++++++ core/dr-inference-engine/src/lib.rs | 60 ++++- core/dr-inference-engine/src/probe.rs | 52 ++++- core/dr-inference-engine/src/session.rs | 59 ++++- docs/inference.md | 90 ++++++-- tools/fetch-desktop-runtime.sh | 5 + 10 files changed, 575 insertions(+), 33 deletions(-) create mode 100644 core/dr-inference-engine/examples/ep_probe.rs create mode 100644 core/dr-inference-engine/examples/ladder.rs diff --git a/CLAUDE.md b/CLAUDE.md index 1fe4ca2..0dd3f86 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -89,6 +89,30 @@ three `405`s before each `MOVE`. The backend now remembers the collections it has confirmed (`known_dirs`) for its lifetime, which is one job. When a per-file operation has a per-batch precondition, satisfy it once. +## Providers: read the runtime's source for the version on disk, not the binding + +Two things the MIGraphX rung (2026-09-20) got wrong before it was measured +right, both because `ort`'s builder was trusted to mean what its method +names say. + +**A binding's option builder may fill a struct the runtime no longer +reads.** `ep::MIGraphX::with_save_model` sets fields of the legacy +`OrtMIGraphXProviderOptions`; ONNX Runtime 1.29 reads that struct for the +precision flags and ignores the rest, so every session compiled for 40 s +and the cache directory went nowhere. The option that works +(`migraphx_model_cache_dir`) exists only in the generic key/value +registration, which `session::migraphx` calls on the API table directly. +Before wiring a provider option, fetch the provider's source at the +runtime's exact version and find where the option is *read*. + +**A provider's cache key may leave out what you are varying.** MIGraphX +keys a compiled program on graph, GPU and its own version — not precision. +The first fp16 measurement built in 0.3 s and matched f32 to the tenth of a +millisecond, because it had loaded the f32 program. A "from cache" build +that is suspiciously fast on the first run of a new configuration is a key +collision, not a fast provider; give each precision its own directory (the +engine does) and check the cache directory gained a file. + ## Measuring `cargo run --release -p dr-ui --example identity_bench -- CATALOG THUMBS` diff --git a/Cargo.lock b/Cargo.lock index 363b576..f22d197 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1515,6 +1515,7 @@ dependencies = [ name = "dr-inference-engine" version = "0.13.5" dependencies = [ + "env_logger", "libloading", "log", "ort", diff --git a/core/dr-inference-engine/Cargo.toml b/core/dr-inference-engine/Cargo.toml index 46da443..32f657f 100644 --- a/core/dr-inference-engine/Cargo.toml +++ b/core/dr-inference-engine/Cargo.toml @@ -28,7 +28,10 @@ ort-sys = { version = "2.0.0-rc.13", default-features = false, features = ["disa # The NVIDIA rungs exist on the desktop only. These features add `ort`'s # option builders and nothing else — no linking under `alternative-backend` — # but an Android binary has no business carrying even the option names, and -# the packaging must never be tempted to (§2, §3.1). +# the packaging must never be tempted to (§2, §3.1). The AMD rung needs no +# feature: MIGraphX is registered through the runtime's generic key/value +# entry point (`session::migraphx`), because `ort`'s own builder cannot +# name the compiled-program cache. [target.'cfg(not(target_os = "android"))'.dependencies] ort = { workspace = true, features = ["cuda", "tensorrt"] } @@ -42,3 +45,8 @@ default = ["tract"] tract = ["dep:ort-tract"] # Look for `libonnxruntime` on disk and hand its table to `ort`. native = ["dep:libloading", "dep:ort-sys"] + +[dev-dependencies] +# The `ep_probe` example prints the provider's own diagnostics, which is most +# of what a failed rung tells you. +env_logger.workspace = true diff --git a/core/dr-inference-engine/examples/ep_probe.rs b/core/dr-inference-engine/examples/ep_probe.rs new file mode 100644 index 0000000..bb1868e --- /dev/null +++ b/core/dr-inference-engine/examples/ep_probe.rs @@ -0,0 +1,207 @@ +//! Time each execution provider a runtime offers, on the models this +//! repository ships — the measurement docs/inference.md §1 requires before a +//! rung is added to §2's ladder. +//! +//! DARKROOM_ORT_DIR=/usr/lib \ +//! cargo run --release -p dr-inference-engine --features native,tract \ +//! --example ep_probe -- models/face/scrfd_500m_640.onnx ... +//! +//! Prints one row per (model, provider): the median of timed runs after +//! warm-ups, and the build time, which for a compiling provider is the +//! number that decides whether it needs an engine cache. MIGraphX is built +//! twice per precision — cold, then again from the cache it just wrote — +//! so both numbers are on the page. +//! +//! The ROCm provider is not in the list: ONNX Runtime removed it in 1.23, +//! and 1.29's `onnxruntime-rocm` ships `libonnxruntime_providers_migraphx.so` +//! and nothing else for AMD. + +use std::path::{Path, PathBuf}; +use std::time::Instant; + +#[derive(Clone, Copy, PartialEq)] +enum Ep { + Cpu, + MiGraphX, + MiGraphXFp16, +} + +impl Ep { + fn label(self) -> &'static str { + match self { + Ep::Cpu => "CPU", + Ep::MiGraphX => "MIGraphX f32", + Ep::MiGraphXFp16 => "MIGraphX fp16", + } + } +} + +fn build(ep: Ep, bytes: &[u8], threads: usize, cache: &Path) -> ort::Result { + let mut b = ort::session::Session::builder()?.with_intra_threads(threads)?; + match ep { + Ep::Cpu => {} + Ep::MiGraphX => migraphx(&mut b, false, &cache.join("f32"))?, + Ep::MiGraphXFp16 => migraphx(&mut b, true, &cache.join("fp16"))?, + } + b.commit_from_memory(bytes) +} + +/// Register MIGraphX through the generic key/value API. `ort`'s own +/// builder fills the legacy `OrtMIGraphXProviderOptions`, which 1.29 reads +/// for its precision flags and nothing else: the model cache directory — +/// the difference between a 40 s load and a 0.3 s one — only travels this +/// way. The cache key is the graph, the GPU and the MIGraphX version, not +/// the precision, so each precision gets its own directory. +fn migraphx( + b: &mut ort::session::builder::SessionBuilder, + fp16: bool, + cache: &Path, +) -> ort::Result<()> { + use ort::AsPointer; + use std::ffi::CString; + std::fs::create_dir_all(cache).map_err(|e| ort::Error::new(e.to_string()))?; + let keys = [c"migraphx_fp16_enable", c"migraphx_model_cache_dir"]; + let values = [ + CString::new(if fp16 { "1" } else { "0" }).unwrap(), + CString::new(cache.to_string_lossy().as_bytes()).unwrap(), + ]; + let key_ptrs: Vec<_> = keys.iter().map(|k| k.as_ptr()).collect(); + let value_ptrs: Vec<_> = values.iter().map(|v| v.as_ptr()).collect(); + // SAFETY: the documented C call, over arrays that outlive it; the + // runtime copies the strings into its own options map. + unsafe { + let status = (ort::api().SessionOptionsAppendExecutionProvider)( + b.ptr_mut(), + c"MIGraphX".as_ptr(), + key_ptrs.as_ptr(), + value_ptrs.as_ptr(), + keys.len(), + ); + ort::Error::result_from_status(status) + } +} + +/// Median of `runs` timed runs over zeros, in milliseconds, after warm-ups. +fn time(session: &mut ort::session::Session, warmups: usize, runs: usize) -> Result { + let shape: Vec = session.inputs()[0] + .dtype() + .tensor_shape() + .ok_or("input is not a tensor")? + .iter() + .map(|&d| if d > 0 { d as usize } else { 1 }) + .collect(); + let zeros = vec![0f32; shape.iter().product()]; + let once = |s: &mut ort::session::Session| -> Result { + let input = ort::value::Tensor::from_array((shape.clone(), zeros.clone())) + .map_err(|e| e.to_string())?; + let t = Instant::now(); + let out = s.run(ort::inputs![input]).map_err(|e| e.to_string())?; + let _ = out[0] + .try_extract_tensor::() + .map_err(|e| e.to_string())?; + Ok(t.elapsed().as_secs_f64() * 1e3) + }; + for _ in 0..warmups { + once(session)?; + } + let mut times = Vec::with_capacity(runs); + for _ in 0..runs { + times.push(once(session)?); + } + times.sort_by(|a, b| a.partial_cmp(b).unwrap()); + Ok(times[times.len() / 2]) +} + +fn first_line(s: &str) -> String { + s.lines().next().unwrap_or("").chars().take(120).collect() +} + +fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); + + let models: Vec = std::env::args_os().skip(1).map(PathBuf::from).collect(); + if models.is_empty() { + eprintln!("usage: ep_probe MODEL.onnx [MODEL.onnx ...]"); + std::process::exit(2); + } + + dr_inference_engine::ensure_runtime(); + let runtime = dr_inference_engine::status().runtime; + println!("runtime: {}", runtime.label()); + if !runtime.is_native() { + println!("(tract: no provider to compare; set DARKROOM_ORT_DIR)"); + } + + let threads = std::thread::available_parallelism() + .map(|n| n.get().saturating_sub(2).max(1)) + .unwrap_or(1); + println!("intra-op threads: {threads}"); + let cache = std::env::temp_dir().join("darkroom-ep-probe"); + let _ = std::fs::remove_dir_all(&cache); + println!("compiled-program cache: {}\n", cache.display()); + + println!( + "{:<28} {:<15} {:>10} {:>10}", + "model", "provider", "build s", "median ms" + ); + for model in &models { + let bytes = match std::fs::read(model) { + Ok(b) => b, + Err(e) => { + println!("{:<28} read failed: {e}", name(model)); + continue; + } + }; + // A compiling provider is built twice: the second build reads the + // program the first wrote, and its time is what a launch after the + // first costs. + let plan = [ + (Ep::Cpu, false), + (Ep::MiGraphX, false), + (Ep::MiGraphX, true), + (Ep::MiGraphXFp16, false), + (Ep::MiGraphXFp16, true), + ]; + for (ep, cached) in plan { + let started = Instant::now(); + match build(ep, &bytes, threads, &cache) { + Ok(mut session) => { + let built = started.elapsed().as_secs_f64(); + match time(&mut session, 3, 15) { + Ok(ms) => println!( + "{:<28} {:<15} {:>10.1} {:>10.1}{}", + name(model), + ep.label(), + built, + ms, + if cached { " (from cache)" } else { "" } + ), + Err(e) => println!( + "{:<28} {:<15} {:>10.1} {:>10} {}", + name(model), + ep.label(), + built, + "ran ✗", + first_line(&e) + ), + } + } + Err(e) => println!( + "{:<28} {:<15} {:>21} {}", + name(model), + ep.label(), + "build ✗", + first_line(&e.to_string()) + ), + } + } + println!(); + } +} + +fn name(p: &Path) -> String { + p.file_name() + .unwrap_or(p.as_os_str()) + .to_string_lossy() + .into_owned() +} diff --git a/core/dr-inference-engine/examples/ladder.rs b/core/dr-inference-engine/examples/ladder.rs new file mode 100644 index 0000000..e7ee7ca --- /dev/null +++ b/core/dr-inference-engine/examples/ladder.rs @@ -0,0 +1,100 @@ +//! Walk the ladder as the app does — probe, engines, then a session — and +//! say what each step chose. The M5 check of docs/inference.md §6 without +//! the app around it. +//! +//! DARKROOM_ORT_DIR=/usr/lib \ +//! cargo run --release -p dr-inference-engine --features native,tract \ +//! --example ladder -- CACHE_DIR models/face/scrfd_500m_640.onnx [MODEL.onnx ...] +//! +//! Every model named is a `Detector` for the config's purposes, which is +//! enough to see the rung taken, the engines compiled and a session land +//! on it. Delete `CACHE_DIR` to see the first run again; keep it to see the +//! second. + +use std::path::PathBuf; +use std::time::{Duration, Instant}; + +fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); + let mut args = std::env::args_os().skip(1).map(PathBuf::from); + let (Some(cache_dir), models) = (args.next(), args.collect::>()) else { + eprintln!("usage: ladder CACHE_DIR MODEL.onnx [MODEL.onnx ...]"); + std::process::exit(2); + }; + if models.is_empty() { + eprintln!("usage: ladder CACHE_DIR MODEL.onnx [MODEL.onnx ...]"); + std::process::exit(2); + } + + let runtime_dirs: Vec = std::env::var_os("DARKROOM_ORT_DIR") + .map(PathBuf::from) + .into_iter() + .collect(); + let started = Instant::now(); + dr_inference_engine::init(dr_inference_engine::Config { + runtime_dirs, + cache_dir: cache_dir.clone(), + models: models + .iter() + .map(|p| (dr_inference_engine::Role::Detector, p.clone())) + .collect(), + embedded: Vec::new(), + ceiling: None, + threads: 0, + decay: Duration::ZERO, + }); + + let mut last = String::new(); + loop { + let s = dr_inference_engine::status(); + let line = format!( + "{} · {} · engines {}/{}{}", + s.line(), + if s.probing { + "probing" + } else { + s.reason.as_str() + }, + s.engines.0, + s.engines.1, + if s.failed.is_empty() { + String::new() + } else { + format!( + " · tried {}", + s.failed + .iter() + .map(|(r, why)| format!("{}: {why}", r.label())) + .collect::>() + .join(" · ") + ) + } + ); + if line != last { + println!("{:>6.1} s {line}", started.elapsed().as_secs_f64()); + last = line; + } + if !s.probing && s.engines.0 >= s.engines.1 { + break; + } + std::thread::sleep(Duration::from_millis(500)); + } + + for path in &models { + let bytes = std::fs::read(path).expect("read model"); + let t = Instant::now(); + let model = dr_inference_engine::open( + dr_inference_engine::Role::Detector, + dr_inference_engine::Form::F32, + &bytes, + ) + .expect("open model"); + let acquired = model.acquire().expect("acquire session"); + println!( + "{} on {} in {:.2} s", + path.file_name().unwrap().to_string_lossy(), + acquired.rung().label(), + t.elapsed().as_secs_f64() + ); + } +} diff --git a/core/dr-inference-engine/src/lib.rs b/core/dr-inference-engine/src/lib.rs index 22848d2..242c2bb 100644 --- a/core/dr-inference-engine/src/lib.rs +++ b/core/dr-inference-engine/src/lib.rs @@ -3,8 +3,8 @@ //! //! Consumers ask for a session by [`Role`] and get `ort`'s `Session` back; //! what built it — tract on one core, ONNX Runtime's CPU pool, a TensorRT -//! engine, the Hexagon — is this crate's business and shows up in -//! [`status`] for the settings row and nowhere else. +//! engine, a MIGraphX program, the Hexagon — is this crate's business and +//! shows up in [`status`] for the settings row and nowhere else. //! //! The shape follows §3 of the spec: `ort` links nothing (`alternative-backend`), //! and the first call hands it an API table from either a `libonnxruntime` @@ -60,7 +60,9 @@ pub enum Form { /// A rung of the ladder (§2). Ordered: a user override names the highest rung /// the probe may take, and a compiling rung falls back to the one below it -/// until its engine exists. +/// until its engine exists. The order is within a vendor's ladder — a +/// machine has NVIDIA rungs or an AMD rung, never both — so a ceiling is +/// read as "no higher than this on whichever ladder the device has". #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub enum Rung { /// ONNX Runtime's CPU provider, or tract when no runtime file was found. @@ -69,6 +71,11 @@ pub enum Rung { Cuda, /// NVIDIA, through a TensorRT engine compiled on this device. Desktop only. TensorRt, + /// AMD, through a MIGraphX program compiled on this device. Desktop + /// only. ONNX Runtime's ROCm provider, the CUDA provider's twin, was + /// removed in ONNX Runtime 1.23, so there is no non-compiling AMD rung + /// to fall back to: this one falls back to the CPU. + MiGraphX, /// Qualcomm's Hexagon NPU through QNN, int8 models only. Android only. Hexagon, } @@ -79,6 +86,7 @@ impl Rung { Rung::Cpu => "CPU", Rung::Cuda => "CUDA", Rung::TensorRt => "TensorRT", + Rung::MiGraphX => "MIGraphX", Rung::Hexagon => "Hexagon NPU", } } @@ -88,13 +96,13 @@ impl Rung { fn fallback(self) -> Rung { match self { Rung::TensorRt => Rung::Cuda, - Rung::Hexagon | Rung::Cuda | Rung::Cpu => Rung::Cpu, + Rung::MiGraphX | Rung::Hexagon | Rung::Cuda | Rung::Cpu => Rung::Cpu, } } /// Whether a session on this rung needs an engine built first. fn compiles(self) -> bool { - matches!(self, Rung::TensorRt | Rung::Hexagon) + matches!(self, Rung::TensorRt | Rung::MiGraphX | Rung::Hexagon) } /// The model form this rung wants for a role. @@ -164,7 +172,7 @@ impl Status { pub fn line(&self) -> String { let form = match self.rung { Rung::Hexagon => " · int8", - Rung::TensorRt => " · fp16", + Rung::TensorRt | Rung::MiGraphX => " · fp16", _ => "", }; format!("{}{} · {}", self.rung.label(), form, self.runtime.label()) @@ -269,8 +277,8 @@ fn acquire(role: Role, form: Form, bytes: &Arc<[u8]>, hash: u64) -> Result Status { runtime: api::runtime(), rung, reason: s.cache.reason.clone(), - failed: s.cache.failed.clone(), + // Only what explains the selection: on an AMD machine the NVIDIA + // rungs "not enabled in this build" say nothing about why MIGraphX + // was taken. With the floor selected, everything tried is above it. + failed: s + .cache + .failed + .iter() + .filter(|(r, _)| *r > rung) + .cloned() + .collect(), probing: s.probing, engines: if rung.compiles() { (s.cache.compiled.len(), s.wanted) @@ -614,8 +631,33 @@ mod tests { ); } + #[test] + fn the_status_reports_only_the_rungs_above_the_selection() { + let _serial = serial(); + let failed = vec![ + (Rung::TensorRt, "not enabled".to_string()), + (Rung::Cuda, "not enabled".to_string()), + ]; + let before = state().lock().unwrap().cache.clone(); + state().lock().unwrap().cache = Cache { + rung: Some(Rung::MiGraphX), + failed: failed.clone(), + ..Cache::default() + }; + // An AMD desktop: the NVIDIA rungs below MIGraphX are not the story. + assert!(status().failed.is_empty()); + // An NVIDIA desktop on the CUDA provider: TensorRT's failure is. + state().lock().unwrap().cache.rung = Some(Rung::Cuda); + assert_eq!(status().failed, vec![failed[0].clone()]); + // The floor: everything tried explains it. + state().lock().unwrap().cache.rung = Some(Rung::Cpu); + assert_eq!(status().failed.len(), 2); + state().lock().unwrap().cache = before; + } + #[test] fn the_status_line_reads_as_the_floor_before_init() { + let _serial = serial(); let s = status(); assert_eq!(s.rung, Rung::Cpu); assert!(s.line().starts_with("CPU"), "{}", s.line()); diff --git a/core/dr-inference-engine/src/probe.rs b/core/dr-inference-engine/src/probe.rs index a9fd877..48366de 100644 --- a/core/dr-inference-engine/src/probe.rs +++ b/core/dr-inference-engine/src/probe.rs @@ -16,8 +16,11 @@ use crate::{api::Runtime, state, Cache, Config, Form, Role, Rung}; fn ladder(ceiling: Option) -> Vec { #[cfg(target_os = "android")] let all = [Rung::Hexagon]; + // A desktop has one vendor's GPU; the other vendor's providers are + // "not enabled in this build" or a library that fails to load, and + // either answer arrives in milliseconds. #[cfg(not(target_os = "android"))] - let all = [Rung::TensorRt, Rung::Cuda]; + let all = [Rung::TensorRt, Rung::Cuda, Rung::MiGraphX]; all.into_iter() .filter(|r| ceiling.is_none_or(|c| *r <= c)) .collect() @@ -206,15 +209,22 @@ fn first_line(s: &str) -> String { line[start..].chars().take(200).collect() } -/// Everything a change of which should re-probe: the runtime and where it -/// came from, this crate, the platform, the driver or SoC, and the models. +/// Everything a change of which should re-probe: the runtime, where it +/// came from and which providers sit beside it, this crate, the platform, +/// the driver or SoC, and the models. fn fingerprint(runtime: &Runtime, cfg: &Config) -> String { let mut parts = vec![ format!("engine {}", env!("CARGO_PKG_VERSION")), format!("{} {}", std::env::consts::OS, std::env::consts::ARCH), match runtime { Runtime::Tract => "tract".to_string(), - Runtime::OnnxRuntime { path, version } => format!("ort {version} {}", path.display()), + Runtime::OnnxRuntime { path, version } => { + format!( + "ort {version} {} [{}]", + path.display(), + providers_beside(path) + ) + } }, device_identity(), ]; @@ -237,13 +247,41 @@ fn fingerprint(runtime: &Runtime, cfg: &Config) -> String { parts.join("\n") } +/// The `libonnxruntime_providers_*.so` files in the runtime's directory. +/// A distribution's CPU-only and ROCm builds are the same version at the +/// same path; the provider libraries beside them are what differs. +fn providers_beside(runtime: &Path) -> String { + let Some(dir) = runtime.parent() else { + return String::new(); + }; + let mut names: Vec = std::fs::read_dir(dir) + .into_iter() + .flatten() + .filter_map(|e| e.ok()) + .filter_map(|e| e.file_name().into_string().ok()) + .filter(|n| { + n.starts_with("libonnxruntime_providers_") || n.starts_with("onnxruntime_providers_") + }) + .collect(); + names.sort(); + names.join(" ") +} + #[cfg(target_os = "linux")] fn device_identity() -> String { - // The NVIDIA driver's version line; absent means no NVIDIA driver. - std::fs::read_to_string("/proc/driver/nvidia/version") + // The NVIDIA driver's version line, or the ROCm release the AMD stack + // came from (`rocm-core` writes it; the kernel driver has no version + // of its own). Absent means neither. + if let Some(line) = std::fs::read_to_string("/proc/driver/nvidia/version") .ok() .and_then(|s| s.lines().next().map(str::to_string)) - .unwrap_or_else(|| "no nvidia driver".into()) + { + return line; + } + if let Ok(rocm) = std::fs::read_to_string("/opt/rocm/.info/version") { + return format!("rocm {}", rocm.trim()); + } + "no nvidia driver, no rocm".into() } #[cfg(target_os = "android")] diff --git a/core/dr-inference-engine/src/session.rs b/core/dr-inference-engine/src/session.rs index ff2cc54..77826ff 100644 --- a/core/dr-inference-engine/src/session.rs +++ b/core/dr-inference-engine/src/session.rs @@ -83,10 +83,65 @@ fn providers( ep::CUDA::default().build(), ])?) } + Rung::MiGraphX => { + // fp16 on the same terms as TensorRT (§7). MIGraphX compiles a + // program per graph — 20–60 s here — and keeps it in the cache + // directory, keyed on the graph, the GPU and its own version + // but not the precision: hence one directory per precision. + // The CPU takes any node it declines. + let fp16 = role != Role::Embedder; + let cache = cfg + .cache_dir + .join("migraphx") + .join(if fp16 { "fp16" } else { "f32" }); + let _ = std::fs::create_dir_all(&cache); + let mut b = b; + migraphx(&mut b, fp16, &cache)?; + Ok(b) + } Rung::Hexagon => unreachable!("the Hexagon rung is not on a desktop ladder"), } } +/// Register MIGraphX through ONNX Runtime's generic key/value entry point. +/// +/// `ort`'s own builder (`ep::MIGraphX`) fills the legacy +/// `OrtMIGraphXProviderOptions`, and 1.29 reads that struct for its +/// precision flags and nothing else — the compiled-program cache directory +/// is only a key in the generic map (`migraphx_model_cache_dir`), and +/// without it every session is a full compile. Registration through the +/// generic entry point needs no `ort` feature: it is one call on the API +/// table, which is why the crate's `ort` dependency names no AMD feature. +#[cfg(not(target_os = "android"))] +fn migraphx( + b: &mut ort::session::builder::SessionBuilder, + fp16: bool, + cache: &std::path::Path, +) -> ort::Result<()> { + use ort::AsPointer; + use std::ffi::CString; + let keys = [c"migraphx_fp16_enable", c"migraphx_model_cache_dir"]; + let values = [ + CString::new(if fp16 { "1" } else { "0" }).unwrap(), + CString::new(cache.to_string_lossy().as_bytes()) + .map_err(|e| ort::Error::new(e.to_string()))?, + ]; + let key_ptrs: Vec<_> = keys.iter().map(|k| k.as_ptr()).collect(); + let value_ptrs: Vec<_> = values.iter().map(|v| v.as_ptr()).collect(); + // SAFETY: the documented C call over arrays that outlive it; the + // runtime copies the strings into its own options map before returning. + unsafe { + let status = (ort::api().SessionOptionsAppendExecutionProvider)( + b.ptr_mut(), + c"MIGraphX".as_ptr(), + key_ptrs.as_ptr(), + value_ptrs.as_ptr(), + keys.len(), + ); + ort::Error::result_from_status(status) + } +} + #[cfg(target_os = "android")] fn providers( b: ort::session::builder::SessionBuilder, @@ -120,6 +175,8 @@ fn providers( .build() .error_on_failure()])?) } - Rung::Cuda | Rung::TensorRt => unreachable!("no NVIDIA rung on Android"), + Rung::Cuda | Rung::TensorRt | Rung::MiGraphX => { + unreachable!("no desktop GPU rung on Android") + } } } diff --git a/docs/inference.md b/docs/inference.md index 55a72c3..e821b7d 100644 --- a/docs/inference.md +++ b/docs/inference.md @@ -75,7 +75,49 @@ TensorRT's job. worst: nearly five minutes), because it is compiling an engine for this exact GPU. The engine caches to disk and the second load is milliseconds. That number is what §6 is designed around. -### 1.3 What the numbers say +### 1.3 The desktop — Radeon RX 7900 XT, Threadripper 2920X, 24 threads · 2026-09-20 + +Arch's `onnxruntime-rocm` 1.29.0 against ROCm 7.2.4 and MIGraphX 7.2.3 (gfx1100), through the +same `ep_probe` harness (`core/dr-inference-engine/examples/ep_probe.rs`). Zero input, three +warm-ups, the median of 15 runs, on a machine doing nothing else. The build columns are the wall +clock of `Session` construction: cold is a MIGraphX compile of the graph for this GPU, cached is the +same session loading the program the cold build wrote. + +| Model | ORT CPU f32 | MIGraphX f32 | **MIGraphX fp16** | Compile f32 / fp16 (s) | Cached load (s) | +|---|---|---|---|---|---| +| scrfd_500m (Fast) | 10.4 | 2.8 | **2.4** | 40 / 58 | 0.3 | +| scrfd_2.5g (Balanced) | 20.7 | 3.3 | **2.8** | 37 / 40 | 0.3 | +| scrfd_10g (Thorough) | 57.9 | 4.5 | **3.4** | 40 / 48 | 0.4 | +| arcface_mbf (per face) | 12.8 | 1.8 | 1.6 | 15 / 21 | 0.4 | +| yolo26n-seg | 49.3 | 8.4 | **7.5** | 110 / 136 | 0.9 | +| yolo26s-sem-ade20k | 55.8 | 4.8 | **3.8** | 50 / 60 | 0.5 | +| 2d106det (landmarks) | 9.9 | 1.2 | 1.0 | 16 / 21 | 0.2 | +| ocec_s (eye state) | 2.5 | 0.5 | 0.4 | 17 / 17 | 0.1 | +| xfeat-1024 | 26.8 | 10.5 | 9.9 | 37 / 53 | 0.3 | +| migan-512 (per tile) | 514 | 12.7 | **8.3** | 102 / 132 | 0.8 | + +Three things the table settles. + +- **The ROCm execution provider does not exist any more.** It was ONNX Runtime's CUDA-provider twin + for AMD, removed in the 1.23 release (AMD's builds dropped it from ROCm 7.1); 1.29's ROCm build ships + `libonnxruntime_providers_migraphx.so` and nothing else for AMD, and asking for `ROCm` answers + "not enabled in this build". So there is no non-compiling AMD rung to sit under MIGraphX the way + the CUDA provider sits under TensorRT: the AMD ladder is MIGraphX, then the CPU. +- **MIGraphX is a compiling provider, and its cache has to be asked for by name.** 15–135 s per + graph cold, under a second from its cache — TensorRT's shape exactly, and §6's design covers it. + Two things the provider does that the code has to know: `ort`'s builder fills the legacy options + struct, which 1.29 reads for the precision flags only, so the cache directory + (`migraphx_model_cache_dir`) reaches it only through the generic key/value registration; and + the cache key is the graph, the GPU and the MIGraphX version *without the precision*, so an fp16 + session pointed at the f32 program's directory silently loads the f32 program (the first fp16 + row measured here was that, before the directories were split). +- **fp16 is worth 10–35% over f32 on this card, not the 3× it is worth on TensorRT**, because + MIGraphX f32 is already 3–8× the CPU provider and the small graphs are launch-bound. The + detectors at 2.4–3.4 ms sit beside TensorRT fp16's 1.8–3.3 ms on the RTX 3050; the embedder is + 1.6–1.8 ms on either precision and stays f32 (§7). The whole face pipeline for one image + (detector + landmarks + eyes + embedder) is under 6 ms. + +### 1.4 What the numbers say - **`tract` is single-threaded.** The tablet's one X4 core and one Raptor Lake core give the same tract numbers. Replacing it with ONNX Runtime's CPU provider, *no accelerator involved*, is 3–6× @@ -92,6 +134,8 @@ number is what §6 is designed around. - **On NVIDIA, TensorRT fp16 ≈ 3× the CUDA provider**, and the CUDA provider ≈ 2× the multi-threaded CPU; at fp16 the detectors are 1.8–3.3 ms with no quantisation at all. Both leave the twenty cores free for decoding during a batch index, which the table does not show and which matters more than the ratio. +- **On AMD, MIGraphX fp16 is 4–17× the CPU provider** on the detectors and 60× on the + inpainter, with the same first-run compile cost as TensorRT and no rung between it and the CPU. --- @@ -105,7 +149,8 @@ winning: | Android, Qualcomm with a Hexagon the shipped QNN skel covers (V68–V81) | QNN HTP, int8 model | ORT CPU, f32 model | — | tract | | Android, any other SoC | ORT CPU, f32 | — | — | tract | | Linux / Windows, NVIDIA GPU | TensorRT, f32 model, fp16 engine | CUDA provider, f32 | ORT CPU, f32 | tract | -| Linux / Windows, no NVIDIA | ORT CPU, f32 | — | — | tract | +| Linux, AMD GPU with ROCm | MIGraphX, f32 model, fp16 program | ORT CPU, f32 | — | tract | +| Linux / Windows, no GPU stack | ORT CPU, f32 | — | — | tract | | macOS ⁵ | ORT CPU, f32 | — | — | tract | ⁵ CoreML is the obvious rung and is unmeasured; it is listed so its absence is a gap and not an @@ -113,8 +158,13 @@ oversight. Deliberately **not** on any ladder, with the measurement that excluded each: NNAPI (no driver), XNNPACK (slower than CPU, aborts on SCRFD), WebGPU (slower than CPU), the Adreno through QNN (works, -but never where the Hexagon does not also), CUDA int8 (slower than CUDA f32). A rung is added to this -table by a measurement on this page, not by a provider existing. +but never where the Hexagon does not also), CUDA int8 (slower than CUDA f32), the ROCm provider +(gone: §1.3). A rung is added to this table by a measurement on this page, not by a provider +existing. + +The AMD ladder has no middle rung. TensorRT falls back to the CUDA provider while its engines +compile; MIGraphX has no such twin, so its fallback is the CPU provider, and the minute or two of +compiling on first run (§6) is spent at the floor's speed rather than at half the GPU's. Two things the ladder is *not*: it is not a per-model choice — one backend serves every model on a device, because §7's identity rule needs the detector and embedder on the same runtime for the @@ -174,9 +224,10 @@ is cheaper than discovering it at packaging time. | ONNX Runtime | MIT | Yes | | Qualcomm QNN runtime (`com.qualcomm.qti:qnn-runtime` on Maven) | Qualcomm AI Engine Direct SDK licence — proprietary, redistribution permitted for applications using it | Yes for the APK, with the licence text shipped; not for a source distribution. **To be read in full, not summarised from memory, before the APK gains it.** | | CUDA runtime, cuDNN, TensorRT | NVIDIA EULAs — redistributable with an application, with the licence text, not modifiable | Yes for a package that bundles them. 600 MB. The alternative is to load them from the user's system install if present and skip the rung otherwise — which is what §4's probe does anyway. | +| ROCm (HIP, MIOpen, rocBLAS), MIGraphX | MIT | Yes, but the HIP SDK MIGraphX needs is ~15 GB installed. Same answer as NVIDIA: the user's system install, or the rung is skipped. | -The position this takes: the **NVIDIA libraries are not bundled**. The desktop package probes for a -system CUDA/TensorRT install and uses it if it is version-compatible; a desktop without one runs on +The position this takes: the **GPU vendors' libraries are not bundled**. The desktop package probes for a +system CUDA/TensorRT or ROCm/MIGraphX install and uses it if it is version-compatible; a desktop without one runs on ORT CPU, which is still 8–10× today. Bundling 600 MB for a rung that is 2× again is not a trade worth making unmeasured, and it can be revisited by a measurement on a batch index. The **QNN runtime is bundled** in the APK, because the Hexagon is the difference between a tablet that @@ -237,6 +288,7 @@ of which form they load: | f32 ONNX, shape-fixed, **opset ≥ 13** | `tools/fix-face-model-shapes.sh`, `tools/export-seg-model.sh` | Release time, once | Every rung except Hexagon | | int8 QDQ ONNX, per-channel, uint8 activations | `tools/quantise-models.sh` (new) | Release time, once, **calibrated on real photographs** | Hexagon | | TensorRT engine (`.engine`, per GPU architecture and TensorRT version) | The app, from the f32 file | First run on that device, in the background | TensorRT rung | +| MIGraphX program (`.mxr`, per GPU architecture, MIGraphX version and precision) | The app, from the f32 file | First run on that device, in the background | MIGraphX rung | | QNN context binary | The app, from the int8 file | First run on that device, in the background | Hexagon rung | Two rules. @@ -256,9 +308,12 @@ prefers. That is a change to the canonical file and so a change to the shipped m happens in the same model release as the int8 files. **Compilation is a device-time step, and it is cached.** A TensorRT engine is specific to the GPU -it was built on and the TensorRT that built it; a QNN context binary is specific to the Hexagon -generation. Neither can ship. Both are built by the app the first time that rung is selected, in -the background (§6), and written beside the probe cache keyed by the same inputs. They are +it was built on and the TensorRT that built it; a MIGraphX program to the GPU and the MIGraphX +that built it; a QNN context binary to the Hexagon generation. None can ship. All are built by +the app the first time that rung is selected, in the background (§6), and written beside the +probe cache keyed by the same inputs. MIGraphX's own key leaves out the precision, so the app +gives its f32 and fp16 programs separate directories — otherwise the embedder's f32 build would +be served the detector's fp16 program, or the reverse. They are **derived, disposable, and regenerable**: deleting the cache directory costs the next launch a rebuild and nothing else, and the directory is excluded from anything that syncs (it is a peer of `thumbs`, not of the catalog). @@ -267,17 +322,18 @@ rebuild and nothing else, and the directory is excluded from anything that syncs ## 6. First run — building engines without the user waiting for them -The sequence on a device where a compiling rung (TensorRT, Hexagon) is selected: +The sequence on a device where a compiling rung (TensorRT, MIGraphX, Hexagon) is selected: 1. **Launch.** The runtime loads; the probe (§4) starts in the background; the app serves every model request from the floor. Face indexing, segmentation and scene grading all work, at today's speed or better (ORT CPU). 2. **Probe reports** — say, TensorRT. The compiling rung is now *selected* but has **no engines**. Model requests continue on the fallback rung below it (CUDA provider for TensorRT; ORT CPU for - Hexagon), which needs no compilation and is already faster than the floor. + MIGraphX and Hexagon), which needs no compilation and is already faster than the floor. 3. **Engines build**, one model at a time, on a single low-priority background thread, smallest model first so the detector — the one that runs per image — is ready soonest. On the reference - desktop that is ~1 minute for the first detector and ~10 minutes for all six at fp16; on the tablet the QNN + desktop that is ~1 minute for the first detector and ~10 minutes for all six at fp16; on the AMD + desktop 40 s for the first detector and ~8 minutes for the set; on the tablet the QNN context binaries take 0.8–1.7 s each and the whole set is ready before the user has opened a library. Each engine is written to a temporary name and renamed into place, so a request never sees a half-written file. @@ -313,7 +369,7 @@ enough to be *offered* at all. f32 on tract, ORT CPU, CUDA and TensorRT-f32 are same graph, the same arithmetic, differences at the last bit. **The embedder** is where comparability across devices is the whole point, and it is the one -model that no accelerator helps (§1.3). So: **the embedder runs in f32 on every rung.** On TensorRT +model that no accelerator helps (§1.4). So: **the embedder runs in f32 on every rung.** On TensorRT that means the embedder's engine is built without fp16 while the detector's is built with it; on the Hexagon it means the embedder is not on the NPU at all — it runs on the ORT CPU rung at 9 ms, and the ladder's "one backend per device" is, precisely, one backend *per model role*, with the @@ -344,7 +400,7 @@ core/dr-inference-engine src/probe.rs §4 — the ladder per platform, the session-build probe, the cache file src/engines.rs §6 — background compilation, the cache directory, progress src/session.rs open(role, bytes) -> ort::Session, applying the rung and the role's precision rule - src/api.rs the one unsafe block: dlopen libonnxruntime, fetch OrtApi, ort::set_api — or ort_tract::api() + src/api.rs the unsafe block that matters: dlopen libonnxruntime, fetch OrtApi, ort::set_api — or ort_tract::api() ``` - `dr-face` and `dr-segment` **delete** their private `install_backend` and their direct @@ -354,7 +410,11 @@ core/dr-inference-engine `qnn`: those features add option builders, not linking, under `alternative-backend`. **Verified for the QNN, CUDA and TensorRT builders on 2026-09-19** — they go through the API table's generic `SessionOptionsAppendExecutionProvider*`. The NNAPI builder resolves a symbol directly and would - not; it is not needed and is not enabled. + not; it is not needed and is not enabled. MIGraphX uses no `ort` feature at all: `ort`'s builder + fills the legacy options struct, which ONNX Runtime 1.29 reads for the precision flags and + nothing else, and the compiled-program cache directory only travels through the generic + key/value entry point (`migraphx_model_cache_dir`). `session::migraphx` makes that one call + on the API table itself. - `dr-ui` owns the settings row, the about-screen line and the progress row; it holds one `Sessions` per process, created at launch, and passes it down. `dr_ui::library` gains `inference_cache_dir()` beside `shared_face_models_dir()`, on the same account-independent diff --git a/tools/fetch-desktop-runtime.sh b/tools/fetch-desktop-runtime.sh index 2cd4875..337c26d 100755 --- a/tools/fetch-desktop-runtime.sh +++ b/tools/fetch-desktop-runtime.sh @@ -13,6 +13,11 @@ # which is what this script exists to fix. Nothing NVIDIA is bundled here: # the providers load CUDA, cuDNN and TensorRT from the system, and if those # are missing the probe says so and the app stays on the CPU. +# +# This is the NVIDIA script. On AMD there is nothing to fetch: the +# distribution's ROCm build of ONNX Runtime (Arch's `onnxruntime-rocm`) +# carries the MIGraphX provider, and the app finds it in the system library +# directory (docs/inference.md §1.3). set -euo pipefail DEST="${1:-${XDG_DATA_HOME:-${HOME}/.local/share}/darkroom/runtime}" WORK="$(mktemp -d -p /var/tmp fetch-desktop-runtime.XXXXXX)" From 8a90d888d587fabf45f8959c66266be1e5d1927c Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 19:39:05 +0200 Subject: [PATCH 05/13] Probe and compile for a package's models, not only the user's `inference::init` listed the models from the user's shared directory alone, while the app loads them from there or from the package's `/usr/share/darkroom/models`. On a fresh package install the probe found "no model to probe with", stayed on the CPU, and compiled nothing. Both now resolve each file with the same search, `library::shared_model`. The PKGBUILD names the ONNX Runtime packages as optional dependencies, since the app loads one from /usr/lib if present. Co-Authored-By: Claude Opus 5 (1M context) --- packaging/PKGBUILD | 7 ++++++- ui/dr-ui/src/inference.rs | 44 +++++++++++++++++++++------------------ ui/dr-ui/src/library.rs | 17 +++++++++++---- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index 8f9bfe0..9a9c605 100644 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -16,8 +16,13 @@ license=('GPL-3.0-or-later') # Nextcloud credentials (FR-NC-2) — gnome-keyring or kwallet both provide it. depends=('vulkan-icd-loader' 'fontconfig' 'libxkbcommon') makedepends=('cargo' 'git') +# ONNX Runtime is loaded from /usr/lib at launch if a package put it there +# (docs/inference.md §3): the CPU build is 8–10× the built-in tract, the +# ROCm build adds the MIGraphX rung on an AMD GPU. Neither is required. optdepends=('gnome-keyring: store Nextcloud credentials' - 'kwallet: store Nextcloud credentials') + 'kwallet: store Nextcloud credentials' + 'onnxruntime-cpu: run the neural models on every core' + 'onnxruntime-rocm: run the neural models on an AMD GPU') options=('!lto') # the workspace sets its own LTO in Cargo.toml _repo="$(cd "${startdir}/.." && pwd)" diff --git a/ui/dr-ui/src/inference.rs b/ui/dr-ui/src/inference.rs index 38b3ae3..bae0762 100644 --- a/ui/dr-ui/src/inference.rs +++ b/ui/dr-ui/src/inference.rs @@ -19,23 +19,26 @@ use dr_types::FaceDetector; /// fingerprints the model files and a probe before they land would be a /// probe of nothing. pub fn init(runtime_dirs: Vec) { - let dir = crate::library::shared_face_models_dir(); - let mut models: Vec<(Role, PathBuf)> = FaceDetector::ALL + // Each file where the app will actually load it from — the user's + // shared directory, else the package's — so a fresh install with models + // only under `/usr/share` probes and compiles for them rather than + // finding nothing and settling on the CPU. + let mut wanted: Vec<(Role, &str)> = FaceDetector::ALL .iter() - .map(|d| (Role::Detector, dir.join(d.file_name()))) + .map(|d| (Role::Detector, d.file_name())) + .collect(); + wanted.extend([ + (Role::Embedder, "arcface_mbf_b1.onnx"), + (Role::Scene, "yolo26s-sem-ade20k.onnx"), + (Role::Landmarks, crate::library::LANDMARK_MODEL), + (Role::EyeClassifier, crate::library::EYE_MODEL), + (Role::EyeClassifier, crate::library::SUNGLASSES_MODEL), + (Role::Inpainter, crate::library::INPAINT_MODEL), + ]); + let models: Vec<(Role, PathBuf)> = wanted + .into_iter() + .filter_map(|(role, name)| Some((role, crate::library::shared_model(name)?))) .collect(); - models.push((Role::Embedder, dir.join("arcface_mbf_b1.onnx"))); - models.push((Role::Scene, dir.join("yolo26s-sem-ade20k.onnx"))); - models.push((Role::Landmarks, dir.join(crate::library::LANDMARK_MODEL))); - models.push((Role::EyeClassifier, dir.join(crate::library::EYE_MODEL))); - models.push(( - Role::EyeClassifier, - dir.join(crate::library::SUNGLASSES_MODEL), - )); - if let Some(p) = crate::library::inpaint_model() { - models.push((Role::Inpainter, p)); - } - models.retain(|(_, p)| p.is_file()); dr_inference_engine::init(dr_inference_engine::Config { runtime_dirs, @@ -75,12 +78,13 @@ pub fn user_runtime_dir() -> PathBuf { /// Which form the current backend loads `detector` in, given the files on /// this device — the fact `faces.model_id` has to carry (§7). /// -/// Reads the shared directory only. An account-private model directory can -/// override the file `library::face_models` loads, but not which form the -/// backend wants, and the int8 sibling is something a packager ships, not -/// something a user drops in. +/// Reads the shared and system directories only. An account-private model +/// directory can override the file `library::face_models` loads, but not +/// which form the backend wants, and the int8 sibling is something a +/// packager ships, not something a user drops in. pub fn detector_form(detector: FaceDetector) -> Form { - let canonical = crate::library::shared_face_models_dir().join(detector.file_name()); + let canonical = crate::library::shared_model(detector.file_name()) + .unwrap_or_else(|| crate::library::shared_face_models_dir().join(detector.file_name())); dr_inference_engine::resolve_model(Role::Detector, &canonical).1 } diff --git a/ui/dr-ui/src/library.rs b/ui/dr-ui/src/library.rs index 2e31075..7a3b539 100644 --- a/ui/dr-ui/src/library.rs +++ b/ui/dr-ui/src/library.rs @@ -4463,6 +4463,18 @@ fn system_face_models_dirs() -> Vec { .collect() } +/// The file `name` in the shared user models directory, else in the first +/// system directory that has it — the search every account-independent +/// model lookup makes, and the one the inference engine is told about, so +/// that a package's models under `/usr/share` are probed and compiled for +/// exactly as a user's own would be. +pub fn shared_model(name: &str) -> Option { + std::iter::once(shared_face_models_dir()) + .chain(system_face_models_dirs()) + .map(|d| d.join(name)) + .find(|p| p.is_file()) +} + /// TRACES: FR-MRG-4 /// The panorama border filler, as shipped in `models/inpaint/`. pub const INPAINT_MODEL: &str = "migan-512.onnx"; @@ -4473,10 +4485,7 @@ pub const INPAINT_MODEL: &str = "migan-512.onnx"; /// the per-account step, because a fill is not identity-bearing and no /// library has a reason to pin its own. pub fn inpaint_model() -> Option { - std::iter::once(shared_face_models_dir()) - .chain(system_face_models_dirs()) - .map(|d| d.join(INPAINT_MODEL)) - .find(|p| p.is_file()) + shared_model(INPAINT_MODEL) } /// One grid cell's data, read from the catalog. From 8d72cabff5d83019c5328e4158a65316033fc8ec Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 18:34:41 +0200 Subject: [PATCH 06/13] Ship the border filler trained against MI-GAN's own discriminator: texture in the deep bands, level with stock on LPIPS --- docs/panorama.md | 27 +++++++++++++++++++++------ models/LICENCE.md | 2 +- models/inpaint/migan-512.onnx | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/docs/panorama.md b/docs/panorama.md index 904efcc..de95209 100644 --- a/docs/panorama.md +++ b/docs/panorama.md @@ -538,9 +538,24 @@ each loss weighting did, and the two runs abandoned (blur under L1 in the hole; a brick pattern under a strong adversarial term against a discriminator that had not learned) — is `runs/` in `darkroom-infill`. -**What is still wrong.** The ground fill is softer than its context — -texture, not structure, is what a night on a laptop GPU could not finish. -The levers, in order: a discriminator that learns (a pretrained one — -MI-GAN's own from the unfused checkpoint — instead of a PatchGAN from -scratch), feature matching, and more steps at 512. FR-MRG-4's -*experimental* stays. +**Second model, the same day.** The morning's fill was soft in the deep +ground bands. The afternoon's run trained the generator against MI-GAN's +own pretrained discriminator (non-saturating loss, lazy R1, feature +matching), with fresh noise inputs while training and flip/translation +augmentation of the discriminator's input — both needed, or the generator +settles into a periodic texture the discriminator cannot see. The shipped +weights (step 4 750 of `runs/border-v6`) are level with the stock model on +LPIPS (edge 0.125 / corner 0.187 against 0.121 / 0.183) while keeping the +PSNR gain (edge 18.0 / corner 15.7 against 16.9 / 14.6). On the fixture +the ground bands now carry texture at the right tone; at 1:1 a faint +regular hatch is visible in the deepest part. + +**What is still wrong.** The hatch, and any deep textured void the +generator must invent. The better answer for those is not generative: +seed the void with the picture's own texture in hexagonal cells, let the +discriminator rank the candidates, and let the generator heal only the +gaps between cells — built and measured in `darkroom-infill` +(`infill/hexfill.py`), the most convincing scree corner produced so far, +and the next thing to port into `dr_pano::fill` (it needs the +discriminator as a second model, ~80 MB fp16). FR-MRG-4's *experimental* +stays. diff --git a/models/LICENCE.md b/models/LICENCE.md index 2039c0e..d83ce32 100644 --- a/models/LICENCE.md +++ b/models/LICENCE.md @@ -104,7 +104,7 @@ the dataset licence restricts models trained on it by name. | File | Source | Trained on | Used by | |---|---|---|---| -| `inpaint/migan-512.onnx` | `migan_512_places2.pt` from `https://github.com/Picsart-AI-Research/MI-GAN` (Sargsyan et al., ICCV 2023), **fine-tuned** in the `darkroom-infill` repository (2026-09-20) | Places2 by the authors, then ~7 400 of the maintainer's own photographs with border-shaped voids | the panorama border fill (FR-MRG-4) | +| `inpaint/migan-512.onnx` | `migan_512_places2.pt` from `https://github.com/Picsart-AI-Research/MI-GAN` (Sargsyan et al., ICCV 2023), **fine-tuned** in the `darkroom-infill` repository (2026-09-20, second model that evening: trained against MI-GAN's own discriminator) | Places2 by the authors, then ~7 400 of the maintainer's own photographs with border-shaped voids | the panorama border fill (FR-MRG-4) | The bare 512 generator at a fixed `1×4×512×512`, six operator types; the tiling, the context and the blend are Rust (`dr_pano::fill`). Since diff --git a/models/inpaint/migan-512.onnx b/models/inpaint/migan-512.onnx index 41211ef..8824e3f 100644 --- a/models/inpaint/migan-512.onnx +++ b/models/inpaint/migan-512.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c44dfe0740662f875cfd59ac119ebb39828ffc6a5e3f8fdbed02e356d08a4c52 +oid sha256:f4a114a23a7c36c727253493d269cbec5d7e9d76f9e45913aed8d25c93377740 size 29604484 From 9c556364fac36cebc1ef7e327ef7e592e0e86c72 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 20:15:46 +0200 Subject: [PATCH 07/13] Pad an open void's canvas to a tile: the merge page's preview is shorter than one, and filled nothing --- core/dr-pano/src/fill.rs | 62 ++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/core/dr-pano/src/fill.rs b/core/dr-pano/src/fill.rs index bd82468..d7aacc1 100644 --- a/core/dr-pano/src/fill.rs +++ b/core/dr-pano/src/fill.rs @@ -303,7 +303,7 @@ fn fill_once( } // The padded canvas with mirrored context, and the hole within it. - let ctx = MirroredContext::build(rgb, width, height, known, mirror_depth); + let ctx = MirroredContext::build(rgb, width, height, known, mirror_depth, t); let (pw, ph) = (ctx.width, ctx.height); // Tiles that touch the hole, on a grid that reaches both far edges. @@ -499,16 +499,36 @@ struct MirroredContext { } impl MirroredContext { - fn build(rgb: &[f32], width: usize, height: usize, known: &[bool], depth: usize) -> Self { + fn build( + rgb: &[f32], + width: usize, + height: usize, + known: &[bool], + depth: usize, + tile: usize, + ) -> Self { if depth == 0 { // Open: the picture as it is, the hole as it is. What the hole - // holds does not matter — the model masks it out. + // holds does not matter — the model masks it out. A picture + // smaller than a tile (the merge page's preview) sits at the + // origin of a tile-sized canvas whose rest is hole: still the + // void as it is, and the only way a tile fits at all. + let (pw, ph) = (width.max(tile), height.max(tile)); + let mut canvas = vec![0.0f32; pw * ph * 3]; + let mut hole = vec![true; pw * ph]; + for y in 0..height { + canvas[y * pw * 3..(y * pw + width) * 3] + .copy_from_slice(&rgb[y * width * 3..(y + 1) * width * 3]); + for x in 0..width { + hole[y * pw + x] = !known[y * width + x]; + } + } return MirroredContext { - width, - height, + width: pw, + height: ph, ring: 0, - rgb: rgb.to_vec(), - hole: known.iter().map(|&k| !k).collect(), + rgb: canvas, + hole, }; } let fold = |d: usize| fold(d, depth); @@ -715,6 +735,30 @@ mod tests { } } + #[test] + fn a_picture_smaller_than_the_tile_is_still_filled_when_the_void_is_open() { + // The merge page's preview is 1600 wide and a few hundred tall — + // shorter than a 512 tile. With no ring the canvas is padded to a + // tile, the padding hole, and the border is still filled. + let (mut rgb, known) = picture(300, 40, 8); + let mut model = Flat { + tile: 64, + seen: Vec::new(), + }; + let tiles = fill_border(&mut rgb, 300, 40, &known, &mut model, test_params(0), &mut |_, _| {}) + .unwrap(); + assert!(tiles > 0, "no tile fitted a picture shorter than the tile"); + for i in 0..300 * 40 { + if !known[i] { + assert!((rgb[i * 3] - 0.5).abs() < 1e-4, "pixel {i}"); + } + } + // And the model saw the padding as hole, never as black content. + for (_, k) in &model.seen { + assert_eq!(k.len(), 64 * 64); + } + } + #[test] fn the_fine_passes_run_in_bands_after_the_coarse_one() { // A 150-tall hole above and below a picture: the coarse pass sees @@ -824,7 +868,7 @@ mod tests { #[test] fn the_context_mirrors_the_top_rows_upward() { let (rgb, known) = picture(40, 30, 5); - let ctx = MirroredContext::build(&rgb, 40, 30, &known, 48); + let ctx = MirroredContext::build(&rgb, 40, 30, &known, 48, 64); let x = RING + 10; let first = RING + 5; for k in 1..=4 { @@ -846,7 +890,7 @@ mod tests { for x in 0..40 { rgb[(ridge * 40 + x) * 3..(ridge * 40 + x) * 3 + 3].copy_from_slice(&[0.9, 0.1, 0.1]); } - let ctx = MirroredContext::build(&rgb, 40, 400, &known, 48); + let ctx = MirroredContext::build(&rgb, 40, 400, &known, 48, 64); let x = RING + 10; for y in 0..RING + 5 { let p = (y * ctx.width + x) * 3; From c96e670356c1da43b02b8b1bf02ee98215927735 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 20:15:51 +0200 Subject: [PATCH 08/13] Re-record the panorama for the trained filler; the scene waits for the preview and for the DNG instead of guessing --- docs/manual/media/panorama-filled.png | 4 +- docs/manual/media/panorama.gif | 4 +- tools/manual/record.sh | 1 + tools/manual/scenes.py | 68 +++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/docs/manual/media/panorama-filled.png b/docs/manual/media/panorama-filled.png index df3faec..7974967 100644 --- a/docs/manual/media/panorama-filled.png +++ b/docs/manual/media/panorama-filled.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89031d39f081b3612c32cd00289ed512be9f4a5c133c53cfaee451ee897e7249 -size 1016389 +oid sha256:65c97e0424fa36f32a77dcc789108d92f1e42526e8d887b4864ff0a219299d18 +size 1046096 diff --git a/docs/manual/media/panorama.gif b/docs/manual/media/panorama.gif index a180f75..b68b49a 100644 --- a/docs/manual/media/panorama.gif +++ b/docs/manual/media/panorama.gif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d307423e5e63f300649920f3ddcd08eb91ad4cf74962cb3293c04dce6bbff1f3 -size 426043 +oid sha256:5867f182c9cd8156328710ab21e0ad6b549c1fa7839d472922dba427b6f95b38 +size 902017 diff --git a/tools/manual/record.sh b/tools/manual/record.sh index 5634d6a..d1cd52f 100755 --- a/tools/manual/record.sh +++ b/tools/manual/record.sh @@ -21,6 +21,7 @@ shift || true export DR_HOME="${DR_HOME:-/var/tmp/dr-manual}" export DR_DISPLAY="${DR_DISPLAY:-:7}" export DR_BIN="${DR_BIN:-$repo/target/release/darkroom-desktop}" +export DR_LIBRARY="$library" media="$repo/docs/manual/media" mkdir -p "$media" "$DR_HOME/xdg/config/darkroom" "$DR_HOME/xdg/data/darkroom" diff --git a/tools/manual/scenes.py b/tools/manual/scenes.py index 97b0fa5..17efd4e 100755 --- a/tools/manual/scenes.py +++ b/tools/manual/scenes.py @@ -11,6 +11,8 @@ scene, so a different library needs the numbers looked at again. Panel coordinates hold for any library. """ import os +import re +import subprocess import sys import time @@ -18,6 +20,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import drive as dr # noqa: E402 OUT = sys.argv[1] if len(sys.argv) > 1 else '.' +DEMO_LIBRARY = os.environ.get('DR_LIBRARY', '') # the folder the merge writes its DNG into def shot(name): @@ -130,6 +133,9 @@ def library_thumbsize(): def library_selection(): + # The grid remembers its scroll between launches; the cells below are + # the grid at its top. + wheel(-40, 900, 500); pause(0.6) dr.click(*SELECT); pause(0.5) dr.click(*CELL_PANO_FIRST); pause(0.3) dr.x('keydown', 'shift'); dr.click(*CELL_NY_LAST); dr.x('keyup', 'shift'); pause(0.8) @@ -322,14 +328,70 @@ def develop_export(): # --- panorama --------------------------------------------------------------- +def wait_for_new(folder, suffix, since, timeout): + """Until a file ending in `suffix` newer than `since` appears in + `folder`'s tree — the merge's DNG — or `timeout` seconds pass.""" + t0 = time.time() + while time.time() - t0 < timeout: + for root, _, files in os.walk(folder): + for f in files: + if f.lower().endswith(suffix) and os.path.getmtime(os.path.join(root, f)) > since: + return True + time.sleep(2) + return False + + +def wait_until_lit(px, py, timeout): + """Until the window pixel at (px, py) is no longer black — the fill + preview has reached the corner of the border — or `timeout` passes.""" + t0 = time.time() + while time.time() - t0 < timeout: + out = subprocess.run( + ['import', '-window', dr.win(), '-crop', f'1x1+{px}+{py}', '-depth', '8', 'txt:-'], + capture_output=True, text=True).stdout + m = re.search(r'\((\d+),(\d+),(\d+)', out) + if m and max(int(v) for v in m.groups()) > 24: + return True + time.sleep(3) + return False + + +def join(name, parts): + """Concatenate recorded clips into `name`.mp4 and drop the parts.""" + lst = f'{OUT}/{name}.txt' + with open(lst, 'w') as f: + for p in parts: + f.write(f"file '{OUT}/{p}.mp4'\n") + subprocess.run(['ffmpeg', '-hide_banner', '-loglevel', 'error', '-y', '-f', 'concat', '-safe', '0', + '-i', lst, '-c', 'copy', f'{OUT}/{name}.mp4'], check=True) + os.remove(lst) + for p in parts: + os.remove(f'{OUT}/{p}.mp4') + + def panorama(): to_library() library_selection() - rec('panorama') + rec('panorama-a') dr.click(1325, 1079); pause(40) # Merge to panorama - dr.click(184, 637); pause(45) # Fill the border - dr.click(1543, 22); pause(60) # Merge + shot('panorama-aligned') + dr.click(184, 637); pause(6) # Fill the border cut() + # The preview fills at the working scale — minutes on the CPU rung — + # so the film pauses until the border's corner has been painted. + wait_until_lit(60, 110, 400) + pause(3) + shot('panorama-filled') + rec('panorama-b') + pause(2) + started = time.time() + dr.click(1543, 22); pause(8) # Merge + cut() + join('panorama', ['panorama-a', 'panorama-b']) + # The merge itself takes minutes too; the last picture is the + # composite in the grid. + wait_for_new(DEMO_LIBRARY, '.dng', started, 600) if DEMO_LIBRARY else pause(60) + pause(5) shot('panorama-done') dr.click(*BACK); pause(2) From f5d0d57574a25d7aa97528b720bb16f9f29b11f6 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 20:19:43 +0200 Subject: [PATCH 09/13] Regenerate the traceability matrix after the rebase --- docs/traceability.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/traceability.md b/docs/traceability.md index e1317ea..b845f17 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -9,7 +9,7 @@ Denominators are parsed from [`requirements.md`](requirements.md) at run time, n | Metric | Value | |---|---| -| Source files scanned | 392 | +| Source files scanned | 394 | | TRACES tags found | 1573 | | Requirements defined | 184 | | Requirements deferred (post-v1) | 24 | @@ -39,27 +39,27 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:3396`](../ui/dr-ui/src/library.rs#L3396), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | | FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137) | | FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library.rs:1564`](../ui/dr-ui/src/library.rs#L1564), [`ui/dr-ui/src/library.rs:1627`](../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library.rs:1750`](../ui/dr-ui/src/library.rs#L1750), [`ui/dr-ui/src/library_ui.rs:1322`](../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:540`](../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:900`](../ui/dr-ui/ui/app.slint#L900), [`ui/dr-ui/ui/settings.slint:1093`](../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../ui/dr-ui/ui/settings.slint#L199) | -| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../core/dr-thumbs/src/lib.rs#L393), [`core/dr-types/src/place.rs:91`](../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1526`](../ui/dr-ui/src/collections_ui.rs#L1526), [`ui/dr-ui/src/collections_ui.rs:2433`](../ui/dr-ui/src/collections_ui.rs#L2433), [`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:4601`](../ui/dr-ui/src/library.rs#L4601), [`ui/dr-ui/src/library.rs:4635`](../ui/dr-ui/src/library.rs#L4635), [`ui/dr-ui/src/library_ui.rs:238`](../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../ui/dr-ui/src/library_ui.rs#L914), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:745`](../ui/dr-ui/ui/collections.slint#L745) | +| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../core/dr-thumbs/src/lib.rs#L393), [`core/dr-types/src/place.rs:91`](../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1526`](../ui/dr-ui/src/collections_ui.rs#L1526), [`ui/dr-ui/src/collections_ui.rs:2433`](../ui/dr-ui/src/collections_ui.rs#L2433), [`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:914`](../ui/dr-ui/src/library_ui.rs#L914), [`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:105`](../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs: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:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:177`](../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:387`](../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435), [`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:564`](../core/dr-catalog/src/schema.rs#L564), [`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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../ui/dr-ui/src/collections_ui.rs#L1977), [`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:4649`](../ui/dr-ui/src/library.rs#L4649), [`ui/dr-ui/src/library_ui.rs:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4253`](../ui/dr-ui/ui/library.slint#L4253) | -| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:5125`](../ui/dr-ui/src/library.rs#L5125), [`ui/dr-ui/src/library_ui.rs:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4253`](../ui/dr-ui/ui/library.slint#L4253), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | -| 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:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:4930`](../ui/dr-ui/src/library.rs#L4930), [`ui/dr-ui/src/library.rs:4956`](../ui/dr-ui/src/library.rs#L4956), [`ui/dr-ui/src/library.rs:5011`](../ui/dr-ui/src/library.rs#L5011), [`ui/dr-ui/src/library_ui.rs:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2949`](../ui/dr-ui/ui/library.slint#L2949), [`ui/dr-ui/ui/library.slint:4231`](../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | -| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:7395`](../ui/dr-ui/src/library.rs#L7395), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:274`](../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5233`](../ui/dr-ui/src/library.rs#L5233), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../ui/dr-ui/src/presets.rs#L498), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | +| FR-CAT-5 | [`core/dr-catalog/src/keywords.rs:1`](../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../ui/dr-ui/src/collections_ui.rs#L1977), [`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:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4253`](../ui/dr-ui/ui/library.slint#L4253) | +| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4253`](../ui/dr-ui/ui/library.slint#L4253), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | +| 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:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2949`](../ui/dr-ui/ui/library.slint#L2949), [`ui/dr-ui/ui/library.slint:4231`](../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | +| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7404`](../ui/dr-ui/src/library.rs#L7404), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`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:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../ui/dr-ui/src/presets.rs#L498), [`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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:781`](../core/dr-catalog/src/schema.rs#L781), [`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-face/src/references.rs:1`](../core/dr-face/src/references.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`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:2416`](../ui/dr-ui/src/develop.rs#L2416), [`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:1325`](../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2576`](../ui/dr-ui/src/lib.rs#L2576), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1), [`ui/dr-ui/ui/settings.slint:529`](../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:94`](../ui/dr-ui/ui/settings.slint#L94) | | FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../core/dr-catalog/src/schema.rs#L1011), [`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:345`](../ui/dr-ui/src/library.rs#L345), [`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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`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-13 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7228`](../ui/dr-ui/src/library.rs#L7228), [`ui/dr-ui/src/library.rs:7271`](../ui/dr-ui/src/library.rs#L7271), [`ui/dr-ui/src/library.rs:7309`](../ui/dr-ui/src/library.rs#L7309), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-13 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7237`](../ui/dr-ui/src/library.rs#L7237), [`ui/dr-ui/src/library.rs:7280`](../ui/dr-ui/src/library.rs#L7280), [`ui/dr-ui/src/library.rs:7318`](../ui/dr-ui/src/library.rs#L7318), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | | 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:4146`](../ui/dr-ui/src/develop.rs#L4146), [`ui/dr-ui/src/develop.rs:4159`](../ui/dr-ui/src/develop.rs#L4159), [`ui/dr-ui/src/develop.rs:4204`](../ui/dr-ui/src/develop.rs#L4204), [`ui/dr-ui/src/develop.rs:4215`](../ui/dr-ui/src/develop.rs#L4215), [`ui/dr-ui/src/develop.rs:4221`](../ui/dr-ui/src/develop.rs#L4221), [`ui/dr-ui/src/develop.rs:4238`](../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/develop.rs:810`](../ui/dr-ui/src/develop.rs#L810), [`ui/dr-ui/src/develop.rs:830`](../ui/dr-ui/src/develop.rs#L830), [`ui/dr-ui/src/develop.rs:836`](../ui/dr-ui/src/develop.rs#L836), [`ui/dr-ui/src/develop.rs:8992`](../ui/dr-ui/src/develop.rs#L8992), [`ui/dr-ui/src/develop.rs:9056`](../ui/dr-ui/src/develop.rs#L9056), [`ui/dr-ui/src/develop.rs:9079`](../ui/dr-ui/src/develop.rs#L9079), [`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:1932`](../ui/dr-ui/src/lib.rs#L1932), [`ui/dr-ui/src/lib.rs:2040`](../ui/dr-ui/src/lib.rs#L2040), [`ui/dr-ui/src/lib.rs:2153`](../ui/dr-ui/src/lib.rs#L2153), [`ui/dr-ui/src/lib.rs:2194`](../ui/dr-ui/src/lib.rs#L2194), [`ui/dr-ui/src/lib.rs:3685`](../ui/dr-ui/src/lib.rs#L3685), [`ui/dr-ui/src/lib.rs:442`](../ui/dr-ui/src/lib.rs#L442), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:2028`](../ui/dr-ui/ui/app.slint#L2028), [`ui/dr-ui/ui/app.slint:3035`](../ui/dr-ui/ui/app.slint#L3035), [`ui/dr-ui/ui/app.slint:90`](../ui/dr-ui/ui/app.slint#L90), [`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:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`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:564`](../ui/dr-ui/src/library.rs#L564) | -| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`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:6048`](../ui/dr-ui/src/library.rs#L6048) | +| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`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:6057`](../ui/dr-ui/src/library.rs#L6057) | | 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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:714`](../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1325`](../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:603`](../ui/dr-ui/src/identity_ui.rs#L603), [`ui/dr-ui/src/lib.rs:1511`](../ui/dr-ui/src/lib.rs#L1511), [`ui/dr-ui/src/lib.rs:3940`](../ui/dr-ui/src/lib.rs#L3940), [`ui/dr-ui/src/library.rs:3624`](../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/library.rs:3889`](../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/src/library_ui.rs:406`](../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:552`](../ui/dr-ui/src/settings_ui.rs#L552), [`ui/dr-ui/ui/app.slint:946`](../ui/dr-ui/ui/app.slint#L946), [`ui/dr-ui/ui/settings.slint:100`](../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../ui/dr-ui/ui/settings.slint#L529), [`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-8a | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7228`](../ui/dr-ui/src/library.rs#L7228), [`ui/dr-ui/src/library.rs:7271`](../ui/dr-ui/src/library.rs#L7271), [`ui/dr-ui/src/library.rs:7309`](../ui/dr-ui/src/library.rs#L7309), [`ui/dr-ui/src/repairs.rs:571`](../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7237`](../ui/dr-ui/src/library.rs#L7237), [`ui/dr-ui/src/library.rs:7280`](../ui/dr-ui/src/library.rs#L7280), [`ui/dr-ui/src/library.rs:7318`](../ui/dr-ui/src/library.rs#L7318), [`ui/dr-ui/src/repairs.rs:571`](../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | | FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:781`](../core/dr-catalog/src/schema.rs#L781), [`core/dr-face/src/assign.rs:1`](../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:584`](../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:517`](../ui/dr-ui/src/repairs.rs#L517), [`ui/dr-ui/ui/identity.slint:347`](../ui/dr-ui/ui/identity.slint#L347) | | 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:2845`](../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1336`](../core/dr-pipeline/src/sidecar.rs#L1336), [`core/dr-pipeline/src/sidecar.rs:1515`](../core/dr-pipeline/src/sidecar.rs#L1515), [`core/dr-pipeline/src/sidecar.rs:1604`](../core/dr-pipeline/src/sidecar.rs#L1604), [`core/dr-pipeline/src/sidecar.rs:1708`](../core/dr-pipeline/src/sidecar.rs#L1708), [`core/dr-pipeline/src/sidecar.rs:1916`](../core/dr-pipeline/src/sidecar.rs#L1916), [`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:2318`](../ui/dr-ui/src/develop.rs#L2318), [`ui/dr-ui/src/develop.rs:3666`](../ui/dr-ui/src/develop.rs#L3666), [`ui/dr-ui/src/develop.rs:3693`](../ui/dr-ui/src/develop.rs#L3693), [`ui/dr-ui/src/develop.rs:3725`](../ui/dr-ui/src/develop.rs#L3725), [`ui/dr-ui/src/develop.rs:3749`](../ui/dr-ui/src/develop.rs#L3749), [`ui/dr-ui/src/develop.rs:3755`](../ui/dr-ui/src/develop.rs#L3755), [`ui/dr-ui/src/develop.rs:3762`](../ui/dr-ui/src/develop.rs#L3762), [`ui/dr-ui/src/develop.rs:3782`](../ui/dr-ui/src/develop.rs#L3782), [`ui/dr-ui/src/labels.rs:63`](../ui/dr-ui/src/labels.rs#L63), [`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) | @@ -105,7 +105,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../core/dr-gpu/src/shaders/merge.wgsl#L1) | | FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | | FR-MRG-3 | [`core/dr-decode/examples/linear_dng.rs:1`](../core/dr-decode/examples/linear_dng.rs#L1), [`core/dr-decode/src/lib.rs:137`](../core/dr-decode/src/lib.rs#L137), [`core/dr-decode/src/lib.rs:144`](../core/dr-decode/src/lib.rs#L144), [`core/dr-decode/src/lib.rs:598`](../core/dr-decode/src/lib.rs#L598), [`core/dr-decode/src/profile.rs:395`](../core/dr-decode/src/profile.rs#L395), [`core/dr-export/src/dng.rs:1`](../core/dr-export/src/dng.rs#L1), [`core/dr-gpu/src/demosaic.rs:254`](../core/dr-gpu/src/demosaic.rs#L254), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | -| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4466`](../ui/dr-ui/src/library.rs#L4466), [`ui/dr-ui/src/library.rs:4470`](../ui/dr-ui/src/library.rs#L4470), [`ui/dr-ui/src/merge.rs:143`](../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../ui/dr-ui/ui/merge.slint#L46) | +| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4478`](../ui/dr-ui/src/library.rs#L4478), [`ui/dr-ui/src/library.rs:4482`](../ui/dr-ui/src/library.rs#L4482), [`ui/dr-ui/src/merge.rs:143`](../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../ui/dr-ui/ui/merge.slint#L46) | | FR-MRG-5 | [`core/dr-pano/src/align.rs:1`](../core/dr-pano/src/align.rs#L1), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | | FR-MRG-6 | [`core/dr-pipeline/src/sidecar.rs:1033`](../core/dr-pipeline/src/sidecar.rs#L1033), [`core/dr-pipeline/src/sidecar.rs:113`](../core/dr-pipeline/src/sidecar.rs#L113), [`core/dr-pipeline/src/sidecar.rs:123`](../core/dr-pipeline/src/sidecar.rs#L123), [`core/dr-pipeline/src/sidecar.rs:2241`](../core/dr-pipeline/src/sidecar.rs#L2241), [`core/dr-pipeline/src/sidecar.rs:841`](../core/dr-pipeline/src/sidecar.rs#L841), [`ui/dr-ui/src/merge.rs:842`](../ui/dr-ui/src/merge.rs#L842) | | FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:829`](../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | @@ -126,8 +126,8 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-NC-7 | [`core/dr-catalog/src/face_shard.rs:1`](../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:120`](../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435) | | FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs: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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../ui/dr-ui/src/lib.rs#L1559) | -| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7563`](../ui/dr-ui/src/library.rs#L7563), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336) | -| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`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:1070`](../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:7395`](../ui/dr-ui/src/library.rs#L7395), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7563`](../ui/dr-ui/src/library.rs#L7563), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287) | +| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7572`](../ui/dr-ui/src/library.rs#L7572), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336) | +| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`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:1070`](../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7404`](../ui/dr-ui/src/library.rs#L7404), [`ui/dr-ui/src/library.rs:7572`](../ui/dr-ui/src/library.rs#L7572), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287) | | 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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-sync/src/scan.rs:545`](../core/dr-sync/src/scan.rs#L545), [`core/dr-sync/src/scan.rs:574`](../core/dr-sync/src/scan.rs#L574), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library_ui.rs:1310`](../ui/dr-ui/src/library_ui.rs#L1310), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:2005`](../ui/dr-ui/src/library_ui.rs#L2005), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573) | | 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) | @@ -149,7 +149,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:3329`](../ui/dr-ui/src/lib.rs#L3329), [`ui/dr-ui/src/lib.rs:4237`](../ui/dr-ui/src/lib.rs#L4237), [`ui/dr-ui/src/lib.rs:4428`](../ui/dr-ui/src/lib.rs#L4428), [`ui/dr-ui/src/masks_ui.rs:1518`](../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2569`](../ui/dr-ui/ui/app.slint#L2569), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`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:492`](../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop.rs:1330`](../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2325`](../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`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:216`](../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4717`](../ui/dr-ui/src/library.rs#L4717), [`ui/dr-ui/src/library.rs:5485`](../ui/dr-ui/src/library.rs#L5485), [`ui/dr-ui/src/library.rs:5551`](../ui/dr-ui/src/library.rs#L5551), [`ui/dr-ui/src/library_ui.rs:1007`](../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../ui/dr-ui/src/library_ui.rs#L968), [`ui/dr-ui/src/place.rs:1`](../ui/dr-ui/src/place.rs#L1) | +| 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:216`](../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4726`](../ui/dr-ui/src/library.rs#L4726), [`ui/dr-ui/src/library.rs:5494`](../ui/dr-ui/src/library.rs#L5494), [`ui/dr-ui/src/library.rs:5560`](../ui/dr-ui/src/library.rs#L5560), [`ui/dr-ui/src/library_ui.rs:1007`](../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../ui/dr-ui/src/library_ui.rs#L968), [`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:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:2780`](../ui/dr-ui/ui/app.slint#L2780) | | 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/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1) | @@ -163,7 +163,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:4238`](../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/lib.rs:2153`](../ui/dr-ui/src/lib.rs#L2153) | | NFR-P3 | [`tools/bench/src/thumbnails.rs:1`](../tools/bench/src/thumbnails.rs#L1) | -| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4824`](../ui/dr-ui/src/library.rs#L4824), [`ui/dr-ui/src/library.rs:5987`](../ui/dr-ui/src/library.rs#L5987), [`ui/dr-ui/src/library_ui.rs:5005`](../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | +| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4833`](../ui/dr-ui/src/library.rs#L4833), [`ui/dr-ui/src/library.rs:5996`](../ui/dr-ui/src/library.rs#L5996), [`ui/dr-ui/src/library_ui.rs:5005`](../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | | NFR-P9 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/references.rs:1`](../core/dr-face/src/references.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/export.rs:1005`](../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1) | | NFR-PORT-1 | [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:272`](../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../core/dr-types/src/lib.rs#L305), [`platform/dr-plat/src/dirs.rs:1`](../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/storage.rs:1`](../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:287`](../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:344`](../platform/dr-plat/src/storage.rs#L344), [`platform/dr-plat/src/volumes.rs:1`](../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../platform/dr-plat/src/volumes.rs#L62) | | NFR-PORT-2 | [`core/dr-gpu/src/lib.rs:1`](../core/dr-gpu/src/lib.rs#L1) | From 681486196e2a0a5645181e7871e7c64ef4ef3737 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 20:19:48 +0200 Subject: [PATCH 10/13] Release 0.13.6 --- Cargo.lock | 50 +++++++++++++++++++++++----------------------- Cargo.toml | 2 +- packaging/PKGBUILD | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f22d197..fd389d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1221,7 +1221,7 @@ checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "darkroom-android" -version = "0.13.5" +version = "0.13.6" dependencies = [ "android_logger", "dr-plat", @@ -1234,7 +1234,7 @@ dependencies = [ [[package]] name = "darkroom-desktop" -version = "0.13.5" +version = "0.13.6" dependencies = [ "anyhow", "dr-plat", @@ -1408,7 +1408,7 @@ checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" [[package]] name = "dr-bench" -version = "0.13.5" +version = "0.13.6" dependencies = [ "anyhow", "dr-catalog", @@ -1425,7 +1425,7 @@ dependencies = [ [[package]] name = "dr-catalog" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-face", "dr-plat", @@ -1440,7 +1440,7 @@ dependencies = [ [[package]] name = "dr-decode" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-types", "env_logger", @@ -1454,7 +1454,7 @@ dependencies = [ [[package]] name = "dr-export" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-decode", "dr-gpu", @@ -1473,7 +1473,7 @@ dependencies = [ [[package]] name = "dr-face" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-inference-engine", "env_logger", @@ -1486,7 +1486,7 @@ dependencies = [ [[package]] name = "dr-film" -version = "0.13.5" +version = "0.13.6" dependencies = [ "log", "serde", @@ -1495,7 +1495,7 @@ dependencies = [ [[package]] name = "dr-gpu" -version = "0.13.5" +version = "0.13.6" dependencies = [ "bytemuck", "dr-decode", @@ -1513,7 +1513,7 @@ dependencies = [ [[package]] name = "dr-inference-engine" -version = "0.13.5" +version = "0.13.6" dependencies = [ "env_logger", "libloading", @@ -1528,7 +1528,7 @@ dependencies = [ [[package]] name = "dr-ingest" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-plat", "dr-types", @@ -1540,7 +1540,7 @@ dependencies = [ [[package]] name = "dr-lens" -version = "0.13.5" +version = "0.13.6" dependencies = [ "lensfun", "log", @@ -1548,7 +1548,7 @@ dependencies = [ [[package]] name = "dr-pano" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-decode", "dr-inference-engine", @@ -1562,7 +1562,7 @@ dependencies = [ [[package]] name = "dr-pipeline" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-types", "log", @@ -1571,7 +1571,7 @@ dependencies = [ [[package]] name = "dr-plat" -version = "0.13.5" +version = "0.13.6" dependencies = [ "android-native-keyring-store", "dr-types", @@ -1587,7 +1587,7 @@ dependencies = [ [[package]] name = "dr-preset-xmp" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-pipeline", "log", @@ -1597,7 +1597,7 @@ dependencies = [ [[package]] name = "dr-segment" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-inference-engine", "env_logger", @@ -1610,7 +1610,7 @@ dependencies = [ [[package]] name = "dr-sync" -version = "0.13.5" +version = "0.13.6" dependencies = [ "async-trait", "dr-plat", @@ -1624,7 +1624,7 @@ dependencies = [ [[package]] name = "dr-sync-folder" -version = "0.13.5" +version = "0.13.6" dependencies = [ "async-trait", "dr-sync", @@ -1636,7 +1636,7 @@ dependencies = [ [[package]] name = "dr-sync-nextcloud" -version = "0.13.5" +version = "0.13.6" dependencies = [ "async-trait", "dr-decode", @@ -1658,7 +1658,7 @@ dependencies = [ [[package]] name = "dr-thumbs" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-types", "jpeg-encoder", @@ -1670,7 +1670,7 @@ dependencies = [ [[package]] name = "dr-types" -version = "0.13.5" +version = "0.13.6" dependencies = [ "serde", "serde_json", @@ -1679,7 +1679,7 @@ dependencies = [ [[package]] name = "dr-ui" -version = "0.13.5" +version = "0.13.6" dependencies = [ "anyhow", "async-trait", @@ -1722,7 +1722,7 @@ dependencies = [ [[package]] name = "dr-xmp" -version = "0.13.5" +version = "0.13.6" dependencies = [ "dr-types", "log", @@ -7023,7 +7023,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "traceability" -version = "0.13.5" +version = "0.13.6" dependencies = [ "anyhow", "serde", diff --git a/Cargo.toml b/Cargo.toml index fcd889e..17e60c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ members = [ ] [workspace.package] -version = "0.13.5" +version = "0.13.6" edition = "2021" rust-version = "1.92" license = "GPL-3.0-or-later" diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index 9a9c605..7f35768 100644 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -4,7 +4,7 @@ # makes `makepkg -si` in this directory install what you are actually working # on. Swap `source` for a tagged tarball when there is something to release. pkgname=darkroom -pkgver=0.13.5 +pkgver=0.13.6 # Back to 1 with the version: a new pkgver is a new archive name, so there is # nothing for makepkg to reuse and nothing for a release number to disambiguate. pkgrel=1 From 84fade99eca9b285494c7c74a2b651fbe28ce28d Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 16:20:15 +0200 Subject: [PATCH 11/13] Put the developer docs under docs/dev and index the folder for users first MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs/ had 26 developer documents flat beside the manual, and the two audiences are very differently sized: most readers want the manual and the gesture reference, a few want the register, the designs and the measurements. The manual and gestures.md stay at the top; everything for someone changing the code moves to docs/dev/, and the two documents that name their own successors — the v0.1 milestone and the UI-refinement plan — go to docs/dev/archive/ rather than being deleted, since both are still cited. docs/README.md is the index, users first. Every reference follows: code comments, Cargo manifests, the workflows, the pre-commit hook, the bench and traceability tools (which locate the repo root by docs/dev/requirements.md now), packaging, the Docker READMEs, CLAUDE.md, CONTRIBUTING.md and the README. The matrix links one level deeper and is regenerated. Links out of the moved documents into the tree gain a level; a link checker over every Markdown file finds none broken. --- .gitea/workflows/benchmark.yml | 6 +- .gitea/workflows/build-and-test.yml | 4 +- .gitea/workflows/traceability-check.yml | 10 +- .githooks/pre-commit | 8 +- CLAUDE.md | 4 +- CONTRIBUTING.md | 22 +- Cargo.toml | 2 +- README.md | 38 +-- apps/darkroom-android/src/lib.rs | 10 +- apps/darkroom-desktop/src/main.rs | 6 +- core/dr-catalog/examples/face_confidence.rs | 2 +- core/dr-catalog/src/bursts.rs | 2 +- core/dr-catalog/src/face_shard.rs | 2 +- core/dr-catalog/src/faces.rs | 8 +- core/dr-catalog/src/merge.rs | 2 +- core/dr-catalog/src/recovery.rs | 4 +- core/dr-catalog/src/schema.rs | 4 +- core/dr-face/Cargo.toml | 4 +- core/dr-face/examples/eyes.rs | 2 +- core/dr-face/examples/faces.rs | 2 +- core/dr-face/examples/probe.rs | 2 +- core/dr-face/examples/scan_bench.rs | 2 +- core/dr-face/src/align.rs | 10 +- core/dr-face/src/calibrate.rs | 6 +- core/dr-face/src/classify.rs | 2 +- core/dr-face/src/cluster.rs | 2 +- core/dr-face/src/detect.rs | 8 +- core/dr-face/src/embed.rs | 4 +- core/dr-face/src/embedding.rs | 4 +- core/dr-face/src/eyes.rs | 6 +- core/dr-face/src/landmarks.rs | 2 +- core/dr-face/src/lib.rs | 8 +- core/dr-face/src/neighbours.rs | 2 +- core/dr-gpu/examples/frame_budget.rs | 4 +- core/dr-gpu/examples/segment.rs | 2 +- core/dr-gpu/src/segment.rs | 14 +- core/dr-gpu/src/shaders/watershed.wgsl | 4 +- core/dr-gpu/tests/frame_budget.rs | 10 +- core/dr-gpu/tests/local_contrast.rs | 2 +- core/dr-gpu/tests/zoom_resolution.rs | 2 +- core/dr-inference-engine/Cargo.toml | 2 +- core/dr-inference-engine/src/api.rs | 2 +- core/dr-inference-engine/src/engines.rs | 2 +- core/dr-inference-engine/src/lib.rs | 10 +- core/dr-inference-engine/src/probe.rs | 2 +- core/dr-inference-engine/src/session.rs | 2 +- core/dr-pano/Cargo.toml | 2 +- core/dr-pano/src/fill.rs | 2 +- core/dr-pano/src/migan.rs | 2 +- core/dr-pano/src/xfeat.rs | 4 +- core/dr-pipeline/src/detail.rs | 4 +- core/dr-pipeline/src/graph.rs | 4 +- core/dr-pipeline/src/mask.rs | 10 +- core/dr-pipeline/src/operation.rs | 2 +- core/dr-pipeline/src/ops/dehaze.rs | 2 +- core/dr-pipeline/src/ops/local_contrast.rs | 4 +- core/dr-pipeline/src/sidecar.rs | 2 +- core/dr-pipeline/src/spot.rs | 6 +- core/dr-segment/Cargo.toml | 2 +- core/dr-segment/src/distance.rs | 2 +- core/dr-segment/src/hierarchy.rs | 2 +- core/dr-segment/src/lib.rs | 2 +- core/dr-segment/src/prior.rs | 4 +- core/dr-segment/src/refine.rs | 10 +- core/dr-segment/src/semantic.rs | 6 +- core/dr-types/src/settings.rs | 4 +- docker/android/README.md | 2 +- docker/android/assemble-apk.sh | 4 +- docker/android/package.sh | 2 +- docker/windows/Dockerfile | 4 +- docker/windows/README.md | 4 +- docker/windows/package.sh | 2 +- docs/README.md | 86 ++++++ docs/{ => dev}/android-signing.md | 0 docs/{ => dev}/architecture.md | 0 docs/{ => dev/archive}/milestone-v0.1.md | 8 +- docs/{ => dev/archive}/ui-refinement.md | 0 docs/{ => dev}/bench-baseline.json | 0 docs/{ => dev}/benchmarks.md | 10 +- docs/{ => dev}/catalog.md | 0 docs/{ => dev}/code-health.md | 0 docs/{ => dev}/display-and-extension.md | 0 docs/{ => dev}/distribution.md | 8 +- docs/{ => dev}/faces.md | 0 docs/{ => dev}/frame-budget.md | 4 +- docs/{ => dev}/inference.md | 0 docs/{ => dev}/mask-editing.md | 26 +- docs/{ => dev}/outstanding.md | 8 +- docs/{ => dev}/panorama.md | 4 +- docs/{ => dev}/requirements.md | 2 +- docs/{ => dev}/segmentation.md | 0 docs/{ => dev}/spot-removal.md | 8 +- docs/{ => dev}/storage.md | 0 docs/{ => dev}/technical-debt.md | 0 docs/dev/traceability.md | 258 ++++++++++++++++++ docs/{ => dev}/ui-navigation.md | 2 +- docs/{ => dev}/view-composition.md | 2 +- docs/{ => dev}/windows.md | 18 +- docs/manual/README.md | 16 +- docs/traceability.md | 258 ------------------ models/LICENCE.md | 6 +- models/face/README.md | 8 +- packaging/PKGBUILD | 2 +- packaging/flatpak/paris.tourolle.darkroom.yml | 4 +- packaging/windows/darkroom.nsi | 6 +- tools/bench/Cargo.toml | 2 +- tools/bench/src/baseline.rs | 10 +- tools/bench/src/exporting.rs | 6 +- tools/bench/src/fixture.rs | 2 +- tools/bench/src/main.rs | 14 +- tools/ci-local.sh | 12 +- tools/export-migan.sh | 2 +- tools/face-tests-on-device.sh | 2 +- tools/fetch-android-runtime.sh | 2 +- tools/fetch-desktop-runtime.sh | 2 +- tools/fix-face-model-shapes.sh | 6 +- tools/quantise-models.sh | 2 +- tools/traceability/src/main.rs | 16 +- ui/dr-ui/Cargo.toml | 4 +- ui/dr-ui/examples/face_detectors.rs | 2 +- ui/dr-ui/examples/face_index.rs | 4 +- ui/dr-ui/examples/face_native.rs | 2 +- ui/dr-ui/src/bursts.rs | 2 +- ui/dr-ui/src/develop.rs | 6 +- ui/dr-ui/src/faces.rs | 6 +- ui/dr-ui/src/inference.rs | 2 +- ui/dr-ui/src/lib.rs | 2 +- ui/dr-ui/src/library.rs | 4 +- ui/dr-ui/src/recovery_ui.rs | 2 +- ui/dr-ui/src/remote.rs | 2 +- ui/dr-ui/src/repairs.rs | 2 +- ui/dr-ui/src/segmentation.rs | 4 +- ui/dr-ui/src/xmp_sync.rs | 2 +- ui/dr-ui/ui/identity.slint | 2 +- ui/dr-ui/ui/recovery.slint | 2 +- ui/dr-ui/ui/settings.slint | 4 +- ui/dr-ui/ui/toolrail.slint | 2 +- 137 files changed, 658 insertions(+), 572 deletions(-) create mode 100644 docs/README.md rename docs/{ => dev}/android-signing.md (100%) rename docs/{ => dev}/architecture.md (100%) rename docs/{ => dev/archive}/milestone-v0.1.md (97%) rename docs/{ => dev/archive}/ui-refinement.md (100%) rename docs/{ => dev}/bench-baseline.json (100%) rename docs/{ => dev}/benchmarks.md (96%) rename docs/{ => dev}/catalog.md (100%) rename docs/{ => dev}/code-health.md (100%) rename docs/{ => dev}/display-and-extension.md (100%) rename docs/{ => dev}/distribution.md (95%) rename docs/{ => dev}/faces.md (100%) rename docs/{ => dev}/frame-budget.md (99%) rename docs/{ => dev}/inference.md (100%) rename docs/{ => dev}/mask-editing.md (97%) rename docs/{ => dev}/outstanding.md (98%) rename docs/{ => dev}/panorama.md (99%) rename docs/{ => dev}/requirements.md (99%) rename docs/{ => dev}/segmentation.md (100%) rename docs/{ => dev}/spot-removal.md (98%) rename docs/{ => dev}/storage.md (100%) rename docs/{ => dev}/technical-debt.md (100%) create mode 100644 docs/dev/traceability.md rename docs/{ => dev}/ui-navigation.md (99%) rename docs/{ => dev}/view-composition.md (99%) rename docs/{ => dev}/windows.md (96%) delete mode 100644 docs/traceability.md diff --git a/.gitea/workflows/benchmark.yml b/.gitea/workflows/benchmark.yml index d6b1ef7..e8e5d18 100644 --- a/.gitea/workflows/benchmark.yml +++ b/.gitea/workflows/benchmark.yml @@ -1,6 +1,6 @@ name: Benchmarks -# The suite docs/requirements.md §8 has been promising since it was written: +# The suite docs/dev/requirements.md §8 has been promising since it was written: # "an automated benchmark suite against a synthetic 50k catalog, run per-commit # … A regression beyond stated tolerance fails the build." # @@ -29,7 +29,7 @@ name: Benchmarks # every commit to establish, every time, that this runner has no GPU. It # runs on demand (Actions → Run workflow) so that a runner that *does* # have one can be pointed at it, and the numbers it produces belong in -# docs/frame-budget.md by hand, as they already are. +# docs/dev/frame-budget.md by hand, as they already are. on: push: @@ -183,7 +183,7 @@ jobs: - name: Frame budget (FR-DSP-3) run: cargo test --release -p dr-gpu --test frame_budget -- --nocapture - # The instrument behind docs/frame-budget.md. It exits non-zero with no + # The instrument behind docs/dev/frame-budget.md. It exits non-zero with no # adapter, which is right for a tool a person runs deliberately and wrong # for a job that usually has none — hence continue-on-error. Its table is # in the log for whoever asked for this run; the committed numbers are diff --git a/.gitea/workflows/build-and-test.yml b/.gitea/workflows/build-and-test.yml index ecf27e9..579663a 100644 --- a/.gitea/workflows/build-and-test.yml +++ b/.gitea/workflows/build-and-test.yml @@ -322,7 +322,7 @@ jobs: env: CARGO_TARGET_DIR: target-android # Absent secrets mean a debug signature, which is what a fork or a - # branch build should get. Set all three (see docs/android-signing.md) + # branch build should get. Set all three (see docs/dev/android-signing.md) # and the same job produces a release-signed APK instead. ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} @@ -370,7 +370,7 @@ jobs: # TRACES: FR-PLAT-WIN-3 # The Windows executable and its installer, cross-built from Linux - # (docs/windows.md §7). No Windows machine anywhere in this job: what it + # (docs/dev/windows.md §7). No Windows machine anywhere in this job: what it # can prove is that the binary links, is a Windows executable with no # MinGW runtime imports, starts under Wine, and that the installer installs # and uninstalls under Wine. What it cannot prove — a Vulkan device, a diff --git a/.gitea/workflows/traceability-check.yml b/.gitea/workflows/traceability-check.yml index 1b9762f..c27a1f0 100644 --- a/.gitea/workflows/traceability-check.yml +++ b/.gitea/workflows/traceability-check.yml @@ -7,7 +7,7 @@ name: Traceability # fail its own threshold. Two rules follow, and the extractor's own tests # enforce both: # -# 1. Denominators are parsed from docs/requirements.md at run time. +# 1. Denominators are parsed from docs/dev/requirements.md at run time. # 2. Coverage is |traced ∩ defined| / |defined|, never a raw traced count. # # This job is static analysis of source comments plus markdown parsing, so it @@ -74,11 +74,11 @@ jobs: run: | set -e cargo run -q -p traceability -- report - if ! git diff --quiet docs/traceability.md; then + if ! git diff --quiet docs/dev/traceability.md; then echo "" - echo "docs/traceability.md is out of date." + echo "docs/dev/traceability.md is out of date." echo "Run: cargo run -p traceability -- report" - git diff --stat docs/traceability.md + git diff --stat docs/dev/traceability.md exit 1 fi @@ -127,4 +127,4 @@ jobs: - name: Summary if: always() - run: head -30 docs/traceability.md || true + run: head -30 docs/dev/traceability.md || true diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 32957bf..a1c5e2f 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -26,7 +26,7 @@ fi # The artefacts are generated from the tree, so regenerating them because one # was itself edited would be circular. case "$(tr -d '[:space:]' <<< "${staged}")" in - docs/traceability.md | docs/gestures.md | ui/dr-ui/src/gesture_book.rs) + docs/dev/traceability.md | docs/gestures.md | ui/dr-ui/src/gesture_book.rs) exit 0 ;; esac @@ -41,9 +41,9 @@ if ! cargo run -q -p traceability -- report >/dev/null 2>&1; then exit 0 fi -if ! git diff --quiet -- docs/traceability.md; then - git add docs/traceability.md - echo "pre-commit: regenerated docs/traceability.md and staged it" +if ! git diff --quiet -- docs/dev/traceability.md; then + git add docs/dev/traceability.md + echo "pre-commit: regenerated docs/dev/traceability.md and staged it" fi # The gesture vocabulary, same discipline. diff --git a/CLAUDE.md b/CLAUDE.md index 0dd3f86..099246d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,12 +2,12 @@ Notes for anyone — person or agent — changing this code. They record what went wrong once and what the fix looked like, so the same shape is not -written again. Requirements live in `docs/requirements.md`; this file is +written again. Requirements live in `docs/dev/requirements.md`; this file is about habits, not features. ## Catalog reads: work is proportional to what changed, never to library size -`docs/catalog.md §1` states the rule. These are the ways it was broken on +`docs/dev/catalog.md §1` states the rule. These are the ways it was broken on the Identity screen, found when every confirm click cost half a second on a 24k-image library (2026-09-19), and what each fix looked like. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c730269..c8ab36c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -90,18 +90,18 @@ break it by accident: cargo run --release -p dr-bench -- check ``` -That is the benchmark suite (`docs/requirements.md` §8), which builds a +That is the benchmark suite (`docs/dev/requirements.md` §8), which builds a synthetic 50,000-image catalog and fails the build if a performance target is missed or a measurement has drifted past its tolerance. It runs on every push in -its own workflow. [`docs/benchmarks.md`](docs/benchmarks.md) says what it +its own workflow. [`docs/dev/benchmarks.md`](docs/dev/benchmarks.md) says what it measures, what it deliberately does not, and how to read a failure. If you have touched the catalog, the decoder, the thumbnail store or the exporter, run it before you send. ## Requirements and traceability -[`requirements.md`](docs/requirements.md) is the register of record. -[`traceability.md`](docs/traceability.md) is generated from `TRACES:` tags in +[`requirements.md`](docs/dev/requirements.md) is the register of record. +[`traceability.md`](docs/dev/traceability.md) is generated from `TRACES:` tags in the source and must never be hand-edited: ```rust @@ -124,7 +124,7 @@ Note that it tracks line numbers, so a change that only moves code still moves the matrix. Never regenerate it with a stale prebuilt binary. **One convention that the tooling cannot enforce.** A tag proves that a tag -exists, not that the code under it does the thing — `docs/code-health.md` +exists, not that the code under it does the thing — `docs/dev/code-health.md` CH-4 has the details, and two requirements currently read as covered on the strength of plumbing a future feature would use. So: **close a requirement with a test that would fail if the behaviour were removed.** Coverage that @@ -163,12 +163,12 @@ One commit per change. If you fixed two things, that is two commits. | Document | Read it when | |---|---| | [`core/dr-pipeline/ops/README.md`](core/dr-pipeline/ops/README.md) | Adding or changing a develop operation — start here regardless | -| [`docs/architecture.md`](docs/architecture.md) | Anything touching the render path, catalog or sync | -| [`docs/code-health.md`](docs/code-health.md) | Deciding what to work on; grades each seam by what it costs | -| [`docs/benchmarks.md`](docs/benchmarks.md) | A change that could plausibly cost time or memory | -| [`docs/technical-debt.md`](docs/technical-debt.md) | Something looks wrong — check it was not chosen | -| [`docs/distribution.md`](docs/distribution.md) | Packaging a build, or adding a permission to one | -| [`docs/requirements.md`](docs/requirements.md) | Reference, not reading | +| [`docs/dev/architecture.md`](docs/dev/architecture.md) | Anything touching the render path, catalog or sync | +| [`docs/dev/code-health.md`](docs/dev/code-health.md) | Deciding what to work on; grades each seam by what it costs | +| [`docs/dev/benchmarks.md`](docs/dev/benchmarks.md) | A change that could plausibly cost time or memory | +| [`docs/dev/technical-debt.md`](docs/dev/technical-debt.md) | Something looks wrong — check it was not chosen | +| [`docs/dev/distribution.md`](docs/dev/distribution.md) | Packaging a build, or adding a permission to one | +| [`docs/dev/requirements.md`](docs/dev/requirements.md) | Reference, not reading | `technical-debt.md` is the one to check before "fixing" anything surprising. It records compromises that were deliberate, each with the reasoning and a diff --git a/Cargo.toml b/Cargo.toml index 17e60c7..b83500a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ dr-export = { path = "core/dr-export" } dr-face = { path = "core/dr-face", default-features = false } dr-film = { path = "core/dr-film" } # `tract` on by default so a test binary can open a session with nothing -# installed; the apps add `native` to look for a runtime file (docs/inference.md §3). +# installed; the apps add `native` to look for a runtime file (docs/dev/inference.md §3). dr-inference-engine = { path = "core/dr-inference-engine" } dr-ingest = { path = "core/dr-ingest" } dr-gpu = { path = "core/dr-gpu" } diff --git a/README.md b/README.md index 15d9175..27c28b0 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ texture directly — no readback between the GPU and the screen. |---|---|---| | Arch Linux | [`packaging/PKGBUILD`](packaging/PKGBUILD) — `makepkg -si` | Built from every release | | Android | The APK from each CI run, or `./docker/android/package.sh --install` | Runs on a tablet; F-Droid not yet submitted | -| Windows | `DarkRoom--x86_64-setup.exe`, cross-built by CI ([windows.md](docs/windows.md)) | Verified under Wine only; unsigned | +| Windows | `DarkRoom--x86_64-setup.exe`, cross-built by CI ([windows.md](docs/dev/windows.md)) | Verified under Wine only; unsigned | | Flatpak | [`packaging/flatpak/`](packaging/flatpak/) | Manifest in tree; choosing a library does not yet work in the sandbox | Or build it. Git LFS is required for the model weights, and the toolchain @@ -77,29 +77,29 @@ controls, its place in the chain and its tests. ## Where it stands **0.13.5**, nineteen tagged releases in. 184 numbered requirements in -scope, 84% of them claimed by code and [traced to it](docs/traceability.md); +scope, 84% of them claimed by code and [traced to it](docs/dev/traceability.md); the rest are written down rather than merely absent. -**Not built:** plugins (post-v1, [D12](docs/requirements.md)), compare and +**Not built:** plugins (post-v1, [D12](docs/dev/requirements.md)), compare and survey culling, AI denoise, tiled and progressive rendering, HDR merge and focus stacking, most of the Android platform integration beyond running, and the Flatpak's library chooser. The performance targets are half verified: the per-commit benchmark suite §8 requires exists for everything that does not need a frame — the catalog, the scan, the thumbnails — and not yet for the render path, so a regression there fails nothing. -[outstanding.md](docs/outstanding.md) is the list, with the reasoning for +[outstanding.md](docs/dev/outstanding.md) is the list, with the reasoning for each. **The one deliberate compromise worth knowing about before reading anything else:** the Android develop view reads its frame back through the CPU, because zero-copy there needs wgpu's Vulkan swapchain and that tears a portrait window on a tablet whose panel is mounted landscape. It is debt, -not a revision of the rule — [technical-debt.md TD-1](docs/technical-debt.md) +not a revision of the rule — [technical-debt.md TD-1](docs/dev/technical-debt.md) has the measurements and the three things any one of which would remove it. ## Documentation -For someone using it: +[docs/README.md](docs/README.md) is the index. The short version, for someone using it: | | | |---|---| @@ -111,21 +111,21 @@ For someone changing it: | | | |---|---| | [CONTRIBUTING.md](CONTRIBUTING.md) | How to land a first change without reading the rest | -| [requirements.md](docs/requirements.md) | What the software must do — the numbered register, and the decisions | -| [architecture.md](docs/architecture.md) | How it is built — crates, the GPU pipeline, the data model, sync | -| [technical-debt.md](docs/technical-debt.md) | Compromises taken deliberately, each with the condition that retires it | -| [outstanding.md](docs/outstanding.md) | What is not built, and whether that is a decision or a gap | -| [code-health.md](docs/code-health.md) | What a contribution costs, per seam, measured | -| [traceability.md](docs/traceability.md) | Generated: which requirement is claimed by which file | +| [requirements.md](docs/dev/requirements.md) | What the software must do — the numbered register, and the decisions | +| [architecture.md](docs/dev/architecture.md) | How it is built — crates, the GPU pipeline, the data model, sync | +| [technical-debt.md](docs/dev/technical-debt.md) | Compromises taken deliberately, each with the condition that retires it | +| [outstanding.md](docs/dev/outstanding.md) | What is not built, and whether that is a decision or a gap | +| [code-health.md](docs/dev/code-health.md) | What a contribution costs, per seam, measured | +| [traceability.md](docs/dev/traceability.md) | Generated: which requirement is claimed by which file | Designs, one per subsystem: -[segmentation](docs/segmentation.md) and [mask editing](docs/mask-editing.md) · -[spot removal](docs/spot-removal.md) · [panorama](docs/panorama.md) · -[faces](docs/faces.md) · [inference](docs/inference.md) · -[storage and sync](docs/storage.md) · [catalog](docs/catalog.md) · -[display and extension](docs/display-and-extension.md) · -[navigation](docs/ui-navigation.md) · [distribution](docs/distribution.md) · -[windows](docs/windows.md) · [benchmarks](docs/benchmarks.md). +[segmentation](docs/dev/segmentation.md) and [mask editing](docs/dev/mask-editing.md) · +[spot removal](docs/dev/spot-removal.md) · [panorama](docs/dev/panorama.md) · +[faces](docs/dev/faces.md) · [inference](docs/dev/inference.md) · +[storage and sync](docs/dev/storage.md) · [catalog](docs/dev/catalog.md) · +[display and extension](docs/dev/display-and-extension.md) · +[navigation](docs/dev/ui-navigation.md) · [distribution](docs/dev/distribution.md) · +[windows](docs/dev/windows.md) · [benchmarks](docs/dev/benchmarks.md). ## Licence diff --git a/apps/darkroom-android/src/lib.rs b/apps/darkroom-android/src/lib.rs index 461957e..4725a1a 100644 --- a/apps/darkroom-android/src/lib.rs +++ b/apps/darkroom-android/src/lib.rs @@ -240,7 +240,7 @@ fn android_main(app: slint::android::AndroidApp) { /// /// **Face weights are absent from the repository by design.** The InsightFace /// grant is research-only and incompatible with this project's licence -/// (docs/faces.md §2), so a desktop user fetches them, runs +/// (docs/dev/faces.md §2), so a desktop user fetches them, runs /// `tools/fix-face-model-shapes.sh` over them, and drops the result in. A build /// that carries none is the ordinary case and face indexing simply stays off. /// @@ -321,17 +321,17 @@ fn unpack_bundled_models(app: &slint::android::AndroidApp) { // before it reports the tab available. // // Three detectors, because which one runs is a setting - // (`FaceDetector`, docs/faces.md §12.3) and a tablet has no other way to + // (`FaceDetector`, docs/dev/faces.md §12.3) and a tablet has no other way to // obtain the one it was not shipped with. Twenty megabytes of APK for // the choice; the embedder is the same for all three. // - // Then the three eye-state models (docs/faces.md §17): landmarks, open + // Then the three eye-state models (docs/dev/faces.md §17): landmarks, open // or closed, sunglasses. The app indexes without them; with them the // eyes-open filter has something to read, and a tablet has no other way // to get them either. // // The int8 forms beside the three detectors are what the Hexagon runs - // (docs/inference.md §5); the engine loads the sibling when the probe + // (docs/dev/inference.md §5); the engine loads the sibling when the probe // chose that rung and ignores it otherwise. const BUNDLED: [(&std::ffi::CStr, &str); 14] = [ (c"models/scrfd_500m_640.onnx", "scrfd_500m_640.onnx"), @@ -420,7 +420,7 @@ fn unpack_bundled_models(app: &slint::android::AndroidApp) { // on a first launch they were not on disk until this line. The runtime // is in the APK's native library directory beside `libdarkroom.so`, // which is also where Qualcomm's DSP loader has to be pointed for the - // Hexagon skel (docs/inference.md §3, §8). + // Hexagon skel (docs/dev/inference.md §3, §8). dr_ui::inference::init(native_library_dir().into_iter().collect()); } diff --git a/apps/darkroom-desktop/src/main.rs b/apps/darkroom-desktop/src/main.rs index 806ad28..589b34c 100644 --- a/apps/darkroom-desktop/src/main.rs +++ b/apps/darkroom-desktop/src/main.rs @@ -21,7 +21,7 @@ fn main() -> anyhow::Result<()> { // build made on a machine that cannot run the application — the Linux CI // producing the Windows binary, checked under Wine — has an exit that // proves the executable starts without opening a window or touching the - // user's directories (docs/windows.md §6). + // user's directories (docs/dev/windows.md §6). if std::env::args().nth(1).as_deref() == Some("--version") { println!("darkroom-desktop {}", env!("CARGO_PKG_VERSION")); return Ok(()); @@ -63,7 +63,7 @@ fn main() -> anyhow::Result<()> { // Before the window: the probe runs on its own thread and the first // frame does not wait for it, but the models a background job asks for - // should already know where the runtime is (docs/inference.md §4). + // should already know where the runtime is (docs/dev/inference.md §4). dr_ui::inference::init(runtime_dirs()); dr_ui::run(paths)?; @@ -78,7 +78,7 @@ fn main() -> anyhow::Result<()> { /// Where a desktop package may have put `libonnxruntime`, most specific /// first. None of these existing is the tract build, which is a complete -/// application and not an error (docs/inference.md §3). +/// application and not an error (docs/dev/inference.md §3). /// /// `DARKROOM_ORT_DIR` is for a developer pointing at a runtime that is not /// installed — the wheel's `capi` directory, say. Then beside the executable diff --git a/core/dr-catalog/examples/face_confidence.rs b/core/dr-catalog/examples/face_confidence.rs index e933808..b07937c 100644 --- a/core/dr-catalog/examples/face_confidence.rs +++ b/core/dr-catalog/examples/face_confidence.rs @@ -315,7 +315,7 @@ fn full_library( // The three phases, separately, because "a regroup takes n seconds" does // not tell anyone which half to optimise — and the answer differs between - // a desktop and a tablet (docs/faces.md §9). + // a desktop and a tablet (docs/dev/faces.md §9). { let dim = candidates.first().map(|c| c.embedding.len()).unwrap_or(0); let flat: Vec = candidates diff --git a/core/dr-catalog/src/bursts.rs b/core/dr-catalog/src/bursts.rs index 7402579..3c6ce17 100644 --- a/core/dr-catalog/src/bursts.rs +++ b/core/dr-catalog/src/bursts.rs @@ -82,7 +82,7 @@ //! Grouping has no natural `subject_id`: it is a property of a *run* of frames, //! so a per-image job would rebuild the world once per photograph. It is //! therefore a debounced library-level pass, for exactly the reasons -//! docs/catalog.md §10.2 gives for face clustering, and [`regroup`] is the whole +//! docs/dev/catalog.md §10.2 gives for face clustering, and [`regroup`] is the whole //! of it — one ordered walk, no per-pair comparison beyond adjacent frames. //! //! # Grouping is not hiding diff --git a/core/dr-catalog/src/face_shard.rs b/core/dr-catalog/src/face_shard.rs index c6aedbd..674cfa0 100644 --- a/core/dr-catalog/src/face_shard.rs +++ b/core/dr-catalog/src/face_shard.rs @@ -2,7 +2,7 @@ //! Face data as sealed shards, so a second device does not re-index the library. //! //! Indexing a 23,500-image library is on the order of two hours of CPU -//! (docs/faces.md §12.2). It is also **byte-identical on every device**: the +//! (docs/dev/faces.md §12.2). It is also **byte-identical on every device**: the //! same model over the same proxy produces the same embedding. Paying for it //! once per account rather than once per device is the whole point of this //! module, and it is the same bargain the thumbnail store already makes. diff --git a/core/dr-catalog/src/faces.rs b/core/dr-catalog/src/faces.rs index cb2af93..93b55ab 100644 --- a/core/dr-catalog/src/faces.rs +++ b/core/dr-catalog/src/faces.rs @@ -1,7 +1,7 @@ //! TRACES: FR-CULL-8 | FR-CULL-9 | FR-CULL-10 | FR-CULL-11 | FR-CULL-12 | NFR-SEC-5 //! People and faces: what was detected, who it is, and who said so. //! -//! The storage half of docs/faces.md. `dr-face` finds faces and turns them into +//! The storage half of docs/dev/faces.md. `dr-face` finds faces and turns them into //! 512 numbers; this module is where those numbers acquire an identity, and //! where the user's corrections outrank the model's guesses. //! @@ -110,7 +110,7 @@ pub struct DetectedFace { /// Raw rather than unit length, so the length ([`Self::quality`]) is in /// the blob and not only beside it. Readers re-normalise on load. pub embedding: Vec, - /// Source pixels across the aligned crop (docs/faces.md §7). + /// Source pixels across the aligned crop (docs/dev/faces.md §7). pub crop_px: f32, /// Length of the raw embedding before normalisation — the model's own /// reading of how recognisable the crop was, and the gate on whether @@ -211,7 +211,7 @@ pub use dr_face::Calibration; /// the same face in the same photograph, for carrying an identity across a /// re-detection. /// -/// Set at the reference library's P≈0.95 line (docs/faces.md §9's table: +/// Set at the reference library's P≈0.95 line (docs/dev/faces.md §9's table: /// 0.449), which is far above anything two different people in one frame /// reach and below what one face re-embedded from a better crop of itself /// does. The number is only ever asked about *overlapping* boxes on *one* @@ -2469,7 +2469,7 @@ mod tests { } /// The reference implementation's fitted MBF curve puts the P=0.5 boundary - /// at cosine 0.267 (docs/faces.md §1). Our own first end-to-end run scored + /// at cosine 0.267 (docs/dev/faces.md §1). Our own first end-to-end run scored /// 0.596 between distinct photographs of one person and 0.05 between /// different people, so those two must land either side. #[test] diff --git a/core/dr-catalog/src/merge.rs b/core/dr-catalog/src/merge.rs index 25d59a1..86b78b5 100644 --- a/core/dr-catalog/src/merge.rs +++ b/core/dr-catalog/src/merge.rs @@ -729,7 +729,7 @@ fn attached_has_table(conn: &Connection, schema: &str, table: &str) -> Result f32 { /// How the image is fitted into the graph's fixed square input. /// /// The forward and inverse mappings live in one struct on purpose: -/// docs/faces.md §4.1 notes that what matters is not *where* the padding goes +/// docs/dev/faces.md §4.1 notes that what matters is not *where* the padding goes /// but that the two agree. A mismatch offsets every box and landmark by the /// padding, producing detections that look plausible and embeddings that /// quietly cluster badly three stages later. @@ -372,7 +372,7 @@ impl Letterbox { /// /// `(x·255 − 127.5) / 128` — note `/128`, not `/127.5`. The reference /// implementation this is ported from uses `/128` for both models, and - /// every measured number in docs/faces.md §1 came from it. + /// every measured number in docs/dev/faces.md §1 came from it. /// /// Padding is grey, matching the reference's `114`: the value the network /// reads least as an edge, where black would draw a hard border across the diff --git a/core/dr-face/src/embed.rs b/core/dr-face/src/embed.rs index 28c2441..2bfd4ca 100644 --- a/core/dr-face/src/embed.rs +++ b/core/dr-face/src/embed.rs @@ -1,4 +1,4 @@ -//! ArcFace / MobileFaceNet inference (docs/faces.md §6). +//! ArcFace / MobileFaceNet inference (docs/dev/faces.md §6). //! //! Takes an aligned crop and returns 512 L2-normalised floats. The alignment is //! not optional and cannot be skipped by accident: [`Embedder::embed`] takes an @@ -66,7 +66,7 @@ impl Embedder { pub fn from_bytes(bytes: &[u8], model: ModelId) -> Result { // Always the f32 form: an embedding must compare across devices - // (docs/inference.md §7), and the engine pins this role to it. + // (docs/dev/inference.md §7), and the engine pins this role to it. let loaded = dr_inference_engine::open(Role::Embedder, Form::F32, bytes)?; let acquired = loaded.acquire()?; let session = acquired.lock(); diff --git a/core/dr-face/src/embedding.rs b/core/dr-face/src/embedding.rs index 7ee6999..c01238f 100644 --- a/core/dr-face/src/embedding.rs +++ b/core/dr-face/src/embedding.rs @@ -1,4 +1,4 @@ -//! What an embedder produces, and how it is stored (docs/faces.md §6). +//! What an embedder produces, and how it is stored (docs/dev/faces.md §6). //! //! Deliberately **model-free**: the vector, its identity, its comparison and //! its storage encoding are arithmetic, and `calibrate` and `cluster` are built @@ -273,7 +273,7 @@ mod tests { ); } - /// The claim docs/faces.md §6 makes about the storage format: the f16 + /// The claim docs/dev/faces.md §6 makes about the storage format: the f16 /// round-trip costs ~1e-3 of cosine, three orders below the separation /// between a match and a non-match. #[test] diff --git a/core/dr-face/src/eyes.rs b/core/dr-face/src/eyes.rs index 603b20c..e3b39de 100644 --- a/core/dr-face/src/eyes.rs +++ b/core/dr-face/src/eyes.rs @@ -67,14 +67,14 @@ pub const SUNGLASSES_THRESHOLD: f32 = 0.5; /// The classifier was trained on eyes down to about a dozen pixels wide /// (its reference footage averaged 15–21); below that the 40-pixel patch is /// an interpolation of nothing, and the answer is noise that reads as -/// "closed". docs/faces.md §17.3 has the measurement behind the number. +/// "closed". docs/dev/faces.md §17.3 has the measurement behind the number. pub const MIN_EYE_PX: f32 = 12.0; /// Least [`Eye::sharpness`] for the eye to be read. /// /// The same measure as the face's `min_sharpness`, over the eye patch, and /// chosen the same way: the value under which the open-eyed faces of the -/// reference sample were being called closed. docs/faces.md §17.3. +/// reference sample were being called closed. docs/dev/faces.md §17.3. pub const MIN_EYE_SHARPNESS: f32 = 0.02; /// An eye narrower than this fraction of its partner is the far eye of a @@ -82,7 +82,7 @@ pub const MIN_EYE_SHARPNESS: f32 = 0.02; /// /// A landmark model's contour for a hidden eye collapses towards the nose. /// Measured on twenty native renders of the reference library -/// (docs/faces.md §17.4): profiles put the far eye at 0.02–0.43 of the near +/// (docs/dev/faces.md §17.4): profiles put the far eye at 0.02–0.43 of the near /// one, two three-quarter faces whose far eye read closed sat at 0.54, and /// every face looking at the camera — winks included, since a shut eye's /// box keeps its width — sat at 0.78 or more. 0.6 splits the gap. diff --git a/core/dr-face/src/landmarks.rs b/core/dr-face/src/landmarks.rs index fdd857e..94314c7 100644 --- a/core/dr-face/src/landmarks.rs +++ b/core/dr-face/src/landmarks.rs @@ -1,5 +1,5 @@ //! TRACES: FR-CULL-8a -//! Dense facial landmarks — InsightFace's `2d106det` (docs/faces.md §17.2). +//! Dense facial landmarks — InsightFace's `2d106det` (docs/dev/faces.md §17.2). //! //! SCRFD's five points place a face; they do not place an eye. Its eye //! point is loose enough that a window centred on it left the eye in a diff --git a/core/dr-face/src/lib.rs b/core/dr-face/src/lib.rs index 7056238..18bba12 100644 --- a/core/dr-face/src/lib.rs +++ b/core/dr-face/src/lib.rs @@ -1,4 +1,4 @@ -//! Faces and identity (S14, docs/faces.md). +//! Faces and identity (S14, docs/dev/faces.md). //! //! Two models, run over the native render, producing per face a box, five //! landmarks, a confidence and a 512-d embedding (FR-CULL-8) — and then the @@ -21,9 +21,9 @@ //! for a packaging script to switch on. The application obtains a model at //! runtime; this crate takes bytes and never fetches anything. //! -//! docs/faces.md §2 is the full reading, including what would have to change +//! docs/dev/faces.md §2 is the full reading, including what would have to change //! for that to stop being true. The eye-state models are the exception: MIT, -//! weights and all, and shipped in `models/face/` (docs/faces.md §17). +//! weights and all, and shipped in `models/face/` (docs/dev/faces.md §17). //! //! # Why the runtime is split behind a feature //! @@ -55,7 +55,7 @@ pub mod references; /// Smallest long edge a face crop may be sampled from. /// /// **A floor on the crop source, not on the detector input.** The distinction -/// is the whole of FR-CULL-8 and `docs/faces.md` §7: detection letterboxes +/// is the whole of FR-CULL-8 and `docs/dev/faces.md` §7: detection letterboxes /// every buffer into 640×640, so its input resolution decides nothing, while /// [`warp`] samples the 112×112 the embedder sees and so converts source /// resolution directly into embedding quality. FR-CULL-8 requires that crop to diff --git a/core/dr-face/src/neighbours.rs b/core/dr-face/src/neighbours.rs index 79478c1..f0014c2 100644 --- a/core/dr-face/src/neighbours.rs +++ b/core/dr-face/src/neighbours.rs @@ -115,7 +115,7 @@ pub struct Faces<'a> { /// Source pixels across the aligned crop, for the calibration's size term. pub crop_px: &'a [f32], /// Which photograph each face came from. Two faces in one frame are not - /// the same person, so those pairs are never returned (docs/faces.md §9). + /// the same person, so those pairs are never returned (docs/dev/faces.md §9). pub images: &'a [u64], /// Which faces may be compared *against* — the gallery /// ([`crate::embedding::MIN_GALLERY_QUALITY`]). diff --git a/core/dr-gpu/examples/frame_budget.rs b/core/dr-gpu/examples/frame_budget.rs index 8040770..24f0667 100644 --- a/core/dr-gpu/examples/frame_budget.rs +++ b/core/dr-gpu/examples/frame_budget.rs @@ -1,6 +1,6 @@ //! What a frame actually costs — the measurement FR-DSP-2 is waiting on. //! -//! `docs/display-and-extension.md` §2 argues that tiled computation predates +//! `docs/dev/display-and-extension.md` §2 argues that tiled computation predates //! the fused-shader design and may not need to exist: the composer folds every //! active operation into **one dispatch over a viewport-sized target**, so the //! problem tiles were invented to solve may already be solved. That argument @@ -28,7 +28,7 @@ //! the per-frame CPU half is dominated by shader-source assembly, which is //! string formatting and is several times slower unoptimised. //! -//! The committed numbers live in `docs/frame-budget.md`. Rerun this and diff +//! The committed numbers live in `docs/dev/frame-budget.md`. Rerun this and diff //! that file; a regression should be a diff rather than somebody's memory. //! //! # Why the 99th percentile and not the mean diff --git a/core/dr-gpu/examples/segment.rs b/core/dr-gpu/examples/segment.rs index 5ec6c06..064854a 100644 --- a/core/dr-gpu/examples/segment.rs +++ b/core/dr-gpu/examples/segment.rs @@ -1,6 +1,6 @@ //! Segment an image and write the granularity ladder as false-coloured PPMs. //! -//! The whole point of S15 step 2 (docs/segmentation.md §11): look at the +//! The whole point of S15 step 2 (docs/dev/segmentation.md §11): look at the //! ladder and decide whether clicking through it would land on the things a //! person means. No amount of design settles that — the pictures do. //! diff --git a/core/dr-gpu/src/segment.rs b/core/dr-gpu/src/segment.rs index 8134de6..21f6a1c 100644 --- a/core/dr-gpu/src/segment.rs +++ b/core/dr-gpu/src/segment.rs @@ -1,4 +1,4 @@ -//! Watershed segmentation — arm A's GPU half (S15, docs/segmentation.md). +//! Watershed segmentation — arm A's GPU half (S15, docs/dev/segmentation.md). //! //! Runs the five passes in `shaders/watershed.wgsl` over a demosaiced image //! and leaves a basin label per pixel on the GPU. The hierarchy built from @@ -20,7 +20,7 @@ //! one AC-8 forbids is per frame in the render loop, and sharing a switch //! would force a build wanting local masking to unlock the other. //! -//! It is still a real cost and still unfinished. F3 in docs/segmentation.md +//! It is still a real cost and still unfinished. F3 in docs/dev/segmentation.md //! §12 stands: the adjacency accumulation belongs GPU-side with atomics, and //! until it moves there every segmentation pays a full-resolution transfer. //! Read the feature name as a description of a known gap rather than as @@ -36,7 +36,7 @@ pub struct SegmentOptions { /// Longest proxy edge. The segmentation runs here, not at sensor /// resolution: a 24 MP watershed costs 12× the memory to place boundaries /// a person cannot see, and the boundary refinement that matters at 1:1 - /// is a separate stage (docs/segmentation.md §4). + /// is a separate stage (docs/dev/segmentation.md §4). pub max_edge: u32, /// Pre-smoothing radius in proxy pixels. The caller's to raise with ISO — /// this is the single knob that decides whether a noisy file segments @@ -69,7 +69,7 @@ impl Default for SegmentOptions { w_chroma: 0.5, // **Zero: the pass is off.** It is implemented, dispatched // correctly and measurably changes nothing — see the ignored test - // below and §12 of docs/segmentation.md. Until that is understood, + // below and §12 of docs/dev/segmentation.md. Until that is understood, // running it would buy 64 dispatches per segmentation and no // improvement, so the default declines to pay. plateau_iterations: 0, @@ -486,7 +486,7 @@ impl Segmentation { /// a region graph of a few thousand nodes that every later interaction /// reads from the CPU anyway. /// - /// What it is *not* is finished. F3 in docs/segmentation.md §12 stands: + /// What it is *not* is finished. F3 in docs/dev/segmentation.md §12 stands: /// the adjacency accumulation belongs on the GPU with atomics, and until /// it moves there a segmentation costs one full-resolution transfer of the /// label and gradient buffers. That is a real cost on a phone and the @@ -724,7 +724,7 @@ mod tests { px } #[test] - #[ignore = "the plateau pass is a measured no-op; see docs/segmentation.md §12"] + #[ignore = "the plateau pass is a measured no-op; see docs/dev/segmentation.md §12"] fn lower_completion_drains_a_plateau_instead_of_shattering_it() { // F1, asserted rather than eyeballed, and asserted at the level where // it matters. @@ -741,7 +741,7 @@ mod tests { // with no exit anywhere — cannot be drained by a distance that has // nowhere to descend to, and collapsing it fully would need connected // component labelling rather than a local rule. It is not worth it: - // see docs/segmentation.md §12. + // see docs/dev/segmentation.md §12. let Some(ctx) = ctx() else { return }; let (w, h) = (96u32, 96u32); let src = DemosaicedImage::from_rgba8(&ctx, &ramp(w, h), w, h).expect("source"); diff --git a/core/dr-gpu/src/shaders/watershed.wgsl b/core/dr-gpu/src/shaders/watershed.wgsl index cbd0bdb..a928538 100644 --- a/core/dr-gpu/src/shaders/watershed.wgsl +++ b/core/dr-gpu/src/shaders/watershed.wgsl @@ -1,4 +1,4 @@ -// Watershed segmentation — the passes behind arm A of S15 (docs/segmentation.md). +// Watershed segmentation — the passes behind arm A of S15 (docs/dev/segmentation.md). // // Seven entry points forming one chain: // @@ -197,7 +197,7 @@ fn gradient(@builtin(global_invocation_id) gid: vec3) { // lowest-indexed neighbour, which is up and to the left. Each pixel therefore // walks diagonally until it falls off the plateau, and one flat region becomes // a fan of diagonal chains rather than one basin — visible as hatching across -// what should be a single area (docs/segmentation.md §12, F1). +// what should be a single area (docs/dev/segmentation.md §12, F1). // // The fix is the standard lower-completion: give each plateau pixel its // geodesic distance to the nearest pixel that *does* have a lower neighbour, diff --git a/core/dr-gpu/tests/frame_budget.rs b/core/dr-gpu/tests/frame_budget.rs index ce8bb26..ad68f54 100644 --- a/core/dr-gpu/tests/frame_budget.rs +++ b/core/dr-gpu/tests/frame_budget.rs @@ -2,11 +2,11 @@ //! //! FR-DSP-3 says a slider updates the visible region within one frame budget at //! proxy resolution. Until this file existed nothing checked it, which made it -//! a wish — `docs/display-and-extension.md` §3 is blunt about that, and §7 is +//! a wish — `docs/dev/display-and-extension.md` §3 is blunt about that, and §7 is //! blunt about what tagging an unchecked requirement does to the coverage //! figure. //! -//! The measurements this guards are in [`docs/frame-budget.md`], produced by +//! The measurements this guards are in [`docs/dev/frame-budget.md`], produced by //! `examples/frame_budget.rs`. This file is the part of them that has to keep //! being true: it renders the **whole point-operation chain** through the real //! `render_detailed` for a hundred frames, moving a slider between each, and @@ -17,7 +17,7 @@ //! **The neighbourhood stage is deliberately not in the asserted chain.** It is //! over the budget today — clarity alone is 34 ms at 4K, because its kernel is //! a fraction of the frame and reaches a 52-pixel radius there — and -//! `docs/frame-budget.md` records that, names the fix (a base computed at +//! `docs/dev/frame-budget.md` records that, names the fix (a base computed at //! reduced resolution) and does not pretend otherwise. Asserting a budget the //! code does not meet would produce a red suite that everyone learns to ignore; //! asserting it on a chain that quietly excluded the expensive stage *without @@ -81,7 +81,7 @@ const SOURCE: (u32, u32) = (6000, 4000); /// The viewport the budget is asserted at: a 16:10 desktop display. /// /// Not 4K, and the reason is worth stating. At 4K the fused chain still passes -/// with room to spare (4.5 ms of GPU; see `docs/frame-budget.md`), but a test +/// with room to spare (4.5 ms of GPU; see `docs/dev/frame-budget.md`), but a test /// that renders 8.3 M pixels a hundred times twice over is four seconds of /// suite time to re-establish a conclusion 4.1 M pixels already establishes. const VIEWPORT: (u32, u32) = (2560, 1600); @@ -166,7 +166,7 @@ impl Run { judged <= BUDGET_MS, "{case} at {}x{}: p99 of {FRAMES} frames was {judged:.2} ms, over the \ {BUDGET_MS:.0} ms budget (cpu {:.2} ms, gpu {:.2} ms, total {:.2} ms). \ - FR-DSP-3 is what this violates; docs/frame-budget.md holds the \ + FR-DSP-3 is what this violates; docs/dev/frame-budget.md holds the \ numbers it used to be.", viewport.0, viewport.1, diff --git a/core/dr-gpu/tests/local_contrast.rs b/core/dr-gpu/tests/local_contrast.rs index 3468340..8ede8a8 100644 --- a/core/dr-gpu/tests/local_contrast.rs +++ b/core/dr-gpu/tests/local_contrast.rs @@ -326,7 +326,7 @@ fn a_proxy_and_an_export_agree_about_the_effect() { #[test] fn crossing_the_reduction_threshold_does_not_change_the_picture() { - // TRACES: FR-DSP-3 — `docs/technical-debt.md` TD-4, held in pixels. + // TRACES: FR-DSP-3 — `docs/dev/technical-debt.md` TD-4, held in pixels. // // Clarity's base is computed on a reduced grid, and how reduced depends on // the viewport: `LocalContrast::reduction` steps 4 -> 2 -> 1 as sigma diff --git a/core/dr-gpu/tests/zoom_resolution.rs b/core/dr-gpu/tests/zoom_resolution.rs index 8932f6f..41451c9 100644 --- a/core/dr-gpu/tests/zoom_resolution.rs +++ b/core/dr-gpu/tests/zoom_resolution.rs @@ -10,7 +10,7 @@ //! code path — the zoom is the full-resolution path — which is why the //! requirement has been satisfied for some time without anyone tagging it. //! -//! `docs/display-and-extension.md` §7 is the reason this file exists rather +//! `docs/dev/display-and-extension.md` §7 is the reason this file exists rather //! than a tag on `framing.rs`: a requirement counts as covered when a `TRACES` //! comment names it, and nothing checks that the code under the tag does the //! thing. `FR-DEV-8` is tagged against plumbing a future operation would use. diff --git a/core/dr-inference-engine/Cargo.toml b/core/dr-inference-engine/Cargo.toml index 32f657f..539254e 100644 --- a/core/dr-inference-engine/Cargo.toml +++ b/core/dr-inference-engine/Cargo.toml @@ -6,7 +6,7 @@ rust-version.workspace = true license.workspace = true # The one crate that names a runtime, a provider, a vendor library or a -# device (docs/inference.md §8). `dr-face` and `dr-segment` ask it for a +# device (docs/dev/inference.md §8). `dr-face` and `dr-segment` ask it for a # session by role and never see which of these answered. [dependencies] diff --git a/core/dr-inference-engine/src/api.rs b/core/dr-inference-engine/src/api.rs index e8a895f..98257d8 100644 --- a/core/dr-inference-engine/src/api.rs +++ b/core/dr-inference-engine/src/api.rs @@ -1,4 +1,4 @@ -//! The API table `ort` runs on, chosen once (docs/inference.md §3). +//! The API table `ort` runs on, chosen once (docs/dev/inference.md §3). //! //! `ort` with `alternative-backend` links no runtime and asks, on first use, //! for an `OrtApi` — a struct of function pointers. Two things can fill it: diff --git a/core/dr-inference-engine/src/engines.rs b/core/dr-inference-engine/src/engines.rs index 30c239f..5af4887 100644 --- a/core/dr-inference-engine/src/engines.rs +++ b/core/dr-inference-engine/src/engines.rs @@ -1,5 +1,5 @@ //! Compiled engines: what a rung builds once per device, and the thread that -//! builds them before anyone asks (docs/inference.md §5, §6). +//! builds them before anyone asks (docs/dev/inference.md §5, §6). //! //! TensorRT keeps its own engine cache keyed by graph hash; QNN writes a //! context model. Both are opaque to this crate, which tracks only *that* a diff --git a/core/dr-inference-engine/src/lib.rs b/core/dr-inference-engine/src/lib.rs index 242c2bb..c598d79 100644 --- a/core/dr-inference-engine/src/lib.rs +++ b/core/dr-inference-engine/src/lib.rs @@ -1,5 +1,5 @@ //! Which runtime, which provider and which model form — decided once per -//! device, and the only crate that knows the answer (docs/inference.md). +//! device, and the only crate that knows the answer (docs/dev/inference.md). //! //! Consumers ask for a session by [`Role`] and get `ort`'s `Session` back; //! what built it — tract on one core, ONNX Runtime's CPU pool, a TensorRT @@ -35,13 +35,13 @@ pub enum Role { Embedder, Segmenter, Scene, - /// The dense landmark model behind the eye reading (docs/faces.md §7c). + /// The dense landmark model behind the eye reading (docs/dev/faces.md §7c). Landmarks, /// The eye-state and sunglasses classifiers, a few hundred kilobytes. EyeClassifier, - /// XFeat, the panorama keypoint detector (docs/panorama.md). + /// XFeat, the panorama keypoint detector (docs/dev/panorama.md). Keypoints, - /// MI-GAN, the panorama border filler (docs/panorama.md §12). Plain + /// MI-GAN, the panorama border filler (docs/dev/panorama.md §12). Plain /// convolutions, so any rung serves it; fp16 on TensorRT and int8 on /// the Hexagon are the point of it. Inpainter, @@ -516,7 +516,7 @@ mod tests { /// The smallest shipped graph, if this checkout has the weights; a test /// suite that needs a research-licensed download is one that does not - /// run in CI (docs/faces.md §3), so absence is a skip. + /// run in CI (docs/dev/faces.md §3), so absence is a skip. fn probe_bytes() -> Option> { let path = concat!( env!("CARGO_MANIFEST_DIR"), diff --git a/core/dr-inference-engine/src/probe.rs b/core/dr-inference-engine/src/probe.rs index 48366de..7531eeb 100644 --- a/core/dr-inference-engine/src/probe.rs +++ b/core/dr-inference-engine/src/probe.rs @@ -1,4 +1,4 @@ -//! Walk the ladder, once, by building real sessions (docs/inference.md §4). +//! Walk the ladder, once, by building real sessions (docs/dev/inference.md §4). //! //! A rung is taken when a session builds on it, runs, and is faster than //! the floor. Both halves matter: a provider can register and then fail at diff --git a/core/dr-inference-engine/src/session.rs b/core/dr-inference-engine/src/session.rs index 77826ff..fa36f9f 100644 --- a/core/dr-inference-engine/src/session.rs +++ b/core/dr-inference-engine/src/session.rs @@ -1,4 +1,4 @@ -//! One session builder per rung (docs/inference.md §2, §7, §9). +//! One session builder per rung (docs/dev/inference.md §2, §7, §9). use ort::session::Session; diff --git a/core/dr-pano/Cargo.toml b/core/dr-pano/Cargo.toml index 2499471..83e62a4 100644 --- a/core/dr-pano/Cargo.toml +++ b/core/dr-pano/Cargo.toml @@ -13,7 +13,7 @@ log.workspace = true # Inference for the learned keypoint detector, on the same footing as # `dr-segment`: `ort` is the API, `dr-inference-engine` decides what runs -# it (docs/inference.md), and both are optional so that the geometry — +# it (docs/dev/inference.md), and both are optional so that the geometry — # matching, the rotation solve, the projections — is a dependency-free crate # that tests without a model. ort = { workspace = true, optional = true } diff --git a/core/dr-pano/src/fill.rs b/core/dr-pano/src/fill.rs index d7aacc1..7685fac 100644 --- a/core/dr-pano/src/fill.rs +++ b/core/dr-pano/src/fill.rs @@ -95,7 +95,7 @@ pub struct Params { /// and, beyond the band being filled, still unknown. That is what the /// shipped model was trained on (a fine-tune of MI-GAN on voids cut /// from photographs the way a cylindrical merge cuts them, see - /// `docs/panorama.md` §14); a ring would give it a fold to continue. + /// `docs/dev/panorama.md` §14); a ring would give it a fold to continue. /// /// Non-zero is the stock model's crutch: a plain reflection of a deep /// hole pulls in whatever is that far from the edge — a ridge, a peak — diff --git a/core/dr-pano/src/migan.rs b/core/dr-pano/src/migan.rs index ca1fae8..40cc708 100644 --- a/core/dr-pano/src/migan.rs +++ b/core/dr-pano/src/migan.rs @@ -9,7 +9,7 @@ //! on every rung, and what they cost is the whole story of whether a fill //! is interactive: 7.4 s a tile under tract, 0.4 s under ONNX Runtime's //! CPU pool, 23 ms in fp16 and 13 ms in int8 on a laptop's TensorRT -//! (2026-09-19, docs/panorama.md §12). +//! (2026-09-19, docs/dev/panorama.md §12). //! //! The model's contract, from the reference `export_inference_model.py`: //! input `1×4×512×512` float — channel 0 is `mask − 0.5` with 1 where the diff --git a/core/dr-pano/src/xfeat.rs b/core/dr-pano/src/xfeat.rs index 76dba1e..28a135f 100644 --- a/core/dr-pano/src/xfeat.rs +++ b/core/dr-pano/src/xfeat.rs @@ -4,7 +4,7 @@ //! Apache-2.0 weights (`models/LICENCE.md`), exported at a fixed shape by //! `tools/export-xfeat.sh` and loaded through the same `dr-inference-engine` //! `dr-segment` and `dr-face` use, so this adds no runtime and no C to the -//! tree; what runs it is the device's business (docs/inference.md). ~300 ms +//! tree; what runs it is the device's business (docs/dev/inference.md). ~300 ms //! per frame on tract on the reference desktop, ~400 ms on the tablet //! (S15.2, S15.4). @@ -37,7 +37,7 @@ pub struct XFeat { } /// The bytes of both exports compiled into the binary, for whoever compiles -/// engines ahead of the first request (docs/inference.md §6). +/// engines ahead of the first request (docs/dev/inference.md §6). #[cfg(feature = "embedded-model")] pub fn embedded_model_bytes() -> [&'static [u8]; 2] { [EMBEDDED_LANDSCAPE, EMBEDDED_PORTRAIT] diff --git a/core/dr-pipeline/src/detail.rs b/core/dr-pipeline/src/detail.rs index 7391d1d..7a8e815 100644 --- a/core/dr-pipeline/src/detail.rs +++ b/core/dr-pipeline/src/detail.rs @@ -315,7 +315,7 @@ pub struct DetailPass { /// 52 render pixels at 4K — holds no spatial frequency a quarter-scale /// grid cannot represent. Computing it at the render size therefore buys /// nothing and costs everything: 105 taps over 8.3 M pixels, twice, which - /// measured at 34 ms and is where `docs/technical-debt.md` TD-4 came from. + /// measured at 34 ms and is where `docs/dev/technical-debt.md` TD-4 came from. /// At a quarter it is a sixteenth of the pixels at a quarter of the /// radius, and the result is not an approximation of the full-resolution /// base — it is the same band-limited function, sampled where it is still @@ -568,7 +568,7 @@ pub fn compose_detail( /// photograph the photographer thinks they are sharpening. /// /// It also means ARCH §5.2's stage list, which draws spot removal after -/// texture and clarity, is not what this does — see `docs/spot-removal.md` +/// texture and clarity, is not what this does — see `docs/dev/spot-removal.md` /// §5.1, which is where the disagreement is written down. pub fn compose_detail_with( ops: &[Box], diff --git a/core/dr-pipeline/src/graph.rs b/core/dr-pipeline/src/graph.rs index 8713329..a129d91 100644 --- a/core/dr-pipeline/src/graph.rs +++ b/core/dr-pipeline/src/graph.rs @@ -113,7 +113,7 @@ pub struct EditGraph { /// a sidecar comes to name one stock while the shader draws another. film: Option, /// TRACES: FR-DEV-8 - /// The repairs (`docs/spot-removal.md`). + /// The repairs (`docs/dev/spot-removal.md`). /// /// Apart from `ops` for the third time and the same reason: a spot is not /// a scalar, and a list of them is not a slider. It sits beside the masks @@ -122,7 +122,7 @@ pub struct EditGraph { /// photograph comes from. spots: SpotSet, /// The lens corrections that rewrite coordinates: distortion and lateral - /// chromatic aberration (`docs/architecture.md` §5.2). + /// chromatic aberration (`docs/dev/architecture.md` §5.2). /// /// Apart from `ops` for the fourth time, and this one is not about shape /// but about direction. Every [`Operation`] is a function from colour to diff --git a/core/dr-pipeline/src/mask.rs b/core/dr-pipeline/src/mask.rs index b0f417e..ff59aaf 100644 --- a/core/dr-pipeline/src/mask.rs +++ b/core/dr-pipeline/src/mask.rs @@ -27,7 +27,7 @@ //! [`MaskSource::Regions`] stores integers naming regions in the segmentation //! hierarchy (`dr-segment`). That choice is what makes a mask diffable, cheap //! in a sidecar, and mergeable per-field under FR-NC-9 — three properties a -//! stored raster has none of (docs/segmentation.md §1). Two devices that +//! stored raster has none of (docs/dev/segmentation.md §1). Two devices that //! select the same subject produce the same small sorted list, and a sync //! conflict between them is resolvable rather than a binary blob fight. //! @@ -564,7 +564,7 @@ pub enum MaskSource { /// This is what the watershed and the semantic model exist to produce. /// Selecting a subject means "the regions the model's instance covers", /// and the resulting edge is the watershed's, which is to say the image's - /// own (docs/segmentation.md §5). + /// own (docs/dev/segmentation.md §5). Regions { /// Which segmentation these ids index into. /// @@ -590,7 +590,7 @@ pub enum MaskSource { /// **The primary way a local adjustment is made.** The watershed hierarchy /// this crate was first built around does not survive a photograph: its /// saddles are near zero almost everywhere, so a global cut collapses the - /// frame into one region plus noise (docs/segmentation.md §15). A model + /// frame into one region plus noise (docs/dev/segmentation.md §15). A model /// instance is a whole object, found as one thing, and needs no ladder. /// /// The trade is that the boundary is the model's — a quarter-resolution @@ -625,7 +625,7 @@ pub enum MaskSource { /// reason both exist. A subject is *one* instance — this dog, not that one /// — found by a COCO-trained instance model. A category is *all* the sky, /// or all the foliage, from an ADE20K-trained semantic model that has no - /// notion of instances at all (docs/segmentation.md §16). + /// notion of instances at all (docs/dev/segmentation.md §16). /// /// So this is what a global grade attaches to: lift the sky, desaturate /// the vegetation, warm the architecture. Asking it for "that person @@ -2231,7 +2231,7 @@ fn reveal_block(slot: usize, layer: &MaskLayer, style: RevealStyle, colour: [f32 /// **not** a hash of the label field: that would be a readback on a path that /// must not have one (ARCH §6.1), and would also make the signature depend on /// float arithmetic whose cross-vendor determinism is exactly the open -/// question (docs/segmentation.md §6, M5). +/// question (docs/dev/segmentation.md §6, M5). pub fn segmentation_signature(width: u32, height: u32, regions: u32, tuning: u64) -> u64 { // FNV-1a over the four fields. Small, dependency-free, and adequate: this // guards against accidental mismatch, not against a forged sidecar. diff --git a/core/dr-pipeline/src/operation.rs b/core/dr-pipeline/src/operation.rs index bbd5b05..c09e944 100644 --- a/core/dr-pipeline/src/operation.rs +++ b/core/dr-pipeline/src/operation.rs @@ -54,7 +54,7 @@ pub enum Affects { /// A pixel's *neighbourhood* — sharpening, noise reduction, clarity, /// texture, dehaze, spot removal. /// - /// The seam `docs/requirements.md` §3.3 designed and nothing cut until + /// The seam `docs/dev/requirements.md` §3.3 designed and nothing cut until /// [`crate::detail`] existed. It is a separate variant rather than a flavour /// of `Colour` because it is a separate *dispatch*: a fragment in the fused /// pass is handed a colour and has no way back to a coordinate, so a diff --git a/core/dr-pipeline/src/ops/dehaze.rs b/core/dr-pipeline/src/ops/dehaze.rs index 8ef5630..cfa0032 100644 --- a/core/dr-pipeline/src/ops/dehaze.rs +++ b/core/dr-pipeline/src/ops/dehaze.rs @@ -99,7 +99,7 @@ //! A minimum over a patch is separable, as a Gaussian is: minimum along x, //! then along y. That alone is not enough. The patch is 1% of the shorter edge //! — 61 taps across at 4K — and two passes of 61 taps is the arithmetic that -//! measured 34 ms for clarity and became `docs/technical-debt.md` TD-4. +//! measured 34 ms for clarity and became `docs/dev/technical-debt.md` TD-4. //! //! A minimum has a property a Gaussian does not: **erosions compose by adding //! their structuring elements**. The minimum over a contiguous run of `d` diff --git a/core/dr-pipeline/src/ops/local_contrast.rs b/core/dr-pipeline/src/ops/local_contrast.rs index 3808b27..e572379 100644 --- a/core/dr-pipeline/src/ops/local_contrast.rs +++ b/core/dr-pipeline/src/ops/local_contrast.rs @@ -150,7 +150,7 @@ //! the artefact this control must not have. //! //! Run at the render size, that measured **34 ms at 4K** — seven times the -//! entire fused point chain, for one slider — which is `docs/technical-debt.md` +//! entire fused point chain, for one slider — which is `docs/dev/technical-debt.md` //! TD-4 and is what [`Recipe::base_scale`] now answers. The base is computed on //! a grid a quarter the size on each axis: a sixteenth of the pixels at a //! quarter of the radius. @@ -271,7 +271,7 @@ impl Band for Coarse { threshold: 0.35, gain: 1.0, midtone_taper: true, - // A quarter, which is what `docs/technical-debt.md` TD-4 bought back. + // A quarter, which is what `docs/dev/technical-debt.md` TD-4 bought back. // // σ is 1.2% of the shorter edge — 26 px at 4K — so the base holds no // spatial frequency anywhere near the quarter-scale Nyquist of one diff --git a/core/dr-pipeline/src/sidecar.rs b/core/dr-pipeline/src/sidecar.rs index 6778caa..cd616d4 100644 --- a/core/dr-pipeline/src/sidecar.rs +++ b/core/dr-pipeline/src/sidecar.rs @@ -217,7 +217,7 @@ pub struct Version { /// graph's film cleared and the caller re-bakes — see `EditGraph::set_film`. pub film: Option, /// TRACES: FR-DEV-8 | FR-NC-9 - /// The repairs (`docs/spot-removal.md`). + /// The repairs (`docs/dev/spot-removal.md`). /// /// A line per spot, keyed `spot.`, rather than a block per spot as a /// mask gets: a spot is eight numbers, and sixty-four blocks would bury the diff --git a/core/dr-pipeline/src/spot.rs b/core/dr-pipeline/src/spot.rs index fe80bc7..5e3dc6a 100644 --- a/core/dr-pipeline/src/spot.rs +++ b/core/dr-pipeline/src/spot.rs @@ -6,7 +6,7 @@ //! are blended. No pixels are stored, here or anywhere: the shader draws the //! repair from these numbers every time the photograph is rendered, which is //! what makes it non-destructive, cheap to sync, and undoable -//! (`docs/spot-removal.md`). +//! (`docs/dev/spot-removal.md`). //! //! # Why this is not an operation //! @@ -61,7 +61,7 @@ pub const MAX_SPOTS: usize = 64; /// bounds something that is otherwise unbounded: a detail pass declares how far /// it reads from the pixel it writes, and for a spot that is the offset plus /// the radius. An unbounded offset is an unbounded halo, which is a pass the -/// tile scheduler cannot plan (ARCH §5.3, `docs/spot-removal.md` §5.3). +/// tile scheduler cannot plan (ARCH §5.3, `docs/dev/spot-removal.md` §5.3). pub const MAX_SOURCE_DISTANCE: f32 = 0.5; /// The radius a new spot starts at, in frame units. @@ -210,7 +210,7 @@ impl Spot { /// **FR-DEV-8 asks for automatic source placement, and this is the cheap /// half of it.** The good half searches the photograph for a patch whose /// surroundings match — a compute dispatch scoring candidate offsets, and - /// one small readback when the spot is created (`docs/spot-removal.md` + /// one small readback when the spot is created (`docs/dev/spot-removal.md` /// §8). This is what stands in for it, and it is worth having on its own /// terms rather than as a placeholder: dust sits on skies, skies are /// smooth, and a patch two and a half radii away is nearly always the same diff --git a/core/dr-segment/Cargo.toml b/core/dr-segment/Cargo.toml index ff29e15..a277480 100644 --- a/core/dr-segment/Cargo.toml +++ b/core/dr-segment/Cargo.toml @@ -13,7 +13,7 @@ log.workspace = true # Inference. `ort` is the API; **what runs it is `dr-inference-engine`'s # business** — tract, or an ONNX Runtime the app found on disk, on whichever -# provider the device has (docs/inference.md). This crate never names either. +# provider the device has (docs/dev/inference.md). This crate never names either. ort = { workspace = true, optional = true } dr-inference-engine = { workspace = true, optional = true } ndarray = { workspace = true, optional = true } diff --git a/core/dr-segment/src/distance.rs b/core/dr-segment/src/distance.rs index c43976f..f6c7002 100644 --- a/core/dr-segment/src/distance.rs +++ b/core/dr-segment/src/distance.rs @@ -34,7 +34,7 @@ //! And doing it here buys two things a shader could not. It is **exactly //! deterministic**, which matters because masks reach the sidecar as indices //! and a field that varied by vendor would mean a mask meaning one thing on -//! the desktop and another on the phone (docs/segmentation.md §6, M5). And it +//! the desktop and another on the phone (docs/dev/segmentation.md §6, M5). And it //! is testable against hand-computed distances with no adapter present. //! //! # The transform diff --git a/core/dr-segment/src/hierarchy.rs b/core/dr-segment/src/hierarchy.rs index 25e5718..7b54577 100644 --- a/core/dr-segment/src/hierarchy.rs +++ b/core/dr-segment/src/hierarchy.rs @@ -40,7 +40,7 @@ pub struct Edge { /// A partition of the image into labelled regions, plus how they adjoin. /// -/// The shared interface from docs/segmentation.md §2: arm A produces this +/// The shared interface from docs/dev/segmentation.md §2: arm A produces this /// from a watershed, arm B would produce it from a class map, and the /// consumers above cannot tell which. #[derive(Debug, Clone, PartialEq)] diff --git a/core/dr-segment/src/lib.rs b/core/dr-segment/src/lib.rs index b800f97..b918ce5 100644 --- a/core/dr-segment/src/lib.rs +++ b/core/dr-segment/src/lib.rs @@ -1,5 +1,5 @@ //! TRACES: FR-DEV-3i -//! Region segmentation for local masking (S15, docs/segmentation.md). +//! Region segmentation for local masking (S15, docs/dev/segmentation.md). //! //! Local adjustments need to know where the image's regions are before they //! can snap a mask to one. This crate is that map, and it is deliberately diff --git a/core/dr-segment/src/prior.rs b/core/dr-segment/src/prior.rs index 14b51b4..e30d149 100644 --- a/core/dr-segment/src/prior.rs +++ b/core/dr-segment/src/prior.rs @@ -1,6 +1,6 @@ //! Arm C — semantic instances as a prior over the watershed merge order. //! -//! docs/segmentation.md §5. The spec calls this the expected winner and it is +//! docs/dev/segmentation.md §5. The spec calls this the expected winner and it is //! what ships, for a reason that survives the model turning out to be narrower //! than §4 assumed: the two arms fail in *opposite* directions, so each one //! covers the other's failure. @@ -233,7 +233,7 @@ pub fn apply_semantic_prior( /// This is the interaction the whole spike exists to enable, and the reason it /// returns *region ids* rather than a raster: a mask that is a set of integers /// is diffable, mergeable at node level under FR-NC-9, and cheap in a sidecar -/// (docs/segmentation.md §1). A raster is none of those. +/// (docs/dev/segmentation.md §1). A raster is none of those. /// /// The returned ids are sorted, so the same click always produces the same /// mask — which is what lets it be a cache key. diff --git a/core/dr-segment/src/refine.rs b/core/dr-segment/src/refine.rs index 951548e..b40bb99 100644 --- a/core/dr-segment/src/refine.rs +++ b/core/dr-segment/src/refine.rs @@ -60,7 +60,7 @@ //! So the last step is a **marker-based watershed**. The mask is eroded to //! give two markers — confidently inside, confidently outside — and the flood //! runs in the ribbon left between them, meeting along the most expensive line -//! it can find. The cost is a sum of terms, as docs/segmentation.md §2 says it +//! it can find. The cost is a sum of terms, as docs/dev/segmentation.md §2 says it //! should be: the photograph's own edges, and the colour model's disagreement. //! //! Markers are what make this the right shape rather than the watershed §15 @@ -244,7 +244,7 @@ pub struct RefineOptions { /// How much the photograph's own edges count against the colour model in /// the flood's cost, `0.0..=1.0`. /// - /// docs/segmentation.md §2 specifies the cost as *a sum of terms* — image + /// docs/dev/segmentation.md §2 specifies the cost as *a sum of terms* — image /// gradient always available, semantic evidence added when a model is /// present — and this is the mix. At one the boundary lands purely on the /// strongest edge in the band; at zero purely where the colour verdict @@ -378,7 +378,7 @@ const MAX_SAMPLES: usize = 20_000; /// floating-point comparison is a stopping rule that can differ between /// machines, and a mask that differs between machines reaches the sidecar as /// indices meaning one thing on the desktop and another on the phone -/// (docs/segmentation.md §6). +/// (docs/dev/segmentation.md §6). const ITERATIONS: usize = 12; /// Half-width of the verdict scale, in nats. @@ -676,7 +676,7 @@ impl Refinement { /// fronts meet along the most expensive line in the ribbon — which is the /// watershed, and which is where the boundary belongs. /// - /// The cost is a sum of terms, as docs/segmentation.md §2 says it should + /// The cost is a sum of terms, as docs/dev/segmentation.md §2 says it should /// be: the photograph's own edges, and the colour model's disagreement. /// Neither alone is right. An edge with no colour meaning is a texture, /// and a colour change with no edge is a gradient. @@ -889,7 +889,7 @@ fn neighbours(p: usize, w: usize, h: usize) -> impl Iterator { /// Edge strength over the opponent features, as one byte per pixel. /// /// Sobel over the same three numbers the colour model is fitted on, rather -/// than over plain luma — docs/segmentation.md §3 is explicit that a +/// than over plain luma — docs/dev/segmentation.md §3 is explicit that a /// channel-weighted RGB gradient reads a saturated red edge as weaker than it /// looks, and a flag against sky is exactly that edge. /// diff --git a/core/dr-segment/src/semantic.rs b/core/dr-segment/src/semantic.rs index 35cd523..88b92a9 100644 --- a/core/dr-segment/src/semantic.rs +++ b/core/dr-segment/src/semantic.rs @@ -1,4 +1,4 @@ -//! Semantic segmentation — arm B (S15, docs/segmentation.md §4). +//! Semantic segmentation — arm B (S15, docs/dev/segmentation.md §4). //! //! Runs a YOLO instance-segmentation graph over a proxy-resolution image and //! returns the instances it found: a class, a score, a box, and a soft mask @@ -209,7 +209,7 @@ const EMBEDDED_MODEL: &[u8] = include_bytes!("../../../models/segment/yolo26n-se const EMBEDDED_CLASSES: &str = include_str!("../../../models/segment/yolo26n-seg.classes.json"); /// The bytes of the model that ships with this crate, for whoever compiles -/// engines ahead of the first request (docs/inference.md §6). +/// engines ahead of the first request (docs/dev/inference.md §6). #[cfg(feature = "embedded-model")] pub fn embedded_model_bytes() -> &'static [u8] { EMBEDDED_MODEL @@ -237,7 +237,7 @@ impl SemanticModel { pub fn from_bytes(bytes: &[u8], classes: Vec>) -> Result { // The f32 graph on whatever the device's backend is. An int8 form - // for the Hexagon waits on docs/inference.md §10 M7 — the mask + // for the Hexagon waits on docs/dev/inference.md §10 M7 — the mask // boundary has to be measured before it moves. let session = dr_inference_engine::open( dr_inference_engine::Role::Segmenter, diff --git a/core/dr-types/src/settings.rs b/core/dr-types/src/settings.rs index 85c9a9c..d57d795 100644 --- a/core/dr-types/src/settings.rs +++ b/core/dr-types/src/settings.rs @@ -177,7 +177,7 @@ pub struct FaceSettings { /// Which SCRFD graph the indexing pass detects with. /// /// Three exports of one architecture, differing only in how much computation -/// they spend, and docs/faces.md §12.3 is the measurement that made this a +/// they spend, and docs/dev/faces.md §12.3 is the measurement that made this a /// choice rather than a constant: over the same photographs the cheapest one /// misses the small faces in a group and reports a dog a dozen times, the /// middle one finds 14% more faces for 12% more time, and the largest a @@ -261,7 +261,7 @@ impl FaceDetector { } } - /// The id when the detector runs in its int8 form (docs/inference.md §7). + /// The id when the detector runs in its int8 form (docs/dev/inference.md §7). /// /// A different detector: it finds a different set of faces, so it is a /// different population of detections. The embedder half is unchanged, diff --git a/docker/android/README.md b/docker/android/README.md index 6466dd7..0c2417b 100644 --- a/docker/android/README.md +++ b/docker/android/README.md @@ -48,7 +48,7 @@ pointers there; the build detects that and stops rather than shipping them. This exists because Android offers no other route to a model: the directory the app reads from is inside app-private storage, `run-as` needs a debuggable build, and the app has no picker and no -fetch. docs/faces.md §2.2a is the decision and its limits — these files come back out before anything +fetch. docs/dev/faces.md §2.2a is the decision and its limits — these files come back out before anything is published. ## Java in the APK diff --git a/docker/android/assemble-apk.sh b/docker/android/assemble-apk.sh index 33730ed..c0f6db9 100755 --- a/docker/android/assemble-apk.sh +++ b/docker/android/assemble-apk.sh @@ -258,7 +258,7 @@ fi cp "${SO}" "${OUT}/staging/lib/${ABI}/libdarkroom.so" cp "${DEX}" "${OUT}/staging/classes.dex" -# The inference runtime (docs/inference.md §3): ONNX Runtime and Qualcomm's +# The inference runtime (docs/dev/inference.md §3): ONNX Runtime and Qualcomm's # Hexagon backend, beside libdarkroom.so so the app finds them in its own # native library directory. The build links none of it — the app dlopens # `libonnxruntime.so` at launch and runs on tract if it is not there — so an @@ -278,7 +278,7 @@ else fi # The models. Android has no other route to one — app-private storage is not -# user-reachable and the in-app fetch is unbuilt (docs/faces.md §2.2a) — so +# user-reachable and the in-app fetch is unbuilt (docs/dev/faces.md §2.2a) — so # they go in the APK and `android_main` unpacks them on first launch. The # sources are `models/face/` and `models/scene/`, shared with the Arch package # rather than living under this one platform's directory. diff --git a/docker/android/package.sh b/docker/android/package.sh index f23de76..a14c5fc 100755 --- a/docker/android/package.sh +++ b/docker/android/package.sh @@ -73,7 +73,7 @@ SO="${CACHE}/target/jniLibs/${ABI}/libdarkroom.so" # of KEYSTORE_PASS (see its header), and the keystore has to be reachable from # inside the container, so a host path in KEYSTORE is copied under the mounted # target directory for the duration of the build and removed after. The -# passwords travel as environment, never as arguments -- docs/android-signing.md +# passwords travel as environment, never as arguments -- docs/dev/android-signing.md # has the incantation. # --------------------------------------------------------------------------- echo "==> packaging APK" diff --git a/docker/windows/Dockerfile b/docker/windows/Dockerfile index 9bf3a3d..8caee35 100644 --- a/docker/windows/Dockerfile +++ b/docker/windows/Dockerfile @@ -1,6 +1,6 @@ # DarkRoom — reproducible Windows cross-build environment # -# Everything docs/windows.md §2 names: Rust with the GNU Windows target, the +# Everything docs/dev/windows.md §2 names: Rust with the GNU Windows target, the # MinGW-w64 cross compiler it links with, NSIS to build the installer, and Wine # to smoke-test the result. Both CI and local builds use this image, so "works # on my machine" and "works in CI" are the same machine — the same argument @@ -77,7 +77,7 @@ RUN curl -fsSL https://sh.rustup.rs | sh -s -- \ # libwinpthread the Rust target's own MinGW pieces were built against, and # picking the other produces link errors that read as if std were missing. # -# The runtime is linked statically (docs/windows.md §2) so the installer +# The runtime is linked statically (docs/dev/windows.md §2) so the installer # carries one file. `-static-libgcc` is all it takes: rustc's windows-gnu # target links its own copy of winpthread in self-contained mode, so nothing # imports libwinpthread-1.dll — the smoke test's objdump step is what checks diff --git a/docker/windows/README.md b/docker/windows/README.md index e3bc17f..7d7e34f 100644 --- a/docker/windows/README.md +++ b/docker/windows/README.md @@ -1,7 +1,7 @@ # Windows cross-build environment Reproducible container for building the Windows executable and its installer from Linux. The -specification is [docs/windows.md](../../docs/windows.md); this directory is what it turned into, +specification is [docs/dev/windows.md](../../docs/dev/windows.md); this directory is what it turned into, and every departure from the spec's first draft is recorded in the Dockerfile's comments. ## Use @@ -16,7 +16,7 @@ and every departure from the spec's first draft is recorded in the Dockerfile's # Build the installer from that binary ./docker/windows/build.sh docker/windows/package.sh -# Smoke-test under Wine (docs/windows.md §6) +# Smoke-test under Wine (docs/dev/windows.md §6) ./docker/windows/build.sh wine target-windows/x86_64-pc-windows-gnu/release/darkroom-desktop.exe --version ./docker/windows/build.sh wine target-windows/installer/DarkRoom-0.12.0-x86_64-setup.exe /S diff --git a/docker/windows/package.sh b/docker/windows/package.sh index 34193fb..1ccf833 100755 --- a/docker/windows/package.sh +++ b/docker/windows/package.sh @@ -7,7 +7,7 @@ # to have run in the same target directory. Produces # DarkRoom--x86_64-setup.exe in $OUT (default: target-windows/installer). # -# Runs inside the container, where makensis is; docs/windows.md §5 is the +# Runs inside the container, where makensis is; docs/dev/windows.md §5 is the # specification this implements. set -euo pipefail diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..00456a5 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,86 @@ +# Documentation + +Two audiences, two folders. Most people want the first table and never the +second. + +## Using DarkRoom + +| | | +|---|---| +| [The manual](manual/README.md) | Every feature, pictured from the application itself — opening a library, rating and filing, developing, local masks, repair, film, panoramas, export | +| [How it is driven](gestures.md) | Every gesture and shortcut, by screen. Generated from the code, so it cannot describe one the application does not have | + +The [top-level README](../README.md) says what DarkRoom is, how to get it on +each platform, and what is still missing. + +## Changing DarkRoom + +Everything under [`dev/`](dev/) is for someone working on the code. Start with +[CONTRIBUTING.md](../CONTRIBUTING.md), which says how to land a first change +without reading the rest. + +**The register and the record.** What must be built, how it is built, and how +far along it is. + +| | | +|---|---| +| [requirements.md](dev/requirements.md) | What the software must do — the numbered register, the decisions (D-numbers) and the spikes (S-numbers) | +| [architecture.md](dev/architecture.md) | How it is built — crates, the GPU pipeline, the data model, sync | +| [traceability.md](dev/traceability.md) | Generated: which requirement is claimed by which file. Never edited by hand | +| [outstanding.md](dev/outstanding.md) | What is specified and not built, and whether that is a decision or a gap | +| [technical-debt.md](dev/technical-debt.md) | Compromises taken deliberately, each with the condition that retires it | +| [code-health.md](dev/code-health.md) | What a contribution costs, per seam, measured | + +**Designs, one per subsystem.** Each is the specification the code was built +to, kept current as the code moved. + +| | | +|---|---| +| [catalog.md](dev/catalog.md) | The index, the library view, incremental scan, the job queue | +| [storage.md](dev/storage.md) | Storage backends: the seam a folder, a sync client and a Nextcloud account share | +| [faces.md](dev/faces.md) | Face detection, identity, clustering and the eye-state models | +| [segmentation.md](dev/segmentation.md) | How the application finds the regions a local mask snaps to | +| [mask-editing.md](dev/mask-editing.md) | Painting, erasing and combining masks | +| [spot-removal.md](dev/spot-removal.md) | Clone and heal as parameters in the edit graph | +| [panorama.md](dev/panorama.md) | Alignment, projection, the chunked composite and the border fill | +| [inference.md](dev/inference.md) | The neural runtime and model chosen per device, with the measurements | +| [display-and-extension.md](dev/display-and-extension.md) | The display contract, and why the fused pipeline is already most of a plugin format | +| [view-composition.md](dev/view-composition.md) | A controller for the display layer | +| [ui-navigation.md](dev/ui-navigation.md) | Finding things in the interface once there are many | + +**Measurements.** Numbers committed so a regression is a diff rather than a +recollection. + +| | | +|---|---| +| [benchmarks.md](dev/benchmarks.md) | The per-commit suite: what it covers, what it does not, how to read a failure | +| [bench-baseline.json](dev/bench-baseline.json) | The committed numbers the suite checks against | +| [frame-budget.md](dev/frame-budget.md) | What a frame costs on each device, and the decision those figures settled | + +**Platforms and distribution.** + +| | | +|---|---| +| [distribution.md](dev/distribution.md) | Which channels v1 targets and what each one constrains | +| [windows.md](dev/windows.md) | The Windows installer, cross-built from the Linux CI | +| [android-signing.md](dev/android-signing.md) | Which key signs the APK, and keeping it | + +**Archive.** Kept as the record of what was asked for, not as plans. + +| | | +|---|---| +| [milestone-v0.1.md](dev/archive/milestone-v0.1.md) | The first milestone, delivered 2026-08-30 and superseded | +| [ui-refinement.md](dev/archive/ui-refinement.md) | How the interface should look; succeeded by [ui-navigation.md](dev/ui-navigation.md) | + +## Conventions + +Two files here are generated and must not be edited by hand: +`gestures.md` and `dev/traceability.md`. Both come from +`cargo run -p traceability` and the pre-commit hook keeps them in step with +the tree. The manual's pictures are recorded by +[`tools/manual`](../tools/manual/README.md) and live in LFS. + +A design document links to the requirements it satisfies and to the code +that satisfies them. When the code moves, the link moves with it; a document +that has stopped being true goes to `dev/archive/` with a note saying what +replaced it, rather than being deleted. diff --git a/docs/android-signing.md b/docs/dev/android-signing.md similarity index 100% rename from docs/android-signing.md rename to docs/dev/android-signing.md diff --git a/docs/architecture.md b/docs/dev/architecture.md similarity index 100% rename from docs/architecture.md rename to docs/dev/architecture.md diff --git a/docs/milestone-v0.1.md b/docs/dev/archive/milestone-v0.1.md similarity index 97% rename from docs/milestone-v0.1.md rename to docs/dev/archive/milestone-v0.1.md index 9a34faf..7e0c47d 100644 --- a/docs/milestone-v0.1.md +++ b/docs/dev/archive/milestone-v0.1.md @@ -4,8 +4,8 @@ > Kept as the record of what the first milestone asked for, not as a plan. > Everything below shipped, and the application went well past it — see -> [outstanding.md](outstanding.md) for what is still missing at 0.9.0. -**Companion to:** [requirements.md](requirements.md) · [architecture.md](architecture.md) +> [outstanding.md](../outstanding.md) for what is still missing at 0.9.0. +**Companion to:** [requirements.md](../requirements.md) · [architecture.md](../architecture.md) The first buildable milestone: connect to a Nextcloud folder, index it locally, and display RAW previews on both Linux and Android. @@ -39,7 +39,7 @@ building on sand. ## 2. The four assumptions under test -Each maps to a spike in [requirements.md §9](requirements.md). +Each maps to a spike in [requirements.md §9](../requirements.md). | # | Assumption | If wrong | Spike | |---|---|---|---| @@ -55,7 +55,7 @@ all, so it should be proven in the first week, before catalog or sync work begin ## 3. Functional scope -Requirement IDs reference [requirements.md](requirements.md); a v0.1 suffix marks a reduced subset +Requirement IDs reference [requirements.md](../requirements.md); a v0.1 suffix marks a reduced subset of the full requirement. ### 3.1 Account and connection diff --git a/docs/ui-refinement.md b/docs/dev/archive/ui-refinement.md similarity index 100% rename from docs/ui-refinement.md rename to docs/dev/archive/ui-refinement.md diff --git a/docs/bench-baseline.json b/docs/dev/bench-baseline.json similarity index 100% rename from docs/bench-baseline.json rename to docs/dev/bench-baseline.json diff --git a/docs/benchmarks.md b/docs/dev/benchmarks.md similarity index 96% rename from docs/benchmarks.md rename to docs/dev/benchmarks.md index 5947862..a14a2af 100644 --- a/docs/benchmarks.md +++ b/docs/dev/benchmarks.md @@ -2,9 +2,9 @@ **Status:** Built, not yet recorded · 2026-08-30 **Companion to:** [requirements.md](requirements.md) §4.1 (performance targets) · §8 (verification) -**Instrument:** [`tools/bench`](../tools/bench) — `cargo run --release -p dr-bench -- check` +**Instrument:** [`tools/bench`](../../tools/bench) — `cargo run --release -p dr-bench -- check` **Committed numbers:** [`bench-baseline.json`](bench-baseline.json) -**GPU half:** [`core/dr-gpu/tests/frame_budget.rs`](../core/dr-gpu/tests/frame_budget.rs) · +**GPU half:** [`core/dr-gpu/tests/frame_budget.rs`](../../core/dr-gpu/tests/frame_budget.rs) · [frame-budget.md](frame-budget.md) §8 has said since it was written that performance is verified by *"an automated @@ -60,7 +60,7 @@ Two of those rows carry a qualifier, and the qualifiers are the point. library view cannot paint without: `Catalog::open` (which connects, migrates and **backfills**, and the backfill is three passes over the images table on every open), `count`, the first 400-row `window`, and the monthly `timeline`. Tagged -`TRACES: NFR-P1` in [`tools/bench/src/catalog_open.rs`](../tools/bench/src/catalog_open.rs), +`TRACES: NFR-P1` in [`tools/bench/src/catalog_open.rs`](../../tools/bench/src/catalog_open.rs), because a build that breaks it fails this gate. **NFR-P3 — ≥ 100 images per second on the embedded preview path.** The @@ -69,7 +69,7 @@ per-image work is exactly what `spawn_thumbnail_sweep` does — `decode_jpeg`, `ThumbStore::put` — arranged in the same shape: chunks of 96, lanes owning disjoint slices, and the single thread that owns the store writing the finished chunk. Tagged `TRACES: NFR-P3` in -[`tools/bench/src/thumbnails.rs`](../tools/bench/src/thumbnails.rs). +[`tools/bench/src/thumbnails.rs`](../../tools/bench/src/thumbnails.rs). ### Requirements this can only half-answer, and is not tagged for @@ -114,7 +114,7 @@ instead of ~2 TB, and neither half is flattered by that. | Rows | 50,000 images, 50,000 default versions, 400 folders, one root | | Capture times | Twelve years from a fixed epoch, so the timeline has ~144 monthly buckets | | Sources | 12 synthesised JPEGs at 1620 × 1080 — the size `dr-decode` records a CR2 carrying in IFD2 | -| Seed | 20260829, in [`tools/bench/src/main.rs`](../tools/bench/src/main.rs) | +| Seed | 20260829, in [`tools/bench/src/main.rs`](../../tools/bench/src/main.rs) | | Location | `$DR_BENCH_DIR`, else the system temporary directory | It is reproducible from the seed, and a `stamp.json` beside it records what it diff --git a/docs/catalog.md b/docs/dev/catalog.md similarity index 100% rename from docs/catalog.md rename to docs/dev/catalog.md diff --git a/docs/code-health.md b/docs/dev/code-health.md similarity index 100% rename from docs/code-health.md rename to docs/dev/code-health.md diff --git a/docs/display-and-extension.md b/docs/dev/display-and-extension.md similarity index 100% rename from docs/display-and-extension.md rename to docs/dev/display-and-extension.md diff --git a/docs/distribution.md b/docs/dev/distribution.md similarity index 95% rename from docs/distribution.md rename to docs/dev/distribution.md index aca6944..cd66dc2 100644 --- a/docs/distribution.md +++ b/docs/dev/distribution.md @@ -17,8 +17,8 @@ permission to a package rather than after. | Platform | Channel | State | What it constrains | |---|---|---|---| -| Linux | Arch source package — [`packaging/PKGBUILD`](../packaging/PKGBUILD) | Built, in tree | Nothing. Full filesystem access, system Vulkan, system secret daemon | -| Linux | Flatpak — [`packaging/flatpak/`](../packaging/flatpak/) | Manifest in tree, **library selection does not work** (§4) | Portals only. No `--filesystem=`, no host mount table, no typed paths | +| Linux | Arch source package — [`packaging/PKGBUILD`](../../packaging/PKGBUILD) | Built, in tree | Nothing. Full filesystem access, system Vulkan, system secret daemon | +| Linux | Flatpak — [`packaging/flatpak/`](../../packaging/flatpak/) | Manifest in tree, **library selection does not work** (§4) | Portals only. No `--filesystem=`, no host mount table, no typed paths | | Linux | AppImage | v1 channel, **recipe not yet written** (§5) | Oldest supported glibc, and no sandbox at all | | Android | F-Droid | v1 channel, not yet submitted | GPLv3-clean build, reproducible, no proprietary blobs | | Android | Play Store | **Not v1** (§6) | Would make ARCH §6.9 binding as policy rather than as engineering | @@ -39,7 +39,7 @@ somewhere: that misses one of them costs the icon in the shell or the association in the software centre, and neither failure announces itself. - **The metainfo, not just the desktop entry.** - [`packaging/paris.tourolle.darkroom.metainfo.xml`](../packaging/paris.tourolle.darkroom.metainfo.xml) + [`packaging/paris.tourolle.darkroom.metainfo.xml`](../../packaging/paris.tourolle.darkroom.metainfo.xml) is the single description of the application, installed by every channel that has somewhere to put it. Its `metadata_license` is CC0-1.0 and its `project_license` is GPL-3.0-or-later; those differ on purpose — see the @@ -173,7 +173,7 @@ Two changes, in this order: chooser instead of a volume list. **Done when:** a Flatpak built from -[`packaging/flatpak/paris.tourolle.darkroom.yml`](../packaging/flatpak/paris.tourolle.darkroom.yml), +[`packaging/flatpak/paris.tourolle.darkroom.yml`](../../packaging/flatpak/paris.tourolle.darkroom.yml), with its `finish-args` unchanged and no `flatpak override` applied, can select a library root, scan it, and write a sidecar back into it. diff --git a/docs/faces.md b/docs/dev/faces.md similarity index 100% rename from docs/faces.md rename to docs/dev/faces.md diff --git a/docs/frame-budget.md b/docs/dev/frame-budget.md similarity index 99% rename from docs/frame-budget.md rename to docs/dev/frame-budget.md index b9bf1b2..5981cb2 100644 --- a/docs/frame-budget.md +++ b/docs/dev/frame-budget.md @@ -3,8 +3,8 @@ **Status:** Measured · 2026-08-27 **Companion to:** [display-and-extension.md](display-and-extension.md) §2–3 · [requirements.md](requirements.md) §3.4 FR-DSP-2, FR-DSP-3, FR-DSP-4 -**Instrument:** [`core/dr-gpu/examples/frame_budget.rs`](../core/dr-gpu/examples/frame_budget.rs) -**Guard:** [`core/dr-gpu/tests/frame_budget.rs`](../core/dr-gpu/tests/frame_budget.rs) +**Instrument:** [`core/dr-gpu/examples/frame_budget.rs`](../../core/dr-gpu/examples/frame_budget.rs) +**Guard:** [`core/dr-gpu/tests/frame_budget.rs`](../../core/dr-gpu/tests/frame_budget.rs) [display-and-extension.md](display-and-extension.md) §2 fixed a decision rule in advance and made three measurements the thing that settles it. This file is diff --git a/docs/inference.md b/docs/dev/inference.md similarity index 100% rename from docs/inference.md rename to docs/dev/inference.md diff --git a/docs/mask-editing.md b/docs/dev/mask-editing.md similarity index 97% rename from docs/mask-editing.md rename to docs/dev/mask-editing.md index 574c4ee..4158193 100644 --- a/docs/mask-editing.md +++ b/docs/dev/mask-editing.md @@ -18,11 +18,11 @@ The core is further along than the interface, and it is worth being exact about which half is missing, because it changes the size of the work. **Painting exists everywhere except where a finger is.** -[`MaskSource::Brush`](../core/dr-pipeline/src/mask.rs), [`Stroke`], the +[`MaskSource::Brush`](../../core/dr-pipeline/src/mask.rs), [`Stroke`], the simplification and the point budgets, the sidecar's `stroke = …` line and its parser, the GPU's per-stroke bounding-box draw with add and erase blend states — all of it is written, tested, and reachable from no control in the -application. [`toolrail.slint:138`](../ui/dr-ui/ui/toolrail.slint#L138) says so +application. [`toolrail.slint:138`](../../ui/dr-ui/ui/toolrail.slint#L138) says so in as many words: *"what is missing is the canvas interaction"*. **A mask has exactly one source.** A layer is one `MaskSource` and a shaping @@ -37,7 +37,7 @@ shoulder and leaks four pixels into the hair, no global number fixes both, and that is the ordinary case rather than a corner one. **And you cannot see the mask.** *(Built — see §6.)* The overlay on the canvas -was [`overlay_rgba`](../ui/dr-ui/src/segmentation.rs) and nothing else — a +was [`overlay_rgba`](../../ui/dr-ui/src/segmentation.rs) and nothing else — a CPU-built false-colour picture of *what the model detected*, at proxy resolution. It is not the layer's alpha: it knows nothing of the layer's feather, its falloff, its morphology, its invert, or its opacity. Nobody can @@ -234,7 +234,7 @@ writes with one part is byte-identical to what it writes today**: 3. `stroke = …` lines keep their position and their meaning. The mode token gains `push`, and `cling` is a fourth number written only when non-zero. An older build meeting either drops *that stroke and only that stroke*, - which is the rule [`parse_stroke`](../core/dr-pipeline/src/sidecar.rs) + which is the rule [`parse_stroke`](../../core/dr-pipeline/src/sidecar.rs) already documents and already implements. **Merge (FR-NC-9).** A part is a block with an id, so two devices that added @@ -272,7 +272,7 @@ The set operations are already expressible in fixed-function blending over | Intersect | `Zero`, `Src`, `Add` | `dst · src` | M2 | The middle row is `brush_erase`, already constructed in -[`MaskPass::new`](../core/dr-gpu/src/mask.rs). The other two are the same +[`MaskPass::new`](../../core/dr-gpu/src/mask.rs). The other two are the same three vertices with a different `BlendState`, and nothing is read back. **One correction to the first draft of this section, found in the building.** @@ -289,7 +289,7 @@ the first time any layer has more than one part) and blended from there. A layer of one part still takes the old path exactly — straight into its slice, no scratch, no combine pass — which is what keeps every existing mask rendering as it did. `an_erase_stroke_holes_its_own_part_and_not_the_mask` in -[`local_adjustments.rs`](../core/dr-gpu/tests/local_adjustments.rs) is the test +[`local_adjustments.rs`](../../core/dr-gpu/tests/local_adjustments.rs) is the test that holds this in place. `Max` blending on `r8unorm` is core WGPU and universally supported on the @@ -342,7 +342,7 @@ Three honest costs: ### 5.4 Painting has to be incremental -Today [`MaskPass::render`](../core/dr-gpu/src/mask.rs) clears each slice and +Today [`MaskPass::render`](../../core/dr-gpu/src/mask.rs) clears each slice and redraws every stroke of the layer. That is right when a shape changes and wrong while a finger is down: at 120 reports a second, a layer holding 4096 points redraws all of them per dab, and the cost of a stroke grows as it is @@ -359,14 +359,14 @@ changing falls back to the full rebuild it does now. This is required, not an optimisation to schedule later: it is what decides whether painting is usable on the phone, and it is the specific failure -[`mask.rs`'s module docs](../core/dr-pipeline/src/mask.rs) say this whole +[`mask.rs`'s module docs](../../core/dr-pipeline/src/mask.rs) say this whole design exists to avoid. ### 5.5 Distance fields become per part -[`SubjectMasks`](../core/dr-gpu/src/mask.rs) uploads one signed distance field +[`SubjectMasks`](../../core/dr-gpu/src/mask.rs) uploads one signed distance field **per active layer, in stack order**, and -[`DevelopSession`](../ui/dr-ui/src/develop.rs) builds them on the same +[`DevelopSession`](../../ui/dr-ui/src/develop.rs) builds them on the same indexing. With parts, a field belongs to the part that shaped it: the upload becomes one field per *model-backed part*, flattened in `(layer, part)` order, and the rasteriser indexes it by a running counter rather than by `slot`. @@ -540,7 +540,7 @@ layer's. or painted. One code path, three joins. **Folding two layers into one** uses the multi-selection -[`masks_ui.rs`](../ui/dr-ui/src/masks_ui.rs) already supports: with two layers +[`masks_ui.rs`](../../ui/dr-ui/src/masks_ui.rs) already supports: with two layers selected, "Combine" appends the second's parts to the first and removes it. Offered only when the second layer's adjustments are neutral, and otherwise offered with a warning that names what will be lost — quietly discarding an @@ -560,7 +560,7 @@ who sets a small eraser expects it to still be small the next time they erase. ### 7.4 Gestures Each of these needs a `GESTURE:` block beside its implementation — that is the -only place [gestures.md](gestures.md) can be written from. +only place [gestures.md](../gestures.md) can be written from. | Gesture | Touch | Pointer | Keyboard | |---------|-------|---------|----------| @@ -611,7 +611,7 @@ removing or re-joining a part. The mask stack is already snapshotted per step and shared by `Arc` when a step does not touch it, so the cost of an undoable stroke is a clone of one layer's parts, not of the picture. New keys in -[`labels.rs`](../ui/dr-ui/src/labels.rs): +[`labels.rs`](../../ui/dr-ui/src/labels.rs): ``` history.mask_painted "Paint Mask" diff --git a/docs/outstanding.md b/docs/dev/outstanding.md similarity index 98% rename from docs/outstanding.md rename to docs/dev/outstanding.md index 141b0a3..0b44e43 100644 --- a/docs/outstanding.md +++ b/docs/dev/outstanding.md @@ -196,7 +196,7 @@ inside `#[cfg(test)]` — `LocalStorage::open` refuses it, and the test that pro `dr_plat::imports_supported`, which *returns false on Android* and whose own documentation says it "stops being false when a SAF implementation lands". The second tag documented the absence of the thing it was counted as evidence for. Both have been removed; this is the "plumbing a future feature -would use" case [CONTRIBUTING.md](../CONTRIBUTING.md) and [code-health.md CH-4](code-health.md) both +would use" case [CONTRIBUTING.md](../../CONTRIBUTING.md) and [code-health.md CH-4](code-health.md) both warn about. Android reaches a library through a Nextcloud account or a folder, over paths, like the desktop. @@ -355,10 +355,10 @@ synthetic 50k catalog, run per commit, where **"a regression beyond a stated tol failure, not a notification."** For most of this project's life it did not exist — no `benches/`, no criterion, no synthetic catalog, and three CI workflows that between them measured nothing. -**It exists now, for everything that does not need a frame.** [`tools/bench`](../tools/bench) builds +**It exists now, for everything that does not need a frame.** [`tools/bench`](../../tools/bench) builds a deterministic 50,000-row catalog over a pool of a dozen real files, measures against it, and fails the build on a violated budget or a drift past tolerance; -[`.gitea/workflows/benchmark.yml`](../.gitea/workflows/benchmark.yml) runs it on every push, and +[`.gitea/workflows/benchmark.yml`](../../.gitea/workflows/benchmark.yml) runs it on every push, and [benchmarks.md](benchmarks.md) is the account of what it does and does not cover. **NFR-P1** and **NFR-P3** are now genuinely gated, and R2's "catalog opens in under 2s" clause with them. @@ -404,7 +404,7 @@ 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, so both -tags were removed. It is the case [CONTRIBUTING.md](../CONTRIBUTING.md) warns about in its own words: +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 diff --git a/docs/panorama.md b/docs/dev/panorama.md similarity index 99% rename from docs/panorama.md rename to docs/dev/panorama.md index de95209..02928a3 100644 --- a/docs/panorama.md +++ b/docs/dev/panorama.md @@ -179,7 +179,7 @@ exports the network alone at 768×1024 — thirteen operator types, all standard: `Conv`, `InstanceNormalization`, `AveragePool`, `Resize`, `Slice`, `Transpose`, `Reshape`, `Concat`, `Add`, `Relu`, `Sigmoid`, `ReduceMean`, `Unsqueeze` — and -[`examples/onnx_probe.rs`](../core/dr-segment/examples/onnx_probe.rs) loads +[`examples/onnx_probe.rs`](../../core/dr-segment/examples/onnx_probe.rs) loads the 2.8 MB file through the app's own `ort`-over-tract backend with nothing unsupported, in 28 ms, and runs it in **~300 ms on the reference desktop's CPU**. The weights ship as `models/keypoints/xfeat-1024.onnx`, recorded in @@ -255,7 +255,7 @@ Two containers were candidates and S15.1 decided, on 2026-09-19: the existing encoder with a different sample type, and nothing about it is uncertain. -**Linear DNG.** [`examples/linear_dng.rs`](../core/dr-decode/examples/linear_dng.rs) +**Linear DNG.** [`examples/linear_dng.rs`](../../core/dr-decode/examples/linear_dng.rs) hand-rolls a 64 × 48 `LinearRaw` DNG — one IFD, uncompressed 16-bit RGB, `DNGVersion`, `ColorMatrix1`, `AsShotNeutral`, `CalibrationIlluminant1` — and rawler 0.7 reads it back: `cpp 3`, the samples interleaved as written, the diff --git a/docs/requirements.md b/docs/dev/requirements.md similarity index 99% rename from docs/requirements.md rename to docs/dev/requirements.md index 8075812..ce1fac3 100644 --- a/docs/requirements.md +++ b/docs/dev/requirements.md @@ -2140,7 +2140,7 @@ Rationale, evidence, and the eliminated alternatives are recorded in |---|---|---| | D1 | Language and UI framework | Rust + Slint, rendering through wgpu | | D2 | RAW decoder | rawler; LibRaw fallback behind a trait | -| D3 | First milestone | Delivered — [milestone-v0.1.md](milestone-v0.1.md), closed 2026-08-30 | +| D3 | First milestone | Delivered — [milestone-v0.1.md](archive/milestone-v0.1.md), closed 2026-08-30 | | D4 | Nextcloud sync mechanism | ETag pruning, chunked upload v2, Login Flow v2 | | D5 | Colour management | lcms2 + GPU-side matrix/LUT transforms | | D6 | Shader authoring | Hand-written WGSL | diff --git a/docs/segmentation.md b/docs/dev/segmentation.md similarity index 100% rename from docs/segmentation.md rename to docs/dev/segmentation.md diff --git a/docs/spot-removal.md b/docs/dev/spot-removal.md similarity index 98% rename from docs/spot-removal.md rename to docs/dev/spot-removal.md index 2ed0d28..aa2fa5b 100644 --- a/docs/spot-removal.md +++ b/docs/dev/spot-removal.md @@ -21,11 +21,11 @@ one in its class and the workflow still breaks at the first frame with a mark on the sky. It is also, unusually, a feature whose cost has already been paid twice over. -The neighbourhood stage exists ([`crate::detail`](../core/dr-pipeline/src/detail.rs)), +The neighbourhood stage exists ([`crate::detail`](../../core/dr-pipeline/src/detail.rs)), the convention for storing geometry in normalised source coordinates exists -([`mask.rs`](../core/dr-pipeline/src/mask.rs)), the canvas-drag pattern exists -([`gradient.rs`](../ui/dr-ui/src/gradient.rs)), and the merge-by-id rule exists -([`sidecar.rs`](../core/dr-pipeline/src/sidecar.rs)). What is genuinely new is +([`mask.rs`](../../core/dr-pipeline/src/mask.rs)), the canvas-drag pattern exists +([`gradient.rs`](../../ui/dr-ui/src/gradient.rs)), and the merge-by-id rule exists +([`sidecar.rs`](../../core/dr-pipeline/src/sidecar.rs)). What is genuinely new is small and is named in §3. ## 2. Non-goals diff --git a/docs/storage.md b/docs/dev/storage.md similarity index 100% rename from docs/storage.md rename to docs/dev/storage.md diff --git a/docs/technical-debt.md b/docs/dev/technical-debt.md similarity index 100% rename from docs/technical-debt.md rename to docs/dev/technical-debt.md diff --git a/docs/dev/traceability.md b/docs/dev/traceability.md new file mode 100644 index 0000000..bd4a21c --- /dev/null +++ b/docs/dev/traceability.md @@ -0,0 +1,258 @@ +# Requirements traceability matrix + + + + +Denominators are parsed from [`requirements.md`](requirements.md) at run time, never hardcoded. Coverage is the intersection of tagged and defined IDs over defined IDs, so it cannot exceed 100%. A requirement whose definition line carries `(post-v1)` is defined but deferred: outside the denominator, listed below, and never an orphan. + +## Summary + +| Metric | Value | +|---|---| +| Source files scanned | 392 | +| TRACES tags found | 1573 | +| Requirements defined | 184 | +| Requirements deferred (post-v1) | 24 | +| Requirements covered | 154 | +| **Coverage** | **83.7%** (154/184) | + +### By type + +| Type | Covered | Defined | +|---|---|---| +| FR | 116 | 127 | +| NFR | 34 | 50 | +| R | 4 | 7 | + +## Orphan tags + +A tag naming an ID `requirements.md` does not define — what renumbering produces, and what a typo produces. + +- `FR-INF-1` + +## Tagged requirements + +| 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:129`](../../core/dr-sync/src/scan.rs#L129), [`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:377`](../../core/dr-types/src/settings.rs#L377), [`platform/dr-plat/src/storage.rs:287`](../../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:586`](../../platform/dr-plat/src/storage.rs#L586), [`platform/dr-plat/src/volumes.rs:1`](../../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../../platform/dr-plat/src/volumes.rs#L62), [`ui/dr-ui/src/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:1559`](../../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../../ui/dr-ui/src/lib.rs#L1559), [`ui/dr-ui/src/library.rs:183`](../../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:3396`](../../ui/dr-ui/src/library.rs#L3396), [`ui/dr-ui/ui/import.slint:5`](../../ui/dr-ui/ui/import.slint#L5) | +| FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:137`](../../core/dr-pipeline/src/sidecar.rs#L137) | +| FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library.rs:1564`](../../ui/dr-ui/src/library.rs#L1564), [`ui/dr-ui/src/library.rs:1627`](../../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library.rs:1750`](../../ui/dr-ui/src/library.rs#L1750), [`ui/dr-ui/src/library_ui.rs:1322`](../../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:540`](../../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:900`](../../ui/dr-ui/ui/app.slint#L900), [`ui/dr-ui/ui/settings.slint:1093`](../../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../../ui/dr-ui/ui/settings.slint#L199) | +| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../../core/dr-thumbs/src/lib.rs#L393), [`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:4592`](../../ui/dr-ui/src/library.rs#L4592), [`ui/dr-ui/src/library.rs:4626`](../../ui/dr-ui/src/library.rs#L4626), [`ui/dr-ui/src/library_ui.rs:238`](../../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../../ui/dr-ui/src/library_ui.rs#L914), [`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:105`](../../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs: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:3940`](../../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:177`](../../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:387`](../../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`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:564`](../../core/dr-catalog/src/schema.rs#L564), [`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:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`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:4640`](../../ui/dr-ui/src/library.rs#L4640), [`ui/dr-ui/src/library_ui.rs:789`](../../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../../ui/dr-ui/ui/app.slint#L575), [`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:4246`](../../ui/dr-ui/ui/library.slint#L4246) | +| 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:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`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:5116`](../../ui/dr-ui/src/library.rs#L5116), [`ui/dr-ui/src/library_ui.rs:396`](../../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../../ui/dr-ui/ui/settings.slint#L191) | +| 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:4921`](../../ui/dr-ui/src/library.rs#L4921), [`ui/dr-ui/src/library.rs:4947`](../../ui/dr-ui/src/library.rs#L4947), [`ui/dr-ui/src/library.rs:5002`](../../ui/dr-ui/src/library.rs#L5002), [`ui/dr-ui/src/library_ui.rs:2774`](../../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../../ui/dr-ui/ui/app.slint#L599), [`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:2942`](../../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998) | +| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:7386`](../../ui/dr-ui/src/library.rs#L7386), [`ui/dr-ui/src/library.rs:73`](../../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:926`](../../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:274`](../../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5224`](../../ui/dr-ui/src/library.rs#L5224), [`ui/dr-ui/src/library.rs:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../../ui/dr-ui/src/presets.rs#L498), [`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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:781`](../../core/dr-catalog/src/schema.rs#L781), [`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-face/src/references.rs:1`](../../core/dr-face/src/references.rs#L1), [`core/dr-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`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:2416`](../../ui/dr-ui/src/develop.rs#L2416), [`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:1325`](../../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2576`](../../ui/dr-ui/src/lib.rs#L2576), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../../ui/dr-ui/ui/identity.slint#L1), [`ui/dr-ui/ui/settings.slint:529`](../../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:94`](../../ui/dr-ui/ui/settings.slint#L94) | +| FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`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:345`](../../ui/dr-ui/src/library.rs#L345), [`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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../../core/dr-catalog/src/schema.rs#L603), [`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-13 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7219`](../../ui/dr-ui/src/library.rs#L7219), [`ui/dr-ui/src/library.rs:7262`](../../ui/dr-ui/src/library.rs#L7262), [`ui/dr-ui/src/library.rs:7300`](../../ui/dr-ui/src/library.rs#L7300), [`ui/dr-ui/ui/app.slint:707`](../../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) | +| 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:4146`](../../ui/dr-ui/src/develop.rs#L4146), [`ui/dr-ui/src/develop.rs:4159`](../../ui/dr-ui/src/develop.rs#L4159), [`ui/dr-ui/src/develop.rs:4204`](../../ui/dr-ui/src/develop.rs#L4204), [`ui/dr-ui/src/develop.rs:4215`](../../ui/dr-ui/src/develop.rs#L4215), [`ui/dr-ui/src/develop.rs:4221`](../../ui/dr-ui/src/develop.rs#L4221), [`ui/dr-ui/src/develop.rs:4238`](../../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/develop.rs:810`](../../ui/dr-ui/src/develop.rs#L810), [`ui/dr-ui/src/develop.rs:830`](../../ui/dr-ui/src/develop.rs#L830), [`ui/dr-ui/src/develop.rs:836`](../../ui/dr-ui/src/develop.rs#L836), [`ui/dr-ui/src/develop.rs:8992`](../../ui/dr-ui/src/develop.rs#L8992), [`ui/dr-ui/src/develop.rs:9056`](../../ui/dr-ui/src/develop.rs#L9056), [`ui/dr-ui/src/develop.rs:9079`](../../ui/dr-ui/src/develop.rs#L9079), [`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:1932`](../../ui/dr-ui/src/lib.rs#L1932), [`ui/dr-ui/src/lib.rs:2040`](../../ui/dr-ui/src/lib.rs#L2040), [`ui/dr-ui/src/lib.rs:2153`](../../ui/dr-ui/src/lib.rs#L2153), [`ui/dr-ui/src/lib.rs:2194`](../../ui/dr-ui/src/lib.rs#L2194), [`ui/dr-ui/src/lib.rs:3685`](../../ui/dr-ui/src/lib.rs#L3685), [`ui/dr-ui/src/lib.rs:442`](../../ui/dr-ui/src/lib.rs#L442), [`ui/dr-ui/src/peaking.rs:1`](../../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:2028`](../../ui/dr-ui/ui/app.slint#L2028), [`ui/dr-ui/ui/app.slint:3035`](../../ui/dr-ui/ui/app.slint#L3035), [`ui/dr-ui/ui/app.slint:90`](../../ui/dr-ui/ui/app.slint#L90), [`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:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`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:564`](../../ui/dr-ui/src/library.rs#L564) | +| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../../core/dr-catalog/src/schema.rs#L646), [`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:6039`](../../ui/dr-ui/src/library.rs#L6039) | +| 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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:714`](../../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1325`](../../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:603`](../../ui/dr-ui/src/identity_ui.rs#L603), [`ui/dr-ui/src/lib.rs:1511`](../../ui/dr-ui/src/lib.rs#L1511), [`ui/dr-ui/src/lib.rs:3940`](../../ui/dr-ui/src/lib.rs#L3940), [`ui/dr-ui/src/library.rs:3624`](../../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/library.rs:3889`](../../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/src/library_ui.rs:406`](../../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:552`](../../ui/dr-ui/src/settings_ui.rs#L552), [`ui/dr-ui/ui/app.slint:946`](../../ui/dr-ui/ui/app.slint#L946), [`ui/dr-ui/ui/settings.slint:100`](../../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../../ui/dr-ui/ui/settings.slint#L529), [`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-8a | [`core/dr-catalog/src/faces.rs:124`](../../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7219`](../../ui/dr-ui/src/library.rs#L7219), [`ui/dr-ui/src/library.rs:7262`](../../ui/dr-ui/src/library.rs#L7262), [`ui/dr-ui/src/library.rs:7300`](../../ui/dr-ui/src/library.rs#L7300), [`ui/dr-ui/src/repairs.rs:571`](../../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:781`](../../core/dr-catalog/src/schema.rs#L781), [`core/dr-face/src/assign.rs:1`](../../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:517`](../../ui/dr-ui/src/repairs.rs#L517), [`ui/dr-ui/ui/identity.slint:347`](../../ui/dr-ui/ui/identity.slint#L347) | +| 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:2845`](../../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1336`](../../core/dr-pipeline/src/sidecar.rs#L1336), [`core/dr-pipeline/src/sidecar.rs:1515`](../../core/dr-pipeline/src/sidecar.rs#L1515), [`core/dr-pipeline/src/sidecar.rs:1604`](../../core/dr-pipeline/src/sidecar.rs#L1604), [`core/dr-pipeline/src/sidecar.rs:1708`](../../core/dr-pipeline/src/sidecar.rs#L1708), [`core/dr-pipeline/src/sidecar.rs:1916`](../../core/dr-pipeline/src/sidecar.rs#L1916), [`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:2318`](../../ui/dr-ui/src/develop.rs#L2318), [`ui/dr-ui/src/develop.rs:3666`](../../ui/dr-ui/src/develop.rs#L3666), [`ui/dr-ui/src/develop.rs:3693`](../../ui/dr-ui/src/develop.rs#L3693), [`ui/dr-ui/src/develop.rs:3725`](../../ui/dr-ui/src/develop.rs#L3725), [`ui/dr-ui/src/develop.rs:3749`](../../ui/dr-ui/src/develop.rs#L3749), [`ui/dr-ui/src/develop.rs:3755`](../../ui/dr-ui/src/develop.rs#L3755), [`ui/dr-ui/src/develop.rs:3762`](../../ui/dr-ui/src/develop.rs#L3762), [`ui/dr-ui/src/develop.rs:3782`](../../ui/dr-ui/src/develop.rs#L3782), [`ui/dr-ui/src/labels.rs:63`](../../ui/dr-ui/src/labels.rs#L63), [`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:424`](../../ui/dr-ui/src/lib.rs#L424), [`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:2620`](../../ui/dr-ui/ui/app.slint#L2620), [`ui/dr-ui/ui/app.slint:2633`](../../ui/dr-ui/ui/app.slint#L2633), [`ui/dr-ui/ui/masks.slint:832`](../../ui/dr-ui/ui/masks.slint#L832) | +| 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-19 | [`core/dr-pipeline/src/mask.rs:1307`](../../core/dr-pipeline/src/mask.rs#L1307) | +| FR-DEV-19a | [`core/dr-gpu/src/mask.rs:761`](../../core/dr-gpu/src/mask.rs#L761), [`core/dr-pipeline/src/mask.rs:1588`](../../core/dr-pipeline/src/mask.rs#L1588), [`core/dr-pipeline/src/mask.rs:2919`](../../core/dr-pipeline/src/mask.rs#L2919), [`core/dr-pipeline/src/mask.rs:988`](../../core/dr-pipeline/src/mask.rs#L988), [`core/dr-pipeline/src/sidecar.rs:1226`](../../core/dr-pipeline/src/sidecar.rs#L1226), [`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:2930`](../../ui/dr-ui/src/develop.rs#L2930), [`ui/dr-ui/src/develop.rs:2991`](../../ui/dr-ui/src/develop.rs#L2991), [`ui/dr-ui/src/develop.rs:3010`](../../ui/dr-ui/src/develop.rs#L3010), [`ui/dr-ui/src/develop.rs:880`](../../ui/dr-ui/src/develop.rs#L880), [`ui/dr-ui/src/labels.rs:73`](../../ui/dr-ui/src/labels.rs#L73), [`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:770`](../../ui/dr-ui/ui/masks.slint#L770), [`ui/dr-ui/ui/masks.slint:855`](../../ui/dr-ui/ui/masks.slint#L855) | +| FR-DEV-19b | [`ui/dr-ui/src/develop.rs:3091`](../../ui/dr-ui/src/develop.rs#L3091), [`ui/dr-ui/src/develop.rs:3634`](../../ui/dr-ui/src/develop.rs#L3634), [`ui/dr-ui/src/develop.rs:889`](../../ui/dr-ui/src/develop.rs#L889), [`ui/dr-ui/src/develop.rs:896`](../../ui/dr-ui/src/develop.rs#L896), [`ui/dr-ui/src/labels.rs:67`](../../ui/dr-ui/src/labels.rs#L67), [`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:1056`](../../ui/dr-ui/ui/app.slint#L1056), [`ui/dr-ui/ui/app.slint:2260`](../../ui/dr-ui/ui/app.slint#L2260), [`ui/dr-ui/ui/masks.slint:1126`](../../ui/dr-ui/ui/masks.slint#L1126), [`ui/dr-ui/ui/masks.slint:453`](../../ui/dr-ui/ui/masks.slint#L453), [`ui/dr-ui/ui/masks.slint:774`](../../ui/dr-ui/ui/masks.slint#L774), [`ui/dr-ui/ui/masks.slint:848`](../../ui/dr-ui/ui/masks.slint#L848), [`ui/dr-ui/ui/masks.slint:864`](../../ui/dr-ui/ui/masks.slint#L864) | +| 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:893`](../../core/dr-pipeline/src/graph.rs#L893), [`core/dr-pipeline/src/mask.rs:1796`](../../core/dr-pipeline/src/mask.rs#L1796), [`core/dr-pipeline/src/mask.rs:1822`](../../core/dr-pipeline/src/mask.rs#L1822), [`core/dr-pipeline/src/mask.rs:1837`](../../core/dr-pipeline/src/mask.rs#L1837), [`core/dr-pipeline/src/mask.rs:1957`](../../core/dr-pipeline/src/mask.rs#L1957), [`core/dr-pipeline/src/mask.rs:2005`](../../core/dr-pipeline/src/mask.rs#L2005), [`core/dr-pipeline/src/mask.rs:2149`](../../core/dr-pipeline/src/mask.rs#L2149), [`core/dr-pipeline/src/mask.rs:2386`](../../core/dr-pipeline/src/mask.rs#L2386), [`core/dr-pipeline/src/operation.rs:1748`](../../core/dr-pipeline/src/operation.rs#L1748), [`core/dr-pipeline/src/operation.rs:588`](../../core/dr-pipeline/src/operation.rs#L588), [`core/dr-pipeline/src/operation.rs:863`](../../core/dr-pipeline/src/operation.rs#L863), [`ui/dr-ui/src/develop.rs:2035`](../../ui/dr-ui/src/develop.rs#L2035), [`ui/dr-ui/src/develop.rs:2295`](../../ui/dr-ui/src/develop.rs#L2295), [`ui/dr-ui/src/develop.rs:2542`](../../ui/dr-ui/src/develop.rs#L2542), [`ui/dr-ui/src/develop.rs:2675`](../../ui/dr-ui/src/develop.rs#L2675), [`ui/dr-ui/src/develop.rs:4068`](../../ui/dr-ui/src/develop.rs#L4068), [`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:7249`](../../ui/dr-ui/src/develop.rs#L7249), [`ui/dr-ui/src/develop.rs:7285`](../../ui/dr-ui/src/develop.rs#L7285), [`ui/dr-ui/src/develop.rs:915`](../../ui/dr-ui/src/develop.rs#L915), [`ui/dr-ui/src/develop.rs:924`](../../ui/dr-ui/src/develop.rs#L924), [`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:1091`](../../ui/dr-ui/ui/masks.slint#L1091), [`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:782`](../../ui/dr-ui/ui/masks.slint#L782), [`ui/dr-ui/ui/masks.slint:850`](../../ui/dr-ui/ui/masks.slint#L850), [`ui/dr-ui/ui/masks.slint:938`](../../ui/dr-ui/ui/masks.slint#L938) | +| 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:2443`](../../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:679`](../../core/dr-gpu/src/adjust.rs#L679), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`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:1348`](../../core/dr-pipeline/src/graph.rs#L1348), [`core/dr-pipeline/src/graph.rs:1379`](../../core/dr-pipeline/src/graph.rs#L1379), [`core/dr-pipeline/src/graph.rs:1402`](../../core/dr-pipeline/src/graph.rs#L1402), [`core/dr-pipeline/src/graph.rs:1440`](../../core/dr-pipeline/src/graph.rs#L1440), [`core/dr-pipeline/src/graph.rs:1471`](../../core/dr-pipeline/src/graph.rs#L1471), [`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:860`](../../core/dr-pipeline/src/graph.rs#L860), [`core/dr-pipeline/src/graph.rs:952`](../../core/dr-pipeline/src/graph.rs#L952), [`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/mask.rs:558`](../../core/dr-pipeline/src/mask.rs#L558), [`core/dr-pipeline/src/neutral.rs:1`](../../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:306`](../../core/dr-pipeline/src/neutral.rs#L306), [`core/dr-pipeline/src/neutral.rs:322`](../../core/dr-pipeline/src/neutral.rs#L322), [`core/dr-pipeline/src/neutral.rs:338`](../../core/dr-pipeline/src/neutral.rs#L338), [`core/dr-pipeline/src/neutral.rs:360`](../../core/dr-pipeline/src/neutral.rs#L360), [`core/dr-pipeline/src/neutral.rs:81`](../../core/dr-pipeline/src/neutral.rs#L81), [`core/dr-pipeline/src/operation.rs:330`](../../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:565`](../../core/dr-pipeline/src/operation.rs#L565), [`core/dr-pipeline/src/operation.rs:637`](../../core/dr-pipeline/src/operation.rs#L637), [`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:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:192`](../../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`core/dr-pipeline/src/sidecar.rs:2312`](../../core/dr-pipeline/src/sidecar.rs#L2312), [`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:1318`](../../ui/dr-ui/src/develop.rs#L1318), [`ui/dr-ui/src/develop.rs:1407`](../../ui/dr-ui/src/develop.rs#L1407), [`ui/dr-ui/src/develop.rs:1443`](../../ui/dr-ui/src/develop.rs#L1443), [`ui/dr-ui/src/develop.rs:165`](../../ui/dr-ui/src/develop.rs#L165), [`ui/dr-ui/src/develop.rs:1714`](../../ui/dr-ui/src/develop.rs#L1714), [`ui/dr-ui/src/develop.rs:2155`](../../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:2398`](../../ui/dr-ui/src/develop.rs#L2398), [`ui/dr-ui/src/develop.rs:2416`](../../ui/dr-ui/src/develop.rs#L2416), [`ui/dr-ui/src/develop.rs:2430`](../../ui/dr-ui/src/develop.rs#L2430), [`ui/dr-ui/src/develop.rs:2452`](../../ui/dr-ui/src/develop.rs#L2452), [`ui/dr-ui/src/develop.rs:2761`](../../ui/dr-ui/src/develop.rs#L2761), [`ui/dr-ui/src/develop.rs:2859`](../../ui/dr-ui/src/develop.rs#L2859), [`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:4409`](../../ui/dr-ui/src/develop.rs#L4409), [`ui/dr-ui/src/develop.rs:4598`](../../ui/dr-ui/src/develop.rs#L4598), [`ui/dr-ui/src/develop.rs:4658`](../../ui/dr-ui/src/develop.rs#L4658), [`ui/dr-ui/src/develop.rs:5063`](../../ui/dr-ui/src/develop.rs#L5063), [`ui/dr-ui/src/develop.rs:5093`](../../ui/dr-ui/src/develop.rs#L5093), [`ui/dr-ui/src/develop.rs:5159`](../../ui/dr-ui/src/develop.rs#L5159), [`ui/dr-ui/src/develop.rs:5173`](../../ui/dr-ui/src/develop.rs#L5173), [`ui/dr-ui/src/develop.rs:5375`](../../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:5463`](../../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:588`](../../ui/dr-ui/src/develop.rs#L588), [`ui/dr-ui/src/develop.rs:6409`](../../ui/dr-ui/src/develop.rs#L6409), [`ui/dr-ui/src/develop.rs:6482`](../../ui/dr-ui/src/develop.rs#L6482), [`ui/dr-ui/src/develop.rs:649`](../../ui/dr-ui/src/develop.rs#L649), [`ui/dr-ui/src/develop.rs:6675`](../../ui/dr-ui/src/develop.rs#L6675), [`ui/dr-ui/src/develop.rs:6706`](../../ui/dr-ui/src/develop.rs#L6706), [`ui/dr-ui/src/develop.rs:6789`](../../ui/dr-ui/src/develop.rs#L6789), [`ui/dr-ui/src/develop.rs:6851`](../../ui/dr-ui/src/develop.rs#L6851), [`ui/dr-ui/src/develop.rs:7057`](../../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7213`](../../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/develop.rs:7390`](../../ui/dr-ui/src/develop.rs#L7390), [`ui/dr-ui/src/develop.rs:7434`](../../ui/dr-ui/src/develop.rs#L7434), [`ui/dr-ui/src/develop.rs:7484`](../../ui/dr-ui/src/develop.rs#L7484), [`ui/dr-ui/src/develop.rs:7909`](../../ui/dr-ui/src/develop.rs#L7909), [`ui/dr-ui/src/develop.rs:850`](../../ui/dr-ui/src/develop.rs#L850), [`ui/dr-ui/src/develop.rs:8637`](../../ui/dr-ui/src/develop.rs#L8637), [`ui/dr-ui/src/develop.rs:943`](../../ui/dr-ui/src/develop.rs#L943), [`ui/dr-ui/src/develop.rs:972`](../../ui/dr-ui/src/develop.rs#L972), [`ui/dr-ui/src/labels.rs:35`](../../ui/dr-ui/src/labels.rs#L35), [`ui/dr-ui/src/lib.rs:2021`](../../ui/dr-ui/src/lib.rs#L2021), [`ui/dr-ui/src/lib.rs:2901`](../../ui/dr-ui/src/lib.rs#L2901), [`ui/dr-ui/src/lib.rs:3108`](../../ui/dr-ui/src/lib.rs#L3108), [`ui/dr-ui/src/lib.rs:3239`](../../ui/dr-ui/src/lib.rs#L3239), [`ui/dr-ui/src/lib.rs:3444`](../../ui/dr-ui/src/lib.rs#L3444), [`ui/dr-ui/src/lib.rs:3508`](../../ui/dr-ui/src/lib.rs#L3508), [`ui/dr-ui/src/lib.rs:3562`](../../ui/dr-ui/src/lib.rs#L3562), [`ui/dr-ui/src/lib.rs:419`](../../ui/dr-ui/src/lib.rs#L419), [`ui/dr-ui/src/lib.rs:448`](../../ui/dr-ui/src/lib.rs#L448), [`ui/dr-ui/src/lib.rs:554`](../../ui/dr-ui/src/lib.rs#L554), [`ui/dr-ui/src/lib.rs:578`](../../ui/dr-ui/src/lib.rs#L578), [`ui/dr-ui/src/library.rs:616`](../../ui/dr-ui/src/library.rs#L616), [`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:414`](../../ui/dr-ui/src/presets.rs#L414), [`ui/dr-ui/src/segmentation.rs:117`](../../ui/dr-ui/src/segmentation.rs#L117), [`ui/dr-ui/src/segmentation.rs:353`](../../ui/dr-ui/src/segmentation.rs#L353), [`ui/dr-ui/src/segmentation.rs:369`](../../ui/dr-ui/src/segmentation.rs#L369), [`ui/dr-ui/src/segmentation.rs:499`](../../ui/dr-ui/src/segmentation.rs#L499), [`ui/dr-ui/src/segmentation.rs:527`](../../ui/dr-ui/src/segmentation.rs#L527), [`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:149`](../../ui/dr-ui/ui/app.slint#L149), [`ui/dr-ui/ui/app.slint:2325`](../../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/app.slint:2385`](../../ui/dr-ui/ui/app.slint#L2385), [`ui/dr-ui/ui/develop.slint:223`](../../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`ui/dr-ui/ui/masks.slint:753`](../../ui/dr-ui/ui/masks.slint#L753), [`ui/dr-ui/ui/masks.slint:812`](../../ui/dr-ui/ui/masks.slint#L812) | +| 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:1699`](../../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/neutral.rs:1`](../../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:378`](../../core/dr-pipeline/src/neutral.rs#L378), [`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:1330`](../../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/develop.rs:1609`](../../ui/dr-ui/src/develop.rs#L1609), [`ui/dr-ui/src/develop.rs:7909`](../../ui/dr-ui/src/develop.rs#L7909), [`ui/dr-ui/src/develop.rs:8107`](../../ui/dr-ui/src/develop.rs#L8107), [`ui/dr-ui/src/lib.rs:879`](../../ui/dr-ui/src/lib.rs#L879), [`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:2569`](../../ui/dr-ui/ui/app.slint#L2569) | +| 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:2780`](../../ui/dr-ui/ui/app.slint#L2780) | +| 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:1699`](../../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/preset.rs:751`](../../core/dr-pipeline/src/preset.rs#L751), [`ui/dr-ui/src/develop.rs:8158`](../../ui/dr-ui/src/develop.rs#L8158) | +| FR-DEV-3d | [`core/dr-gpu/src/adjust.rs:1014`](../../core/dr-gpu/src/adjust.rs#L1014), [`core/dr-gpu/src/adjust.rs:1107`](../../core/dr-gpu/src/adjust.rs#L1107), [`core/dr-gpu/src/adjust.rs:114`](../../core/dr-gpu/src/adjust.rs#L114), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/adjust.rs:84`](../../core/dr-gpu/src/adjust.rs#L84), [`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:991`](../../core/dr-pipeline/src/graph.rs#L991), [`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:771`](../../core/dr-decode/src/lib.rs#L771), [`core/dr-decode/src/lib.rs:811`](../../core/dr-decode/src/lib.rs#L811), [`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:473`](../../core/dr-decode/src/profile.rs#L473), [`core/dr-decode/src/profile.rs:507`](../../core/dr-decode/src/profile.rs#L507), [`core/dr-decode/src/profile.rs:678`](../../core/dr-decode/src/profile.rs#L678), [`core/dr-gpu/src/adjust.rs:37`](../../core/dr-gpu/src/adjust.rs#L37), [`core/dr-gpu/src/adjust.rs:995`](../../core/dr-gpu/src/adjust.rs#L995), [`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:1985`](../../core/dr-pipeline/src/operation.rs#L1985), [`core/dr-pipeline/src/operation.rs:2066`](../../core/dr-pipeline/src/operation.rs#L2066), [`core/dr-pipeline/src/operation.rs:2091`](../../core/dr-pipeline/src/operation.rs#L2091), [`core/dr-pipeline/src/operation.rs:2106`](../../core/dr-pipeline/src/operation.rs#L2106), [`core/dr-pipeline/src/operation.rs:2130`](../../core/dr-pipeline/src/operation.rs#L2130), [`core/dr-pipeline/src/operation.rs:310`](../../core/dr-pipeline/src/operation.rs#L310), [`core/dr-pipeline/src/operation.rs:471`](../../core/dr-pipeline/src/operation.rs#L471), [`core/dr-pipeline/src/operation.rs:481`](../../core/dr-pipeline/src/operation.rs#L481), [`core/dr-pipeline/src/operation.rs:769`](../../core/dr-pipeline/src/operation.rs#L769) | +| 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:149`](../../core/dr-gpu/src/adjust.rs#L149), [`core/dr-gpu/src/adjust.rs:206`](../../core/dr-gpu/src/adjust.rs#L206), [`core/dr-gpu/src/adjust.rs:381`](../../core/dr-gpu/src/adjust.rs#L381), [`core/dr-gpu/src/adjust.rs:510`](../../core/dr-gpu/src/adjust.rs#L510), [`core/dr-gpu/src/adjust.rs:77`](../../core/dr-gpu/src/adjust.rs#L77), [`core/dr-gpu/tests/film_sim.rs:195`](../../core/dr-gpu/tests/film_sim.rs#L195), [`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:1313`](../../core/dr-pipeline/src/operation.rs#L1313), [`core/dr-pipeline/src/operation.rs:1341`](../../core/dr-pipeline/src/operation.rs#L1341), [`core/dr-pipeline/src/operation.rs:1387`](../../core/dr-pipeline/src/operation.rs#L1387), [`core/dr-pipeline/src/operation.rs:1985`](../../core/dr-pipeline/src/operation.rs#L1985), [`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:1055`](../../core/dr-pipeline/src/sidecar.rs#L1055), [`core/dr-pipeline/src/sidecar.rs:130`](../../core/dr-pipeline/src/sidecar.rs#L130), [`core/dr-pipeline/src/sidecar.rs:203`](../../core/dr-pipeline/src/sidecar.rs#L203), [`core/dr-pipeline/src/sidecar.rs:2681`](../../core/dr-pipeline/src/sidecar.rs#L2681), [`core/dr-pipeline/src/sidecar.rs:2757`](../../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:576`](../../core/dr-pipeline/src/sidecar.rs#L576), [`core/dr-pipeline/src/sidecar.rs:876`](../../core/dr-pipeline/src/sidecar.rs#L876), [`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:1170`](../../ui/dr-ui/src/develop.rs#L1170), [`ui/dr-ui/src/develop.rs:4810`](../../ui/dr-ui/src/develop.rs#L4810), [`ui/dr-ui/src/develop.rs:4827`](../../ui/dr-ui/src/develop.rs#L4827), [`ui/dr-ui/src/develop.rs:4839`](../../ui/dr-ui/src/develop.rs#L4839), [`ui/dr-ui/src/develop.rs:4877`](../../ui/dr-ui/src/develop.rs#L4877), [`ui/dr-ui/src/develop.rs:4886`](../../ui/dr-ui/src/develop.rs#L4886), [`ui/dr-ui/src/develop.rs:4989`](../../ui/dr-ui/src/develop.rs#L4989), [`ui/dr-ui/src/develop.rs:5500`](../../ui/dr-ui/src/develop.rs#L5500), [`ui/dr-ui/src/develop.rs:5671`](../../ui/dr-ui/src/develop.rs#L5671), [`ui/dr-ui/src/develop.rs:8649`](../../ui/dr-ui/src/develop.rs#L8649), [`ui/dr-ui/src/lib.rs:2873`](../../ui/dr-ui/src/lib.rs#L2873), [`ui/dr-ui/src/lib.rs:805`](../../ui/dr-ui/src/lib.rs#L805), [`ui/dr-ui/src/lib.rs:870`](../../ui/dr-ui/src/lib.rs#L870), [`ui/dr-ui/src/library.rs:602`](../../ui/dr-ui/src/library.rs#L602), [`ui/dr-ui/src/library.rs:870`](../../ui/dr-ui/src/library.rs#L870), [`ui/dr-ui/src/presets.rs:422`](../../ui/dr-ui/src/presets.rs#L422), [`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:444`](../../core/dr-decode/src/lib.rs#L444), [`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:2778`](../../ui/dr-ui/src/develop.rs#L2778), [`ui/dr-ui/src/segmentation.rs:499`](../../ui/dr-ui/src/segmentation.rs#L499) | +| FR-DEV-3i | [`core/dr-pipeline/src/mask.rs:558`](../../core/dr-pipeline/src/mask.rs#L558), [`core/dr-segment/src/lib.rs:1`](../../core/dr-segment/src/lib.rs#L1), [`ui/dr-ui/src/segmentation.rs:1`](../../ui/dr-ui/src/segmentation.rs#L1) | +| FR-DEV-4 | [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:368`](../../core/dr-gpu/src/lib.rs#L368), [`ui/dr-ui/ui/crop.slint:1`](../../ui/dr-ui/ui/crop.slint#L1) | +| FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1440`](../../core/dr-pipeline/src/graph.rs#L1440), [`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/sidecar.rs:1045`](../../core/dr-pipeline/src/sidecar.rs#L1045), [`core/dr-pipeline/src/sidecar.rs:144`](../../core/dr-pipeline/src/sidecar.rs#L144), [`core/dr-pipeline/src/sidecar.rs:2472`](../../core/dr-pipeline/src/sidecar.rs#L2472), [`core/dr-pipeline/src/sidecar.rs:2508`](../../core/dr-pipeline/src/sidecar.rs#L2508), [`core/dr-pipeline/src/sidecar.rs:2520`](../../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:303`](../../core/dr-pipeline/src/sidecar.rs#L303), [`core/dr-pipeline/src/sidecar.rs:694`](../../core/dr-pipeline/src/sidecar.rs#L694), [`core/dr-pipeline/src/sidecar.rs:710`](../../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:857`](../../core/dr-pipeline/src/sidecar.rs#L857), [`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:4409`](../../ui/dr-ui/src/develop.rs#L4409), [`ui/dr-ui/src/develop.rs:4839`](../../ui/dr-ui/src/develop.rs#L4839), [`ui/dr-ui/src/develop.rs:5517`](../../ui/dr-ui/src/develop.rs#L5517), [`ui/dr-ui/src/develop.rs:5535`](../../ui/dr-ui/src/develop.rs#L5535), [`ui/dr-ui/src/develop.rs:5574`](../../ui/dr-ui/src/develop.rs#L5574), [`ui/dr-ui/src/develop.rs:5588`](../../ui/dr-ui/src/develop.rs#L5588), [`ui/dr-ui/src/develop.rs:5599`](../../ui/dr-ui/src/develop.rs#L5599), [`ui/dr-ui/src/develop.rs:5658`](../../ui/dr-ui/src/develop.rs#L5658), [`ui/dr-ui/src/develop.rs:5671`](../../ui/dr-ui/src/develop.rs#L5671), [`ui/dr-ui/src/develop.rs:5701`](../../ui/dr-ui/src/develop.rs#L5701), [`ui/dr-ui/src/develop.rs:5714`](../../ui/dr-ui/src/develop.rs#L5714), [`ui/dr-ui/src/develop.rs:5726`](../../ui/dr-ui/src/develop.rs#L5726), [`ui/dr-ui/src/develop.rs:5742`](../../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:5778`](../../ui/dr-ui/src/develop.rs#L5778), [`ui/dr-ui/src/develop.rs:5797`](../../ui/dr-ui/src/develop.rs#L5797), [`ui/dr-ui/src/develop.rs:5813`](../../ui/dr-ui/src/develop.rs#L5813), [`ui/dr-ui/src/develop.rs:6655`](../../ui/dr-ui/src/develop.rs#L6655), [`ui/dr-ui/src/develop.rs:6675`](../../ui/dr-ui/src/develop.rs#L6675), [`ui/dr-ui/src/develop.rs:6897`](../../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:6954`](../../ui/dr-ui/src/develop.rs#L6954), [`ui/dr-ui/src/develop.rs:7014`](../../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:772`](../../ui/dr-ui/src/develop.rs#L772), [`ui/dr-ui/src/develop.rs:781`](../../ui/dr-ui/src/develop.rs#L781), [`ui/dr-ui/src/labels.rs:12`](../../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:278`](../../ui/dr-ui/src/labels.rs#L278), [`ui/dr-ui/src/labels.rs:31`](../../ui/dr-ui/src/labels.rs#L31), [`ui/dr-ui/src/lib.rs:1921`](../../ui/dr-ui/src/lib.rs#L1921), [`ui/dr-ui/src/lib.rs:1926`](../../ui/dr-ui/src/lib.rs#L1926), [`ui/dr-ui/src/lib.rs:1989`](../../ui/dr-ui/src/lib.rs#L1989), [`ui/dr-ui/src/lib.rs:1998`](../../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2010`](../../ui/dr-ui/src/lib.rs#L2010), [`ui/dr-ui/src/lib.rs:3139`](../../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3159`](../../ui/dr-ui/src/lib.rs#L3159), [`ui/dr-ui/src/library.rs:611`](../../ui/dr-ui/src/library.rs#L611), [`ui/dr-ui/src/library.rs:896`](../../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/presets.rs:1678`](../../ui/dr-ui/src/presets.rs#L1678), [`ui/dr-ui/src/presets.rs:373`](../../ui/dr-ui/src/presets.rs#L373), [`ui/dr-ui/src/presets.rs:437`](../../ui/dr-ui/src/presets.rs#L437), [`ui/dr-ui/src/presets.rs:557`](../../ui/dr-ui/src/presets.rs#L557), [`ui/dr-ui/ui/history.slint:191`](../../ui/dr-ui/ui/history.slint#L191), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:218`](../../ui/dr-ui/ui/history.slint#L218), [`ui/dr-ui/ui/history.slint:303`](../../ui/dr-ui/ui/history.slint#L303), [`ui/dr-ui/ui/history.slint:43`](../../ui/dr-ui/ui/history.slint#L43), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53) | +| 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:443`](../../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop.rs:5457`](../../ui/dr-ui/src/develop.rs#L5457), [`ui/dr-ui/src/develop.rs:5478`](../../ui/dr-ui/src/develop.rs#L5478), [`ui/dr-ui/src/lib.rs:1888`](../../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2674`](../../ui/dr-ui/src/lib.rs#L2674), [`ui/dr-ui/src/lib.rs:2703`](../../ui/dr-ui/src/lib.rs#L2703), [`ui/dr-ui/src/library.rs:2491`](../../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:592`](../../ui/dr-ui/src/library.rs#L592), [`ui/dr-ui/src/library_ui.rs:3255`](../../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`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:707`](../../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../../ui/dr-ui/src/presets.rs#L741), [`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:1706`](../../ui/dr-ui/ui/app.slint#L1706), [`ui/dr-ui/ui/app.slint:2538`](../../ui/dr-ui/ui/app.slint#L2538), [`ui/dr-ui/ui/app.slint:3173`](../../ui/dr-ui/ui/app.slint#L3173), [`ui/dr-ui/ui/app.slint:765`](../../ui/dr-ui/ui/app.slint#L765), [`ui/dr-ui/ui/app.slint:776`](../../ui/dr-ui/ui/app.slint#L776), [`ui/dr-ui/ui/library.slint:1579`](../../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4262`](../../ui/dr-ui/ui/library.slint#L4262), [`ui/dr-ui/ui/library.slint:4286`](../../ui/dr-ui/ui/library.slint#L4286), [`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:119`](../../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../../ui/dr-ui/ui/settings.slint#L711) | +| 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:4343`](../../ui/dr-ui/src/develop.rs#L4343), [`ui/dr-ui/src/develop.rs:4384`](../../ui/dr-ui/src/develop.rs#L4384), [`ui/dr-ui/src/develop.rs:5613`](../../ui/dr-ui/src/develop.rs#L5613), [`ui/dr-ui/src/develop.rs:5630`](../../ui/dr-ui/src/develop.rs#L5630), [`ui/dr-ui/src/develop.rs:5742`](../../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:6897`](../../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:7014`](../../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:797`](../../ui/dr-ui/src/develop.rs#L797), [`ui/dr-ui/src/lib.rs:1998`](../../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2070`](../../ui/dr-ui/src/lib.rs#L2070), [`ui/dr-ui/src/lib.rs:2084`](../../ui/dr-ui/src/lib.rs#L2084), [`ui/dr-ui/src/lib.rs:3080`](../../ui/dr-ui/src/lib.rs#L3080), [`ui/dr-ui/src/lib.rs:3139`](../../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3211`](../../ui/dr-ui/src/lib.rs#L3211), [`ui/dr-ui/src/lib.rs:411`](../../ui/dr-ui/src/lib.rs#L411), [`ui/dr-ui/ui/app.slint:131`](../../ui/dr-ui/ui/app.slint#L131), [`ui/dr-ui/ui/app.slint:2445`](../../ui/dr-ui/ui/app.slint#L2445), [`ui/dr-ui/ui/app.slint:2460`](../../ui/dr-ui/ui/app.slint#L2460), [`ui/dr-ui/ui/app.slint:2780`](../../ui/dr-ui/ui/app.slint#L2780), [`ui/dr-ui/ui/history.slint:102`](../../ui/dr-ui/ui/history.slint#L102), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:226`](../../ui/dr-ui/ui/history.slint#L226), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53), [`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:1092`](../../core/dr-pipeline/src/graph.rs#L1092), [`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:717`](../../core/dr-pipeline/src/operation.rs#L717), [`core/dr-pipeline/src/sidecar.rs:1071`](../../core/dr-pipeline/src/sidecar.rs#L1071), [`core/dr-pipeline/src/sidecar.rs:1125`](../../core/dr-pipeline/src/sidecar.rs#L1125), [`core/dr-pipeline/src/sidecar.rs:1155`](../../core/dr-pipeline/src/sidecar.rs#L1155), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:888`](../../core/dr-pipeline/src/sidecar.rs#L888), [`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:3209`](../../ui/dr-ui/src/develop.rs#L3209), [`ui/dr-ui/src/develop.rs:3247`](../../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/develop.rs:3312`](../../ui/dr-ui/src/develop.rs#L3312), [`ui/dr-ui/src/develop.rs:3395`](../../ui/dr-ui/src/develop.rs#L3395), [`ui/dr-ui/src/develop.rs:3409`](../../ui/dr-ui/src/develop.rs#L3409), [`ui/dr-ui/src/develop.rs:904`](../../ui/dr-ui/src/develop.rs#L904), [`ui/dr-ui/src/labels.rs:80`](../../ui/dr-ui/src/labels.rs#L80), [`ui/dr-ui/src/lib.rs:2028`](../../ui/dr-ui/src/lib.rs#L2028), [`ui/dr-ui/src/lib.rs:3364`](../../ui/dr-ui/src/lib.rs#L3364), [`ui/dr-ui/src/lib.rs:453`](../../ui/dr-ui/src/lib.rs#L453), [`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:2301`](../../ui/dr-ui/ui/app.slint#L2301), [`ui/dr-ui/ui/app.slint:2503`](../../ui/dr-ui/ui/app.slint#L2503), [`ui/dr-ui/ui/app.slint:3079`](../../ui/dr-ui/ui/app.slint#L3079), [`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:2366`](../../core/dr-gpu/src/adjust.rs#L2366), [`core/dr-gpu/src/adjust.rs:2443`](../../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:2528`](../../core/dr-gpu/src/adjust.rs#L2528), [`core/dr-gpu/src/adjust.rs:54`](../../core/dr-gpu/src/adjust.rs#L54), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:174`](../../core/dr-gpu/src/lib.rs#L174), [`core/dr-gpu/src/lib.rs:194`](../../core/dr-gpu/src/lib.rs#L194), [`core/dr-gpu/src/lib.rs:72`](../../core/dr-gpu/src/lib.rs#L72), [`core/dr-gpu/src/lib.rs:95`](../../core/dr-gpu/src/lib.rs#L95), [`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:922`](../../core/dr-pipeline/src/graph.rs#L922), [`core/dr-pipeline/src/graph.rs:952`](../../core/dr-pipeline/src/graph.rs#L952), [`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:4030`](../../ui/dr-ui/src/develop.rs#L4030), [`ui/dr-ui/src/develop.rs:5325`](../../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:6068`](../../ui/dr-ui/src/develop.rs#L6068), [`ui/dr-ui/src/develop.rs:7608`](../../ui/dr-ui/src/develop.rs#L7608), [`ui/dr-ui/src/develop.rs:7642`](../../ui/dr-ui/src/develop.rs#L7642), [`ui/dr-ui/src/lib.rs:100`](../../ui/dr-ui/src/lib.rs#L100), [`ui/dr-ui/src/lib.rs:1026`](../../ui/dr-ui/src/lib.rs#L1026), [`ui/dr-ui/src/lib.rs:1085`](../../ui/dr-ui/src/lib.rs#L1085) | +| 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:527`](../../core/dr-pipeline/src/operation.rs#L527), [`core/dr-types/src/colour.rs:1`](../../core/dr-types/src/colour.rs#L1), [`ui/dr-ui/src/develop.rs:4060`](../../ui/dr-ui/src/develop.rs#L4060), [`ui/dr-ui/src/develop.rs:9225`](../../ui/dr-ui/src/develop.rs#L9225), [`ui/dr-ui/src/lib.rs:1974`](../../ui/dr-ui/src/lib.rs#L1974), [`ui/dr-ui/src/lib.rs:3755`](../../ui/dr-ui/src/lib.rs#L3755) | +| 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:4114`](../../ui/dr-ui/src/develop.rs#L4114), [`ui/dr-ui/src/develop.rs:804`](../../ui/dr-ui/src/develop.rs#L804), [`ui/dr-ui/src/develop.rs:8895`](../../ui/dr-ui/src/develop.rs#L8895), [`ui/dr-ui/src/develop.rs:8927`](../../ui/dr-ui/src/develop.rs#L8927), [`ui/dr-ui/src/histogram.rs:1`](../../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:2108`](../../ui/dr-ui/src/lib.rs#L2108), [`ui/dr-ui/src/lib.rs:430`](../../ui/dr-ui/src/lib.rs#L430), [`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:4006`](../../ui/dr-ui/src/develop.rs#L4006), [`ui/dr-ui/src/develop.rs:4060`](../../ui/dr-ui/src/develop.rs#L4060), [`ui/dr-ui/src/develop.rs:9225`](../../ui/dr-ui/src/develop.rs#L9225), [`ui/dr-ui/src/develop.rs:9271`](../../ui/dr-ui/src/develop.rs#L9271), [`ui/dr-ui/src/develop.rs:9290`](../../ui/dr-ui/src/develop.rs#L9290), [`ui/dr-ui/src/develop.rs:957`](../../ui/dr-ui/src/develop.rs#L957), [`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:1910`](../../ui/dr-ui/src/lib.rs#L1910), [`ui/dr-ui/src/lib.rs:1974`](../../ui/dr-ui/src/lib.rs#L1974), [`ui/dr-ui/src/lib.rs:3662`](../../ui/dr-ui/src/lib.rs#L3662), [`ui/dr-ui/src/lib.rs:3755`](../../ui/dr-ui/src/lib.rs#L3755), [`ui/dr-ui/ui/app.slint:1981`](../../ui/dr-ui/ui/app.slint#L1981), [`ui/dr-ui/ui/app.slint:64`](../../ui/dr-ui/ui/app.slint#L64), [`ui/dr-ui/ui/settings.slint:165`](../../ui/dr-ui/ui/settings.slint#L165), [`ui/dr-ui/ui/settings.slint:968`](../../ui/dr-ui/ui/settings.slint#L968) | +| 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:157`](../../core/dr-export/src/lib.rs#L157), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/lib.rs:57`](../../core/dr-export/src/lib.rs#L57), [`core/dr-gpu/src/adjust.rs:2676`](../../core/dr-gpu/src/adjust.rs#L2676), [`core/dr-pipeline/src/graph.rs:835`](../../core/dr-pipeline/src/graph.rs#L835), [`core/dr-pipeline/src/graph.rs:966`](../../core/dr-pipeline/src/graph.rs#L966), [`core/dr-pipeline/src/operation.rs:527`](../../core/dr-pipeline/src/operation.rs#L527), [`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:963`](../../core/dr-types/src/settings.rs#L963), [`ui/dr-ui/src/develop.rs:9290`](../../ui/dr-ui/src/develop.rs#L9290), [`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:186`](../../core/dr-export/src/lib.rs#L186), [`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:1008`](../../core/dr-types/src/settings.rs#L1008), [`core/dr-types/src/settings.rs:1016`](../../core/dr-types/src/settings.rs#L1016), [`core/dr-types/src/settings.rs:1032`](../../core/dr-types/src/settings.rs#L1032), [`core/dr-types/src/settings.rs:1101`](../../core/dr-types/src/settings.rs#L1101), [`core/dr-types/src/settings.rs:1129`](../../core/dr-types/src/settings.rs#L1129), [`core/dr-types/src/settings.rs:1140`](../../core/dr-types/src/settings.rs#L1140), [`core/dr-types/src/settings.rs:1146`](../../core/dr-types/src/settings.rs#L1146), [`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), [`ui/dr-ui/src/settings_ui.rs:274`](../../ui/dr-ui/src/settings_ui.rs#L274), [`ui/dr-ui/src/settings_ui.rs:287`](../../ui/dr-ui/src/settings_ui.rs#L287), [`ui/dr-ui/src/settings_ui.rs:302`](../../ui/dr-ui/src/settings_ui.rs#L302), [`ui/dr-ui/src/settings_ui.rs:701`](../../ui/dr-ui/src/settings_ui.rs#L701), [`ui/dr-ui/ui/settings.slint:851`](../../ui/dr-ui/ui/settings.slint#L851), [`ui/dr-ui/ui/settings.slint:861`](../../ui/dr-ui/ui/settings.slint#L861) | +| 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:607`](../../ui/dr-ui/src/lib.rs#L607), [`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:815`](../../ui/dr-ui/src/settings_ui.rs#L815) | +| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:2813`](../../ui/dr-ui/src/lib.rs#L2813), [`ui/dr-ui/src/lib.rs:607`](../../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/lib.rs:653`](../../ui/dr-ui/src/lib.rs#L653), [`ui/dr-ui/src/lib.rs:680`](../../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8149`](../../ui/dr-ui/src/library_ui.rs#L8149), [`ui/dr-ui/src/library_ui.rs:821`](../../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8226`](../../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8238`](../../ui/dr-ui/src/library_ui.rs#L8238), [`ui/dr-ui/src/library_ui.rs:878`](../../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1139`](../../ui/dr-ui/ui/app.slint#L1139), [`ui/dr-ui/ui/app.slint:1716`](../../ui/dr-ui/ui/app.slint#L1716), [`ui/dr-ui/ui/library.slint:1588`](../../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) | +| FR-EXP-8 | [`core/dr-decode/src/lib.rs:366`](../../core/dr-decode/src/lib.rs#L366), [`core/dr-decode/src/lib.rs:390`](../../core/dr-decode/src/lib.rs#L390), [`core/dr-decode/src/lib.rs:404`](../../core/dr-decode/src/lib.rs#L404), [`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:1233`](../../core/dr-decode/src/locate.rs#L1233), [`core/dr-decode/src/locate.rs:1292`](../../core/dr-decode/src/locate.rs#L1292), [`core/dr-decode/src/locate.rs:359`](../../core/dr-decode/src/locate.rs#L359), [`core/dr-decode/src/locate.rs:556`](../../core/dr-decode/src/locate.rs#L556), [`core/dr-decode/src/locate.rs:640`](../../core/dr-decode/src/locate.rs#L640), [`core/dr-decode/src/locate.rs:653`](../../core/dr-decode/src/locate.rs#L653), [`core/dr-decode/src/locate.rs:736`](../../core/dr-decode/src/locate.rs#L736), [`core/dr-export/examples/export.rs:99`](../../core/dr-export/examples/export.rs#L99), [`core/dr-export/src/encode.rs:117`](../../core/dr-export/src/encode.rs#L117), [`core/dr-export/src/encode.rs:161`](../../core/dr-export/src/encode.rs#L161), [`core/dr-export/src/encode.rs:1`](../../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/encode.rs:206`](../../core/dr-export/src/encode.rs#L206), [`core/dr-export/src/encode.rs:235`](../../core/dr-export/src/encode.rs#L235), [`core/dr-export/src/encode.rs:311`](../../core/dr-export/src/encode.rs#L311), [`core/dr-export/src/encode.rs:325`](../../core/dr-export/src/encode.rs#L325), [`core/dr-export/src/encode.rs:408`](../../core/dr-export/src/encode.rs#L408), [`core/dr-export/src/encode.rs:456`](../../core/dr-export/src/encode.rs#L456), [`core/dr-export/src/encode.rs:70`](../../core/dr-export/src/encode.rs#L70), [`core/dr-export/src/encode.rs:795`](../../core/dr-export/src/encode.rs#L795), [`core/dr-export/src/encode.rs:809`](../../core/dr-export/src/encode.rs#L809), [`core/dr-export/src/encode.rs:850`](../../core/dr-export/src/encode.rs#L850), [`core/dr-export/src/encode.rs:898`](../../core/dr-export/src/encode.rs#L898), [`core/dr-export/src/exif.rs:1`](../../core/dr-export/src/exif.rs#L1), [`core/dr-export/src/lib.rs:140`](../../core/dr-export/src/lib.rs#L140), [`core/dr-export/src/metadata.rs:1`](../../core/dr-export/src/metadata.rs#L1), [`core/dr-export/src/metadata.rs:41`](../../core/dr-export/src/metadata.rs#L41), [`core/dr-export/src/metadata.rs:74`](../../core/dr-export/src/metadata.rs#L74), [`core/dr-types/src/lib.rs:655`](../../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:671`](../../core/dr-types/src/settings.rs#L671), [`ui/dr-ui/src/develop.rs:4581`](../../ui/dr-ui/src/develop.rs#L4581), [`ui/dr-ui/src/develop.rs:4693`](../../ui/dr-ui/src/develop.rs#L4693), [`ui/dr-ui/src/develop.rs:729`](../../ui/dr-ui/src/develop.rs#L729), [`ui/dr-ui/src/export.rs:474`](../../ui/dr-ui/src/export.rs#L474), [`ui/dr-ui/src/export.rs:641`](../../ui/dr-ui/src/export.rs#L641), [`ui/dr-ui/src/export.rs:687`](../../ui/dr-ui/src/export.rs#L687), [`ui/dr-ui/src/export.rs:715`](../../ui/dr-ui/src/export.rs#L715), [`ui/dr-ui/src/export.rs:839`](../../ui/dr-ui/src/export.rs#L839), [`ui/dr-ui/src/export.rs:857`](../../ui/dr-ui/src/export.rs#L857), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:291`](../../ui/dr-ui/src/lib.rs#L291), [`ui/dr-ui/src/lib.rs:639`](../../ui/dr-ui/src/lib.rs#L639), [`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:546`](../../core/dr-decode/src/lib.rs#L546), [`core/dr-export/src/lib.rs:132`](../../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1134`](../../core/dr-gpu/src/adjust.rs#L1134), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/develop.rs:4714`](../../ui/dr-ui/src/develop.rs#L4714), [`ui/dr-ui/src/develop.rs:4752`](../../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:7111`](../../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/lib.rs:607`](../../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/library.rs:3889`](../../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | +| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1576`](../../ui/dr-ui/src/lib.rs#L1576), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1721`](../../ui/dr-ui/ui/app.slint#L1721), [`ui/dr-ui/ui/app.slint:829`](../../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/library.slint:1596`](../../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4277`](../../ui/dr-ui/ui/library.slint#L4277), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | +| FR-MRG-10 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1) | +| FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1) | +| FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1) | +| FR-MRG-3 | [`core/dr-decode/examples/linear_dng.rs:1`](../../core/dr-decode/examples/linear_dng.rs#L1), [`core/dr-decode/src/lib.rs:137`](../../core/dr-decode/src/lib.rs#L137), [`core/dr-decode/src/lib.rs:144`](../../core/dr-decode/src/lib.rs#L144), [`core/dr-decode/src/lib.rs:598`](../../core/dr-decode/src/lib.rs#L598), [`core/dr-decode/src/profile.rs:395`](../../core/dr-decode/src/profile.rs#L395), [`core/dr-export/src/dng.rs:1`](../../core/dr-export/src/dng.rs#L1), [`core/dr-gpu/src/demosaic.rs:254`](../../core/dr-gpu/src/demosaic.rs#L254), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1) | +| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4457`](../../ui/dr-ui/src/library.rs#L4457), [`ui/dr-ui/src/library.rs:4461`](../../ui/dr-ui/src/library.rs#L4461), [`ui/dr-ui/src/merge.rs:143`](../../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../../ui/dr-ui/ui/merge.slint#L46) | +| FR-MRG-5 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | +| FR-MRG-6 | [`core/dr-pipeline/src/sidecar.rs:1033`](../../core/dr-pipeline/src/sidecar.rs#L1033), [`core/dr-pipeline/src/sidecar.rs:113`](../../core/dr-pipeline/src/sidecar.rs#L113), [`core/dr-pipeline/src/sidecar.rs:123`](../../core/dr-pipeline/src/sidecar.rs#L123), [`core/dr-pipeline/src/sidecar.rs:2241`](../../core/dr-pipeline/src/sidecar.rs#L2241), [`core/dr-pipeline/src/sidecar.rs:841`](../../core/dr-pipeline/src/sidecar.rs#L841), [`ui/dr-ui/src/merge.rs:842`](../../ui/dr-ui/src/merge.rs#L842) | +| FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:829`](../../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | +| FR-MRG-8 | [`core/dr-pano/src/xfeat.rs:1`](../../core/dr-pano/src/xfeat.rs#L1), [`core/dr-segment/examples/onnx_probe.rs:1`](../../core/dr-segment/examples/onnx_probe.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:375`](../../core/dr-sync/src/account.rs#L375), [`ui/dr-ui/src/launch.rs:316`](../../ui/dr-ui/src/launch.rs#L316), [`ui/dr-ui/src/launch.rs:61`](../../ui/dr-ui/src/launch.rs#L61), [`ui/dr-ui/src/launch_ui.rs:418`](../../ui/dr-ui/src/launch_ui.rs#L418) | +| FR-NC-10 | [`core/dr-sync/src/account.rs:240`](../../core/dr-sync/src/account.rs#L240), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:680`](../../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library.rs:1234`](../../ui/dr-ui/src/library.rs#L1234), [`ui/dr-ui/src/library.rs:2527`](../../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:2057`](../../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:662`](../../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/sidecar_cache.rs:1`](../../ui/dr-ui/src/sidecar_cache.rs#L1) | +| FR-NC-12 | [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:1049`](../../core/dr-sync-nextcloud/src/lib.rs#L1049), [`core/dr-sync-nextcloud/src/lib.rs:40`](../../core/dr-sync-nextcloud/src/lib.rs#L40), [`core/dr-sync-nextcloud/src/provider.rs:1`](../../core/dr-sync-nextcloud/src/provider.rs#L1), [`core/dr-sync/src/account.rs:1`](../../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:87`](../../core/dr-sync/src/account.rs#L87), [`core/dr-sync/src/lib.rs: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:317`](../../ui/dr-ui/src/launch_ui.rs#L317), [`ui/dr-ui/src/remote.rs:1`](../../ui/dr-ui/src/remote.rs#L1) | +| FR-NC-2 | [`core/dr-sync/src/account.rs:1`](../../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:318`](../../core/dr-sync/src/account.rs#L318), [`core/dr-sync/src/account.rs:375`](../../core/dr-sync/src/account.rs#L375), [`core/dr-sync/src/account.rs:59`](../../core/dr-sync/src/account.rs#L59), [`platform/dr-plat/src/secrets.rs:82`](../../platform/dr-plat/src/secrets.rs#L82) | +| FR-NC-3 | [`core/dr-decode/src/locate.rs:1`](../../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../../core/dr-decode/src/preview.rs#L148), [`core/dr-sync/src/capability.rs:85`](../../core/dr-sync/src/capability.rs#L85), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/library.rs:1`](../../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:1`](../../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/ui/app.slint:387`](../../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`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:129`](../../core/dr-sync/src/scan.rs#L129), [`ui/dr-ui/src/launch.rs:61`](../../ui/dr-ui/src/launch.rs#L61) | +| FR-NC-5 | [`core/dr-sync-nextcloud/src/propfind.rs:51`](../../core/dr-sync-nextcloud/src/propfind.rs#L51), [`ui/dr-ui/src/import.rs: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:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../../core/dr-catalog/src/schema.rs#L1637), [`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:1350`](../../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:2487`](../../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:2558`](../../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:3852`](../../ui/dr-ui/src/lib.rs#L3852), [`ui/dr-ui/src/lib.rs:3853`](../../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:3892`](../../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/library.rs:2173`](../../ui/dr-ui/src/library.rs#L2173), [`ui/dr-ui/src/library.rs:2196`](../../ui/dr-ui/src/library.rs#L2196), [`ui/dr-ui/src/library.rs:2471`](../../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2652`](../../ui/dr-ui/src/library.rs#L2652), [`ui/dr-ui/src/library.rs:2789`](../../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6881`](../../ui/dr-ui/src/library_ui.rs#L6881), [`ui/dr-ui/src/library_ui.rs:6899`](../../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/library_ui.rs:709`](../../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:1610`](../../ui/dr-ui/ui/app.slint#L1610), [`ui/dr-ui/ui/app.slint:3163`](../../ui/dr-ui/ui/app.slint#L3163), [`ui/dr-ui/ui/app.slint:541`](../../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/app.slint:549`](../../ui/dr-ui/ui/app.slint#L549), [`ui/dr-ui/ui/app.slint:555`](../../ui/dr-ui/ui/app.slint#L555), [`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), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) | +| FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`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:1042`](../../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library.rs:1084`](../../ui/dr-ui/src/library.rs#L1084), [`ui/dr-ui/src/library.rs:2293`](../../ui/dr-ui/src/library.rs#L2293), [`ui/dr-ui/src/library.rs:2383`](../../ui/dr-ui/src/library.rs#L2383), [`ui/dr-ui/src/library.rs:4060`](../../ui/dr-ui/src/library.rs#L4060), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../../ui/dr-ui/src/repairs.rs#L1140), [`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:120`](../../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435) | +| FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs: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:1559`](../../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../../ui/dr-ui/src/lib.rs#L1559) | +| 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:929`](../../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7554`](../../ui/dr-ui/src/library.rs#L7554), [`ui/dr-ui/src/library.rs:824`](../../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336) | +| 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:929`](../../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`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:1070`](../../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:7386`](../../ui/dr-ui/src/library.rs#L7386), [`ui/dr-ui/src/library.rs:73`](../../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7554`](../../ui/dr-ui/src/library.rs#L7554), [`ui/dr-ui/src/library.rs:824`](../../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287) | +| 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:211`](../../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../../core/dr-sync/src/scan.rs#L519), [`core/dr-sync/src/scan.rs:545`](../../core/dr-sync/src/scan.rs#L545), [`core/dr-sync/src/scan.rs:574`](../../core/dr-sync/src/scan.rs#L574), [`ui/dr-ui/src/library.rs:1355`](../../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:2019`](../../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library_ui.rs:1310`](../../ui/dr-ui/src/library_ui.rs#L1310), [`ui/dr-ui/src/library_ui.rs:1406`](../../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:2005`](../../ui/dr-ui/src/library_ui.rs#L2005), [`ui/dr-ui/src/library_ui.rs:328`](../../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:573`](../../ui/dr-ui/src/library_ui.rs#L573) | +| 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:1057`](../../core/dr-gpu/src/adjust.rs#L1057), [`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:4554`](../../ui/dr-ui/src/develop.rs#L4554), [`ui/dr-ui/src/identity_ui.rs:125`](../../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:1377`](../../ui/dr-ui/src/lib.rs#L1377), [`ui/dr-ui/src/lib.rs:1862`](../../ui/dr-ui/src/lib.rs#L1862), [`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:441`](../../apps/darkroom-android/src/lib.rs#L441) | +| FR-PLAT-LIN-1 | [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`platform/dr-plat/src/dirs.rs:1`](../../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/storage.rs:344`](../../platform/dr-plat/src/storage.rs#L344), [`ui/dr-ui/src/lib.rs:1166`](../../ui/dr-ui/src/lib.rs#L1166), [`ui/dr-ui/src/preset_store.rs:1`](../../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1) | +| FR-PLAT-LIN-2 | [`platform/dr-plat/src/display.rs:1`](../../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../../platform/dr-plat/src/display/x11.rs#L1) | +| FR-PLAT-WIN-1 | [`platform/dr-plat/src/dirs.rs:1`](../../platform/dr-plat/src/dirs.rs#L1) | +| FR-PLAT-WIN-2 | [`apps/darkroom-desktop/build.rs:1`](../../apps/darkroom-desktop/build.rs#L1), [`apps/darkroom-desktop/src/main.rs:6`](../../apps/darkroom-desktop/src/main.rs#L6), [`ui/dr-ui/src/launch_ui.rs:820`](../../ui/dr-ui/src/launch_ui.rs#L820) | +| FR-PLAT-WIN-3 | [`apps/darkroom-desktop/src/main.rs:19`](../../apps/darkroom-desktop/src/main.rs#L19) | +| FR-RAW-1 | [`core/dr-decode/src/lib.rs:259`](../../core/dr-decode/src/lib.rs#L259), [`core/dr-types/src/lib.rs:132`](../../core/dr-types/src/lib.rs#L132), [`core/dr-types/src/lib.rs:203`](../../core/dr-types/src/lib.rs#L203) | +| FR-RAW-3 | [`core/dr-decode/src/lib.rs:155`](../../core/dr-decode/src/lib.rs#L155), [`core/dr-decode/src/lib.rs:546`](../../core/dr-decode/src/lib.rs#L546), [`core/dr-decode/src/locate.rs:1435`](../../core/dr-decode/src/locate.rs#L1435) | +| FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268) | +| FR-RAW-5 | [`core/dr-decode/src/lib.rs:183`](../../core/dr-decode/src/lib.rs#L183), [`core/dr-gpu/src/demosaic.rs:34`](../../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:734`](../../core/dr-gpu/src/demosaic.rs#L734), [`core/dr-gpu/src/demosaic.rs:813`](../../core/dr-gpu/src/demosaic.rs#L813), [`core/dr-gpu/src/demosaic.rs:937`](../../core/dr-gpu/src/demosaic.rs#L937) | +| FR-UI-1 | [`core/dr-types/src/settings.rs:1377`](../../core/dr-types/src/settings.rs#L1377), [`core/dr-types/src/settings.rs:492`](../../core/dr-types/src/settings.rs#L492), [`core/dr-types/src/settings.rs:512`](../../core/dr-types/src/settings.rs#L512), [`ui/dr-ui/src/lib.rs:108`](../../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/lib.rs:123`](../../ui/dr-ui/src/lib.rs#L123), [`ui/dr-ui/src/lib.rs:145`](../../ui/dr-ui/src/lib.rs#L145), [`ui/dr-ui/src/lib.rs:2711`](../../ui/dr-ui/src/lib.rs#L2711), [`ui/dr-ui/src/lib.rs:4043`](../../ui/dr-ui/src/lib.rs#L4043), [`ui/dr-ui/src/lib.rs:4062`](../../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/src/lib.rs:4089`](../../ui/dr-ui/src/lib.rs#L4089), [`ui/dr-ui/src/lib.rs:4140`](../../ui/dr-ui/src/lib.rs#L4140), [`ui/dr-ui/src/lib.rs:4173`](../../ui/dr-ui/src/lib.rs#L4173), [`ui/dr-ui/src/masks_ui.rs:1471`](../../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/settings_ui.rs:179`](../../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:1010`](../../ui/dr-ui/ui/app.slint#L1010), [`ui/dr-ui/ui/app.slint:2842`](../../ui/dr-ui/ui/app.slint#L2842), [`ui/dr-ui/ui/app.slint:906`](../../ui/dr-ui/ui/app.slint#L906), [`ui/dr-ui/ui/identity.slint:246`](../../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:108`](../../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../../ui/dr-ui/ui/app.slint#L994), [`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:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`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:136`](../../ui/dr-ui/ui/settings.slint#L136) | +| 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:2859`](../../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`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:5325`](../../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../../ui/dr-ui/ui/app.slint#L712), [`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:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`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), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) | +| 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:3329`](../../ui/dr-ui/src/lib.rs#L3329), [`ui/dr-ui/src/lib.rs:4237`](../../ui/dr-ui/src/lib.rs#L4237), [`ui/dr-ui/src/lib.rs:4428`](../../ui/dr-ui/src/lib.rs#L4428), [`ui/dr-ui/src/masks_ui.rs:1518`](../../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2569`](../../ui/dr-ui/ui/app.slint#L2569), [`ui/dr-ui/ui/app.slint:2609`](../../ui/dr-ui/ui/app.slint#L2609), [`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:492`](../../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop.rs:1330`](../../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/lib.rs:4062`](../../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2325`](../../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:216`](../../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4708`](../../ui/dr-ui/src/library.rs#L4708), [`ui/dr-ui/src/library.rs:5476`](../../ui/dr-ui/src/library.rs#L5476), [`ui/dr-ui/src/library.rs:5542`](../../ui/dr-ui/src/library.rs#L5542), [`ui/dr-ui/src/library_ui.rs:1007`](../../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../../ui/dr-ui/src/library_ui.rs#L968), [`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:2742`](../../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:2780`](../../ui/dr-ui/ui/app.slint#L2780) | +| 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/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1) | +| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1822`](../../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/src/lib.rs:2847`](../../ui/dr-ui/src/lib.rs#L2847), [`ui/dr-ui/ui/app.slint:1150`](../../ui/dr-ui/ui/app.slint#L1150), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) | +| 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:521`](../../ui/dr-ui/src/export.rs#L521) | +| NFR-COMPAT-1 | [`core/dr-gpu/src/lib.rs:286`](../../core/dr-gpu/src/lib.rs#L286) | +| NFR-OPS-1 | [`core/dr-gpu/src/lib.rs:339`](../../core/dr-gpu/src/lib.rs#L339), [`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:1241`](../../ui/dr-ui/src/lib.rs#L1241), [`ui/dr-ui/ui/app.slint:1473`](../../ui/dr-ui/ui/app.slint#L1473), [`ui/dr-ui/ui/app.slint:75`](../../ui/dr-ui/ui/app.slint#L75), [`ui/dr-ui/ui/settings.slint:1015`](../../ui/dr-ui/ui/settings.slint#L1015), [`ui/dr-ui/ui/settings.slint:154`](../../ui/dr-ui/ui/settings.slint#L154) | +| 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:4238`](../../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/lib.rs:2153`](../../ui/dr-ui/src/lib.rs#L2153) | +| NFR-P3 | [`tools/bench/src/thumbnails.rs:1`](../../tools/bench/src/thumbnails.rs#L1) | +| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4815`](../../ui/dr-ui/src/library.rs#L4815), [`ui/dr-ui/src/library.rs:5978`](../../ui/dr-ui/src/library.rs#L5978), [`ui/dr-ui/src/library_ui.rs:5005`](../../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../../ui/dr-ui/src/library_ui.rs#L64) | +| NFR-P9 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/references.rs:1`](../../core/dr-face/src/references.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1`](../../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/library.rs:1`](../../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library_ui.rs:1`](../../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/trash.rs:1`](../../ui/dr-ui/src/trash.rs#L1) | +| NFR-PORT-1 | [`core/dr-catalog/src/walk.rs:1`](../../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:272`](../../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../../core/dr-types/src/lib.rs#L305), [`platform/dr-plat/src/dirs.rs:1`](../../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/display.rs:1`](../../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/storage.rs:1`](../../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:287`](../../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:344`](../../platform/dr-plat/src/storage.rs#L344), [`platform/dr-plat/src/volumes.rs:1`](../../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../../platform/dr-plat/src/volumes.rs#L62) | +| NFR-PORT-2 | [`core/dr-gpu/src/lib.rs:1`](../../core/dr-gpu/src/lib.rs#L1) | +| NFR-PORT-3 | [`platform/dr-plat/src/storage.rs:1`](../../platform/dr-plat/src/storage.rs#L1) | +| NFR-R1 | [`core/dr-catalog/src/schema.rs:361`](../../core/dr-catalog/src/schema.rs#L361), [`core/dr-catalog/src/sync.rs:1`](../../core/dr-catalog/src/sync.rs#L1), [`core/dr-gpu/src/lib.rs:194`](../../core/dr-gpu/src/lib.rs#L194), [`core/dr-sync/src/account.rs:240`](../../core/dr-sync/src/account.rs#L240), [`ui/dr-ui/src/library.rs:1234`](../../ui/dr-ui/src/library.rs#L1234) | +| NFR-R2 | [`core/dr-catalog/src/recovery.rs:1`](../../core/dr-catalog/src/recovery.rs#L1), [`core/dr-catalog/src/recovery.rs:222`](../../core/dr-catalog/src/recovery.rs#L222), [`core/dr-catalog/src/sync.rs:61`](../../core/dr-catalog/src/sync.rs#L61), [`core/dr-catalog/src/trash.rs:1`](../../core/dr-catalog/src/trash.rs#L1), [`ui/dr-ui/src/derived_sync.rs:613`](../../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:736`](../../ui/dr-ui/src/derived_sync.rs#L736), [`ui/dr-ui/src/library_ui.rs:4174`](../../ui/dr-ui/src/library_ui.rs#L4174), [`ui/dr-ui/src/library_ui.rs:4492`](../../ui/dr-ui/src/library_ui.rs#L4492) | +| NFR-R3 | [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30) | +| NFR-R4 | [`core/dr-types/src/settings.rs:92`](../../core/dr-types/src/settings.rs#L92), [`ui/dr-ui/src/library.rs:1627`](../../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library_ui.rs:3427`](../../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:392`](../../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/settings_ui.rs:540`](../../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/ui/settings.slint:1093`](../../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../../ui/dr-ui/ui/settings.slint#L199) | +| NFR-R5 | [`core/dr-catalog/src/collections.rs:1`](../../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/error.rs:1`](../../core/dr-catalog/src/error.rs#L1), [`core/dr-catalog/src/keywords.rs:1`](../../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/schema.rs:1`](../../core/dr-catalog/src/schema.rs#L1) | +| NFR-R6 | [`core/dr-catalog/src/error.rs:1`](../../core/dr-catalog/src/error.rs#L1), [`core/dr-catalog/src/lib.rs:255`](../../core/dr-catalog/src/lib.rs#L255), [`core/dr-catalog/src/recovery.rs:1`](../../core/dr-catalog/src/recovery.rs#L1) | +| NFR-R7 | [`core/dr-gpu/src/error.rs:1`](../../core/dr-gpu/src/error.rs#L1) | +| NFR-R8 | [`core/dr-gpu/src/error.rs:1`](../../core/dr-gpu/src/error.rs#L1) | +| NFR-RES-1 | [`core/dr-gpu/src/adjust.rs:1057`](../../core/dr-gpu/src/adjust.rs#L1057), [`core/dr-pipeline/src/history.rs:86`](../../core/dr-pipeline/src/history.rs#L86), [`ui/dr-ui/src/develop.rs:4554`](../../ui/dr-ui/src/develop.rs#L4554), [`ui/dr-ui/src/identity_ui.rs:125`](../../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:100`](../../ui/dr-ui/src/lib.rs#L100), [`ui/dr-ui/src/memory.rs:1`](../../ui/dr-ui/src/memory.rs#L1) | +| NFR-RES-2 | [`ui/dr-ui/src/faces.rs:462`](../../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/library.rs:3624`](../../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/repairs.rs:1140`](../../ui/dr-ui/src/repairs.rs#L1140), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1) | +| NFR-RES-4 | [`core/dr-catalog/src/cache.rs:1`](../../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-catalog/src/schema.rs:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-gpu/src/lib.rs:95`](../../core/dr-gpu/src/lib.rs#L95), [`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:393`](../../core/dr-thumbs/src/lib.rs#L393) | +| NFR-SEC-1 | [`core/dr-decode/src/error.rs:1`](../../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30) | +| NFR-SEC-2 | [`core/dr-sync/src/account.rs:318`](../../core/dr-sync/src/account.rs#L318), [`platform/dr-plat/src/crash.rs:1`](../../platform/dr-plat/src/crash.rs#L1), [`platform/dr-plat/src/diagnostics.rs:1`](../../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/diagnostics/redact.rs:1`](../../platform/dr-plat/src/diagnostics/redact.rs#L1), [`platform/dr-plat/src/secrets.rs:82`](../../platform/dr-plat/src/secrets.rs#L82) | +| 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-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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`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:368`](../../core/dr-gpu/src/lib.rs#L368) | +| R5 | [`core/dr-gpu/tests/zoom_resolution.rs:1`](../../core/dr-gpu/tests/zoom_resolution.rs#L1) | +| R6 | [`core/dr-sync-nextcloud/src/lib.rs:1`](../../core/dr-sync-nextcloud/src/lib.rs#L1) | + +## Deferred (post-v1) + +Defined in `requirements.md` and marked `(post-v1)` on the defining line. Not in the denominator; a tag naming one is recorded here rather than counted. + +- FR-PLG-1 +- FR-PLG-10 +- FR-PLG-11 +- FR-PLG-12 +- FR-PLG-1a +- FR-PLG-2 — tagged in [`core/dr-pipeline/src/declared/decl.rs:1`](../../core/dr-pipeline/src/declared/decl.rs#L1), [`core/dr-pipeline/src/declared/expr.rs:152`](../../core/dr-pipeline/src/declared/expr.rs#L152), [`core/dr-pipeline/src/declared/expr.rs:1`](../../core/dr-pipeline/src/declared/expr.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:1`](../../core/dr-pipeline/src/declared/mod.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:82`](../../core/dr-pipeline/src/declared/mod.rs#L82), [`core/dr-pipeline/src/descriptor.rs:15`](../../core/dr-pipeline/src/descriptor.rs#L15), [`core/dr-pipeline/src/descriptor.rs:734`](../../core/dr-pipeline/src/descriptor.rs#L734), [`core/dr-pipeline/src/operation.rs:232`](../../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/tests/declared_parity.rs:1`](../../core/dr-pipeline/tests/declared_parity.rs#L1), [`core/dr-pipeline/tests/declared_parity.rs:240`](../../core/dr-pipeline/tests/declared_parity.rs#L240), [`core/dr-pipeline/tests/declared_parity.rs:305`](../../core/dr-pipeline/tests/declared_parity.rs#L305), [`core/dr-pipeline/tests/declared_parity.rs:358`](../../core/dr-pipeline/tests/declared_parity.rs#L358), [`core/dr-pipeline/tests/declared_parity.rs:418`](../../core/dr-pipeline/tests/declared_parity.rs#L418) +- FR-PLG-2a +- FR-PLG-2b +- FR-PLG-2c +- FR-PLG-2d — tagged in [`core/dr-pipeline/src/declared/decl.rs:112`](../../core/dr-pipeline/src/declared/decl.rs#L112), [`core/dr-pipeline/src/declared/decl.rs:154`](../../core/dr-pipeline/src/declared/decl.rs#L154), [`core/dr-pipeline/src/declared/decl.rs:1`](../../core/dr-pipeline/src/declared/decl.rs#L1), [`core/dr-pipeline/src/declared/decl.rs:422`](../../core/dr-pipeline/src/declared/decl.rs#L422), [`core/dr-pipeline/src/declared/decl.rs:67`](../../core/dr-pipeline/src/declared/decl.rs#L67), [`core/dr-pipeline/src/declared/mod.rs:1`](../../core/dr-pipeline/src/declared/mod.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:384`](../../core/dr-pipeline/src/declared/mod.rs#L384), [`core/dr-pipeline/src/declared/mod.rs:403`](../../core/dr-pipeline/src/declared/mod.rs#L403) +- FR-PLG-3 +- FR-PLG-3a +- FR-PLG-4 +- FR-PLG-4a +- FR-PLG-5 +- FR-PLG-5a +- FR-PLG-5b +- FR-PLG-5c +- FR-PLG-6 +- FR-PLG-6a +- FR-PLG-7 +- FR-PLG-8 — tagged in [`core/dr-pipeline/src/sidecar.rs:2345`](../../core/dr-pipeline/src/sidecar.rs#L2345), [`core/dr-pipeline/src/sidecar.rs:2378`](../../core/dr-pipeline/src/sidecar.rs#L2378) +- FR-PLG-9 +- NFR-SEC-6 + +## Not yet tagged + +30 of 184 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built. + +
Show untagged requirements + +- FR-CAT-14 +- FR-CULL-6 +- FR-CULL-7 +- FR-DEV-3g +- FR-DSP-2 +- FR-DSP-4 +- FR-MRG-9 +- FR-NC-11 +- FR-PLAT-AND-1 +- FR-PLAT-LIN-3 +- FR-RAW-2 +- NFR-A11Y-1 +- NFR-ARCH-1 +- NFR-COMPAT-2 +- NFR-MRG-1 +- NFR-MRG-2 +- NFR-OPS-4 +- NFR-P10 +- NFR-P11 +- NFR-P12 +- NFR-P15 +- NFR-P2 +- NFR-P4 +- NFR-P6 +- NFR-P7 +- NFR-P8 +- NFR-RES-3 +- R1 +- R2 +- R7 + +
diff --git a/docs/ui-navigation.md b/docs/dev/ui-navigation.md similarity index 99% rename from docs/ui-navigation.md rename to docs/dev/ui-navigation.md index 8045139..e036f31 100644 --- a/docs/ui-navigation.md +++ b/docs/dev/ui-navigation.md @@ -2,7 +2,7 @@ TRACES: FR-UI-1 | FR-UI-3 | FR-UI-5 | FR-DEV-3a | FR-DEV-3c -Successor to `ui-refinement.md`, which asked how the interface should *look*. +Successor to [`ui-refinement.md`](archive/ui-refinement.md), which asked how the interface should *look*. This asks how someone finds anything in it. The two are sequenced together at the end. diff --git a/docs/view-composition.md b/docs/dev/view-composition.md similarity index 99% rename from docs/view-composition.md rename to docs/dev/view-composition.md index f3fb5d5..1971f27 100644 --- a/docs/view-composition.md +++ b/docs/dev/view-composition.md @@ -3,7 +3,7 @@ TRACES: FR-UI-1 | FR-UI-6 | FR-UI-8 | FR-DEV-3a | NFR-P9 **Status:** Draft · 2026-08-09 -**Companion to:** [architecture.md](architecture.md) §4.3a, [ui-refinement.md](ui-refinement.md) +**Companion to:** [architecture.md](architecture.md) §4.3a, [ui-refinement.md](archive/ui-refinement.md) ## Why diff --git a/docs/windows.md b/docs/dev/windows.md similarity index 96% rename from docs/windows.md rename to docs/dev/windows.md index 649af83..a2c9cff 100644 --- a/docs/windows.md +++ b/docs/dev/windows.md @@ -11,8 +11,8 @@ and — because there is no Windows hardware on the runner — exactly how much verified before a person double-clicks it. **Written as a spec; §10 is the report.** Every step of §9 has since been run — -[`docker/windows/`](../docker/windows/) is the container, [`packaging/windows/darkroom.nsi`](../packaging/windows/darkroom.nsi) -the installer, [`.gitea/workflows/windows-image.yml`](../.gitea/workflows/windows-image.yml) and +[`docker/windows/`](../../docker/windows/) is the container, [`packaging/windows/darkroom.nsi`](../../packaging/windows/darkroom.nsi) +the installer, [`.gitea/workflows/windows-image.yml`](../../.gitea/workflows/windows-image.yml) and the `windows` job in `build-and-test.yml` the CI leg, and §6's gate passes through row 4 under Wine. Four claims in the first draft were wrong and are corrected in place with a note; §10 lists them. Where a claim still rests on reading rather than running, it says so. @@ -105,7 +105,7 @@ keeps DX12 out here. It is one flag away if that turns out to be wrong. The same shape as the Android leg: a job container built from a Dockerfile in the tree and pushed to the Gitea registry, tagged by the tree id of its directory so an unrelated push reuses it -([`android-image.yml`](../.gitea/workflows/android-image.yml) already does this and the comment +([`android-image.yml`](../../.gitea/workflows/android-image.yml) already does this and the comment there explains why). ``` @@ -157,7 +157,7 @@ Ordered by what blocks a first sign-in. **All four are done**; each item says ho `is_available`'s probe always succeeds on Windows, which is correct — Credential Manager is always present, so FR-NC-2's degraded mode does not arise. -2. **Paths.** *Done* — [`platform/dr-plat/src/dirs.rs`](../platform/dr-plat/src/dirs.rs). FR-PLAT-LIN-1 +2. **Paths.** *Done* — [`platform/dr-plat/src/dirs.rs`](../../platform/dr-plat/src/dirs.rs). FR-PLAT-LIN-1 says XDG, and the code said it in five places by reading `XDG_*_HOME` and falling back to `$HOME/.local/...`. On Windows `HOME` is normally unset, so every one of these degraded to a relative path from the working directory — which for a Start Menu launch is @@ -198,15 +198,15 @@ Ordered by what blocks a first sign-in. **All four are done**; each item says ho 6. **The executable's identity.** *Done.* Windows takes the icon and the version block from a resource compiled into the `.exe`, not from a `.desktop` file. - [`apps/darkroom-desktop/build.rs`](../apps/darkroom-desktop/build.rs) uses `winresource` + [`apps/darkroom-desktop/build.rs`](../../apps/darkroom-desktop/build.rs) uses `winresource` (which invokes MinGW's `windres` when cross-compiling) to embed - [`ui/dr-ui/ui/app-icon.png`](../ui/dr-ui/ui/app-icon.png) — wrapped into an `.ico` in + [`ui/dr-ui/ui/app-icon.png`](../../ui/dr-ui/ui/app-icon.png) — wrapped into an `.ico` in `OUT_DIR` at build time, since an ICO entry may be a PNG, so no generated binary is committed — plus the version from `CARGO_PKG_VERSION` and the product name. The script returns before touching the crate on every other target, and `winresource` is an unconditional build-dependency because **a `cfg(windows)` on a build-dependency is evaluated against the host**, which is Linux. This is the fifth place the identifier lives, and - [`tools/set-version.sh`](../tools/set-version.sh) does not need to learn it: the resource + [`tools/set-version.sh`](../../tools/set-version.sh) does not need to learn it: the resource reads the version cargo already knows. The same commit made the release binary a GUI-subsystem executable (`windows_subsystem = "windows"`), or Windows keeps a console window open behind the application. @@ -257,7 +257,7 @@ and running them means Wine. §6 does that for exactly one binary, deliberately. ## 5. The installer -[`packaging/windows/darkroom.nsi`](../packaging/windows/darkroom.nsi), compiled by `makensis` on +[`packaging/windows/darkroom.nsi`](../../packaging/windows/darkroom.nsi), compiled by `makensis` on the runner into `DarkRoom--x86_64-setup.exe`. `package.sh` passes the version in (`/DVERSION=…`, from `tools/set-version.sh`'s single source, the workspace `Cargo.toml`) and refuses to run if any `models/face/*.onnx` is smaller than 100 KB — the LFS-pointer guard every other @@ -370,7 +370,7 @@ say which of these were checked and on what. ## 7. The CI job -A fourth leg of [`build-and-test.yml`](../.gitea/workflows/build-and-test.yml), beside desktop, +A fourth leg of [`build-and-test.yml`](../../.gitea/workflows/build-and-test.yml), beside desktop, Android and traceability: ```yaml diff --git a/docs/manual/README.md b/docs/manual/README.md index 54f91c8..9f68f71 100644 --- a/docs/manual/README.md +++ b/docs/manual/README.md @@ -5,7 +5,7 @@ this page was captured from the desktop build driving itself — nothing is a mock-up, and nothing has been retouched outside DarkRoom. Where a feature is better seen moving, it moves. -The requirements behind each feature are in [requirements.md](../requirements.md); +The requirements behind each feature are in [requirements.md](../dev/requirements.md); the reasoning is in the design documents linked from each section. This page is only about what you see. @@ -209,19 +209,19 @@ sidecars, and a diagnostics bundle for a bug report. Face detection and identity run over the library and group faces by person; the `Identity` page is where suggestions are confirmed, rejected and split, and `People` on the filter bar narrows the grid to someone. Not pictured -here, for the obvious reason — [faces.md](../faces.md) has the design. +here, for the obvious reason — [faces.md](../dev/faces.md) has the design. ## Where things are written down | Feature | Design | |---|---| -| Local masks and segmentation | [segmentation.md](../segmentation.md), [mask-editing.md](../mask-editing.md) | -| Repair | [spot-removal.md](../spot-removal.md) | -| Panorama | [panorama.md](../panorama.md) | -| Faces and identity | [faces.md](../faces.md) | +| Local masks and segmentation | [segmentation.md](../dev/segmentation.md), [mask-editing.md](../dev/mask-editing.md) | +| Repair | [spot-removal.md](../dev/spot-removal.md) | +| Panorama | [panorama.md](../dev/panorama.md) | +| Faces and identity | [faces.md](../dev/faces.md) | | Gestures, generated from the code | [gestures.md](../gestures.md) | -| Navigation and layout | [ui-navigation.md](../ui-navigation.md) | -| Sync and storage | [storage.md](../storage.md) | +| Navigation and layout | [ui-navigation.md](../dev/ui-navigation.md) | +| Sync and storage | [storage.md](../dev/storage.md) | ## How this page is made diff --git a/docs/traceability.md b/docs/traceability.md deleted file mode 100644 index b845f17..0000000 --- a/docs/traceability.md +++ /dev/null @@ -1,258 +0,0 @@ -# Requirements traceability matrix - - - - -Denominators are parsed from [`requirements.md`](requirements.md) at run time, never hardcoded. Coverage is the intersection of tagged and defined IDs over defined IDs, so it cannot exceed 100%. A requirement whose definition line carries `(post-v1)` is defined but deferred: outside the denominator, listed below, and never an orphan. - -## Summary - -| Metric | Value | -|---|---| -| Source files scanned | 394 | -| TRACES tags found | 1573 | -| Requirements defined | 184 | -| Requirements deferred (post-v1) | 24 | -| Requirements covered | 154 | -| **Coverage** | **83.7%** (154/184) | - -### By type - -| Type | Covered | Defined | -|---|---|---| -| FR | 116 | 127 | -| NFR | 34 | 50 | -| R | 4 | 7 | - -## Orphan tags - -A tag naming an ID `requirements.md` does not define — what renumbering produces, and what a typo produces. - -- `FR-INF-1` - -## Tagged requirements - -| 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:129`](../core/dr-sync/src/scan.rs#L129), [`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:377`](../core/dr-types/src/settings.rs#L377), [`platform/dr-plat/src/storage.rs:287`](../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:586`](../platform/dr-plat/src/storage.rs#L586), [`platform/dr-plat/src/volumes.rs:1`](../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../platform/dr-plat/src/volumes.rs#L62), [`ui/dr-ui/src/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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`ui/dr-ui/src/library.rs:183`](../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:3396`](../ui/dr-ui/src/library.rs#L3396), [`ui/dr-ui/ui/import.slint:5`](../ui/dr-ui/ui/import.slint#L5) | -| FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137) | -| FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library.rs:1564`](../ui/dr-ui/src/library.rs#L1564), [`ui/dr-ui/src/library.rs:1627`](../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library.rs:1750`](../ui/dr-ui/src/library.rs#L1750), [`ui/dr-ui/src/library_ui.rs:1322`](../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:540`](../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:900`](../ui/dr-ui/ui/app.slint#L900), [`ui/dr-ui/ui/settings.slint:1093`](../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../ui/dr-ui/ui/settings.slint#L199) | -| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../core/dr-thumbs/src/lib.rs#L393), [`core/dr-types/src/place.rs:91`](../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1526`](../ui/dr-ui/src/collections_ui.rs#L1526), [`ui/dr-ui/src/collections_ui.rs:2433`](../ui/dr-ui/src/collections_ui.rs#L2433), [`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:914`](../ui/dr-ui/src/library_ui.rs#L914), [`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:105`](../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs: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:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:177`](../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:387`](../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435), [`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:564`](../core/dr-catalog/src/schema.rs#L564), [`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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../ui/dr-ui/src/collections_ui.rs#L1977), [`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:789`](../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`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:4253`](../ui/dr-ui/ui/library.slint#L4253) | -| 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:1125`](../core/dr-catalog/src/schema.rs#L1125), [`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:396`](../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4253`](../ui/dr-ui/ui/library.slint#L4253), [`ui/dr-ui/ui/settings.slint:191`](../ui/dr-ui/ui/settings.slint#L191) | -| 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:117`](../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:2774`](../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`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:2949`](../ui/dr-ui/ui/library.slint#L2949), [`ui/dr-ui/ui/library.slint:4231`](../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:998`](../ui/dr-ui/ui/library.slint#L998) | -| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7404`](../ui/dr-ui/src/library.rs#L7404), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`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:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../ui/dr-ui/src/presets.rs#L498), [`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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:781`](../core/dr-catalog/src/schema.rs#L781), [`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-face/src/references.rs:1`](../core/dr-face/src/references.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`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:2416`](../ui/dr-ui/src/develop.rs#L2416), [`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:1325`](../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2576`](../ui/dr-ui/src/lib.rs#L2576), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1), [`ui/dr-ui/ui/settings.slint:529`](../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:94`](../ui/dr-ui/ui/settings.slint#L94) | -| FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../core/dr-catalog/src/schema.rs#L1011), [`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:345`](../ui/dr-ui/src/library.rs#L345), [`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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`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-13 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7237`](../ui/dr-ui/src/library.rs#L7237), [`ui/dr-ui/src/library.rs:7280`](../ui/dr-ui/src/library.rs#L7280), [`ui/dr-ui/src/library.rs:7318`](../ui/dr-ui/src/library.rs#L7318), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | -| 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:4146`](../ui/dr-ui/src/develop.rs#L4146), [`ui/dr-ui/src/develop.rs:4159`](../ui/dr-ui/src/develop.rs#L4159), [`ui/dr-ui/src/develop.rs:4204`](../ui/dr-ui/src/develop.rs#L4204), [`ui/dr-ui/src/develop.rs:4215`](../ui/dr-ui/src/develop.rs#L4215), [`ui/dr-ui/src/develop.rs:4221`](../ui/dr-ui/src/develop.rs#L4221), [`ui/dr-ui/src/develop.rs:4238`](../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/develop.rs:810`](../ui/dr-ui/src/develop.rs#L810), [`ui/dr-ui/src/develop.rs:830`](../ui/dr-ui/src/develop.rs#L830), [`ui/dr-ui/src/develop.rs:836`](../ui/dr-ui/src/develop.rs#L836), [`ui/dr-ui/src/develop.rs:8992`](../ui/dr-ui/src/develop.rs#L8992), [`ui/dr-ui/src/develop.rs:9056`](../ui/dr-ui/src/develop.rs#L9056), [`ui/dr-ui/src/develop.rs:9079`](../ui/dr-ui/src/develop.rs#L9079), [`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:1932`](../ui/dr-ui/src/lib.rs#L1932), [`ui/dr-ui/src/lib.rs:2040`](../ui/dr-ui/src/lib.rs#L2040), [`ui/dr-ui/src/lib.rs:2153`](../ui/dr-ui/src/lib.rs#L2153), [`ui/dr-ui/src/lib.rs:2194`](../ui/dr-ui/src/lib.rs#L2194), [`ui/dr-ui/src/lib.rs:3685`](../ui/dr-ui/src/lib.rs#L3685), [`ui/dr-ui/src/lib.rs:442`](../ui/dr-ui/src/lib.rs#L442), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:2028`](../ui/dr-ui/ui/app.slint#L2028), [`ui/dr-ui/ui/app.slint:3035`](../ui/dr-ui/ui/app.slint#L3035), [`ui/dr-ui/ui/app.slint:90`](../ui/dr-ui/ui/app.slint#L90), [`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:171`](../core/dr-pipeline/src/sidecar.rs#L171), [`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:564`](../ui/dr-ui/src/library.rs#L564) | -| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../core/dr-catalog/src/schema.rs#L646), [`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:6057`](../ui/dr-ui/src/library.rs#L6057) | -| 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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:714`](../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1325`](../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:603`](../ui/dr-ui/src/identity_ui.rs#L603), [`ui/dr-ui/src/lib.rs:1511`](../ui/dr-ui/src/lib.rs#L1511), [`ui/dr-ui/src/lib.rs:3940`](../ui/dr-ui/src/lib.rs#L3940), [`ui/dr-ui/src/library.rs:3624`](../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/library.rs:3889`](../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/src/library_ui.rs:406`](../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:552`](../ui/dr-ui/src/settings_ui.rs#L552), [`ui/dr-ui/ui/app.slint:946`](../ui/dr-ui/ui/app.slint#L946), [`ui/dr-ui/ui/settings.slint:100`](../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../ui/dr-ui/ui/settings.slint#L529), [`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-8a | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7237`](../ui/dr-ui/src/library.rs#L7237), [`ui/dr-ui/src/library.rs:7280`](../ui/dr-ui/src/library.rs#L7280), [`ui/dr-ui/src/library.rs:7318`](../ui/dr-ui/src/library.rs#L7318), [`ui/dr-ui/src/repairs.rs:571`](../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | -| FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:781`](../core/dr-catalog/src/schema.rs#L781), [`core/dr-face/src/assign.rs:1`](../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:584`](../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:517`](../ui/dr-ui/src/repairs.rs#L517), [`ui/dr-ui/ui/identity.slint:347`](../ui/dr-ui/ui/identity.slint#L347) | -| 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:2845`](../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1336`](../core/dr-pipeline/src/sidecar.rs#L1336), [`core/dr-pipeline/src/sidecar.rs:1515`](../core/dr-pipeline/src/sidecar.rs#L1515), [`core/dr-pipeline/src/sidecar.rs:1604`](../core/dr-pipeline/src/sidecar.rs#L1604), [`core/dr-pipeline/src/sidecar.rs:1708`](../core/dr-pipeline/src/sidecar.rs#L1708), [`core/dr-pipeline/src/sidecar.rs:1916`](../core/dr-pipeline/src/sidecar.rs#L1916), [`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:2318`](../ui/dr-ui/src/develop.rs#L2318), [`ui/dr-ui/src/develop.rs:3666`](../ui/dr-ui/src/develop.rs#L3666), [`ui/dr-ui/src/develop.rs:3693`](../ui/dr-ui/src/develop.rs#L3693), [`ui/dr-ui/src/develop.rs:3725`](../ui/dr-ui/src/develop.rs#L3725), [`ui/dr-ui/src/develop.rs:3749`](../ui/dr-ui/src/develop.rs#L3749), [`ui/dr-ui/src/develop.rs:3755`](../ui/dr-ui/src/develop.rs#L3755), [`ui/dr-ui/src/develop.rs:3762`](../ui/dr-ui/src/develop.rs#L3762), [`ui/dr-ui/src/develop.rs:3782`](../ui/dr-ui/src/develop.rs#L3782), [`ui/dr-ui/src/labels.rs:63`](../ui/dr-ui/src/labels.rs#L63), [`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:424`](../ui/dr-ui/src/lib.rs#L424), [`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:2620`](../ui/dr-ui/ui/app.slint#L2620), [`ui/dr-ui/ui/app.slint:2633`](../ui/dr-ui/ui/app.slint#L2633), [`ui/dr-ui/ui/masks.slint:832`](../ui/dr-ui/ui/masks.slint#L832) | -| 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-19 | [`core/dr-pipeline/src/mask.rs:1307`](../core/dr-pipeline/src/mask.rs#L1307) | -| FR-DEV-19a | [`core/dr-gpu/src/mask.rs:761`](../core/dr-gpu/src/mask.rs#L761), [`core/dr-pipeline/src/mask.rs:1588`](../core/dr-pipeline/src/mask.rs#L1588), [`core/dr-pipeline/src/mask.rs:2919`](../core/dr-pipeline/src/mask.rs#L2919), [`core/dr-pipeline/src/mask.rs:988`](../core/dr-pipeline/src/mask.rs#L988), [`core/dr-pipeline/src/sidecar.rs:1226`](../core/dr-pipeline/src/sidecar.rs#L1226), [`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:2930`](../ui/dr-ui/src/develop.rs#L2930), [`ui/dr-ui/src/develop.rs:2991`](../ui/dr-ui/src/develop.rs#L2991), [`ui/dr-ui/src/develop.rs:3010`](../ui/dr-ui/src/develop.rs#L3010), [`ui/dr-ui/src/develop.rs:880`](../ui/dr-ui/src/develop.rs#L880), [`ui/dr-ui/src/labels.rs:73`](../ui/dr-ui/src/labels.rs#L73), [`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:770`](../ui/dr-ui/ui/masks.slint#L770), [`ui/dr-ui/ui/masks.slint:855`](../ui/dr-ui/ui/masks.slint#L855) | -| FR-DEV-19b | [`ui/dr-ui/src/develop.rs:3091`](../ui/dr-ui/src/develop.rs#L3091), [`ui/dr-ui/src/develop.rs:3634`](../ui/dr-ui/src/develop.rs#L3634), [`ui/dr-ui/src/develop.rs:889`](../ui/dr-ui/src/develop.rs#L889), [`ui/dr-ui/src/develop.rs:896`](../ui/dr-ui/src/develop.rs#L896), [`ui/dr-ui/src/labels.rs:67`](../ui/dr-ui/src/labels.rs#L67), [`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:1056`](../ui/dr-ui/ui/app.slint#L1056), [`ui/dr-ui/ui/app.slint:2260`](../ui/dr-ui/ui/app.slint#L2260), [`ui/dr-ui/ui/masks.slint:1126`](../ui/dr-ui/ui/masks.slint#L1126), [`ui/dr-ui/ui/masks.slint:453`](../ui/dr-ui/ui/masks.slint#L453), [`ui/dr-ui/ui/masks.slint:774`](../ui/dr-ui/ui/masks.slint#L774), [`ui/dr-ui/ui/masks.slint:848`](../ui/dr-ui/ui/masks.slint#L848), [`ui/dr-ui/ui/masks.slint:864`](../ui/dr-ui/ui/masks.slint#L864) | -| 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:893`](../core/dr-pipeline/src/graph.rs#L893), [`core/dr-pipeline/src/mask.rs:1796`](../core/dr-pipeline/src/mask.rs#L1796), [`core/dr-pipeline/src/mask.rs:1822`](../core/dr-pipeline/src/mask.rs#L1822), [`core/dr-pipeline/src/mask.rs:1837`](../core/dr-pipeline/src/mask.rs#L1837), [`core/dr-pipeline/src/mask.rs:1957`](../core/dr-pipeline/src/mask.rs#L1957), [`core/dr-pipeline/src/mask.rs:2005`](../core/dr-pipeline/src/mask.rs#L2005), [`core/dr-pipeline/src/mask.rs:2149`](../core/dr-pipeline/src/mask.rs#L2149), [`core/dr-pipeline/src/mask.rs:2386`](../core/dr-pipeline/src/mask.rs#L2386), [`core/dr-pipeline/src/operation.rs:1748`](../core/dr-pipeline/src/operation.rs#L1748), [`core/dr-pipeline/src/operation.rs:588`](../core/dr-pipeline/src/operation.rs#L588), [`core/dr-pipeline/src/operation.rs:863`](../core/dr-pipeline/src/operation.rs#L863), [`ui/dr-ui/src/develop.rs:2035`](../ui/dr-ui/src/develop.rs#L2035), [`ui/dr-ui/src/develop.rs:2295`](../ui/dr-ui/src/develop.rs#L2295), [`ui/dr-ui/src/develop.rs:2542`](../ui/dr-ui/src/develop.rs#L2542), [`ui/dr-ui/src/develop.rs:2675`](../ui/dr-ui/src/develop.rs#L2675), [`ui/dr-ui/src/develop.rs:4068`](../ui/dr-ui/src/develop.rs#L4068), [`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:7249`](../ui/dr-ui/src/develop.rs#L7249), [`ui/dr-ui/src/develop.rs:7285`](../ui/dr-ui/src/develop.rs#L7285), [`ui/dr-ui/src/develop.rs:915`](../ui/dr-ui/src/develop.rs#L915), [`ui/dr-ui/src/develop.rs:924`](../ui/dr-ui/src/develop.rs#L924), [`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:1091`](../ui/dr-ui/ui/masks.slint#L1091), [`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:782`](../ui/dr-ui/ui/masks.slint#L782), [`ui/dr-ui/ui/masks.slint:850`](../ui/dr-ui/ui/masks.slint#L850), [`ui/dr-ui/ui/masks.slint:938`](../ui/dr-ui/ui/masks.slint#L938) | -| 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:2443`](../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:679`](../core/dr-gpu/src/adjust.rs#L679), [`core/dr-gpu/src/adjust.rs:798`](../core/dr-gpu/src/adjust.rs#L798), [`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:1348`](../core/dr-pipeline/src/graph.rs#L1348), [`core/dr-pipeline/src/graph.rs:1379`](../core/dr-pipeline/src/graph.rs#L1379), [`core/dr-pipeline/src/graph.rs:1402`](../core/dr-pipeline/src/graph.rs#L1402), [`core/dr-pipeline/src/graph.rs:1440`](../core/dr-pipeline/src/graph.rs#L1440), [`core/dr-pipeline/src/graph.rs:1471`](../core/dr-pipeline/src/graph.rs#L1471), [`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:860`](../core/dr-pipeline/src/graph.rs#L860), [`core/dr-pipeline/src/graph.rs:952`](../core/dr-pipeline/src/graph.rs#L952), [`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/mask.rs:558`](../core/dr-pipeline/src/mask.rs#L558), [`core/dr-pipeline/src/neutral.rs:1`](../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:306`](../core/dr-pipeline/src/neutral.rs#L306), [`core/dr-pipeline/src/neutral.rs:322`](../core/dr-pipeline/src/neutral.rs#L322), [`core/dr-pipeline/src/neutral.rs:338`](../core/dr-pipeline/src/neutral.rs#L338), [`core/dr-pipeline/src/neutral.rs:360`](../core/dr-pipeline/src/neutral.rs#L360), [`core/dr-pipeline/src/neutral.rs:81`](../core/dr-pipeline/src/neutral.rs#L81), [`core/dr-pipeline/src/operation.rs:330`](../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:565`](../core/dr-pipeline/src/operation.rs#L565), [`core/dr-pipeline/src/operation.rs:637`](../core/dr-pipeline/src/operation.rs#L637), [`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:1400`](../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:192`](../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:2232`](../core/dr-pipeline/src/sidecar.rs#L2232), [`core/dr-pipeline/src/sidecar.rs:2312`](../core/dr-pipeline/src/sidecar.rs#L2312), [`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:1318`](../ui/dr-ui/src/develop.rs#L1318), [`ui/dr-ui/src/develop.rs:1407`](../ui/dr-ui/src/develop.rs#L1407), [`ui/dr-ui/src/develop.rs:1443`](../ui/dr-ui/src/develop.rs#L1443), [`ui/dr-ui/src/develop.rs:165`](../ui/dr-ui/src/develop.rs#L165), [`ui/dr-ui/src/develop.rs:1714`](../ui/dr-ui/src/develop.rs#L1714), [`ui/dr-ui/src/develop.rs:2155`](../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:2398`](../ui/dr-ui/src/develop.rs#L2398), [`ui/dr-ui/src/develop.rs:2416`](../ui/dr-ui/src/develop.rs#L2416), [`ui/dr-ui/src/develop.rs:2430`](../ui/dr-ui/src/develop.rs#L2430), [`ui/dr-ui/src/develop.rs:2452`](../ui/dr-ui/src/develop.rs#L2452), [`ui/dr-ui/src/develop.rs:2761`](../ui/dr-ui/src/develop.rs#L2761), [`ui/dr-ui/src/develop.rs:2859`](../ui/dr-ui/src/develop.rs#L2859), [`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:4409`](../ui/dr-ui/src/develop.rs#L4409), [`ui/dr-ui/src/develop.rs:4598`](../ui/dr-ui/src/develop.rs#L4598), [`ui/dr-ui/src/develop.rs:4658`](../ui/dr-ui/src/develop.rs#L4658), [`ui/dr-ui/src/develop.rs:5063`](../ui/dr-ui/src/develop.rs#L5063), [`ui/dr-ui/src/develop.rs:5093`](../ui/dr-ui/src/develop.rs#L5093), [`ui/dr-ui/src/develop.rs:5159`](../ui/dr-ui/src/develop.rs#L5159), [`ui/dr-ui/src/develop.rs:5173`](../ui/dr-ui/src/develop.rs#L5173), [`ui/dr-ui/src/develop.rs:5375`](../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:5463`](../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:588`](../ui/dr-ui/src/develop.rs#L588), [`ui/dr-ui/src/develop.rs:6409`](../ui/dr-ui/src/develop.rs#L6409), [`ui/dr-ui/src/develop.rs:6482`](../ui/dr-ui/src/develop.rs#L6482), [`ui/dr-ui/src/develop.rs:649`](../ui/dr-ui/src/develop.rs#L649), [`ui/dr-ui/src/develop.rs:6675`](../ui/dr-ui/src/develop.rs#L6675), [`ui/dr-ui/src/develop.rs:6706`](../ui/dr-ui/src/develop.rs#L6706), [`ui/dr-ui/src/develop.rs:6789`](../ui/dr-ui/src/develop.rs#L6789), [`ui/dr-ui/src/develop.rs:6851`](../ui/dr-ui/src/develop.rs#L6851), [`ui/dr-ui/src/develop.rs:7057`](../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7213`](../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/develop.rs:7390`](../ui/dr-ui/src/develop.rs#L7390), [`ui/dr-ui/src/develop.rs:7434`](../ui/dr-ui/src/develop.rs#L7434), [`ui/dr-ui/src/develop.rs:7484`](../ui/dr-ui/src/develop.rs#L7484), [`ui/dr-ui/src/develop.rs:7909`](../ui/dr-ui/src/develop.rs#L7909), [`ui/dr-ui/src/develop.rs:850`](../ui/dr-ui/src/develop.rs#L850), [`ui/dr-ui/src/develop.rs:8637`](../ui/dr-ui/src/develop.rs#L8637), [`ui/dr-ui/src/develop.rs:943`](../ui/dr-ui/src/develop.rs#L943), [`ui/dr-ui/src/develop.rs:972`](../ui/dr-ui/src/develop.rs#L972), [`ui/dr-ui/src/labels.rs:35`](../ui/dr-ui/src/labels.rs#L35), [`ui/dr-ui/src/lib.rs:2021`](../ui/dr-ui/src/lib.rs#L2021), [`ui/dr-ui/src/lib.rs:2901`](../ui/dr-ui/src/lib.rs#L2901), [`ui/dr-ui/src/lib.rs:3108`](../ui/dr-ui/src/lib.rs#L3108), [`ui/dr-ui/src/lib.rs:3239`](../ui/dr-ui/src/lib.rs#L3239), [`ui/dr-ui/src/lib.rs:3444`](../ui/dr-ui/src/lib.rs#L3444), [`ui/dr-ui/src/lib.rs:3508`](../ui/dr-ui/src/lib.rs#L3508), [`ui/dr-ui/src/lib.rs:3562`](../ui/dr-ui/src/lib.rs#L3562), [`ui/dr-ui/src/lib.rs:419`](../ui/dr-ui/src/lib.rs#L419), [`ui/dr-ui/src/lib.rs:448`](../ui/dr-ui/src/lib.rs#L448), [`ui/dr-ui/src/lib.rs:554`](../ui/dr-ui/src/lib.rs#L554), [`ui/dr-ui/src/lib.rs:578`](../ui/dr-ui/src/lib.rs#L578), [`ui/dr-ui/src/library.rs:616`](../ui/dr-ui/src/library.rs#L616), [`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:414`](../ui/dr-ui/src/presets.rs#L414), [`ui/dr-ui/src/segmentation.rs:117`](../ui/dr-ui/src/segmentation.rs#L117), [`ui/dr-ui/src/segmentation.rs:353`](../ui/dr-ui/src/segmentation.rs#L353), [`ui/dr-ui/src/segmentation.rs:369`](../ui/dr-ui/src/segmentation.rs#L369), [`ui/dr-ui/src/segmentation.rs:499`](../ui/dr-ui/src/segmentation.rs#L499), [`ui/dr-ui/src/segmentation.rs:527`](../ui/dr-ui/src/segmentation.rs#L527), [`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:149`](../ui/dr-ui/ui/app.slint#L149), [`ui/dr-ui/ui/app.slint:2325`](../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/app.slint:2385`](../ui/dr-ui/ui/app.slint#L2385), [`ui/dr-ui/ui/develop.slint:223`](../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1216`](../ui/dr-ui/ui/masks.slint#L1216), [`ui/dr-ui/ui/masks.slint:753`](../ui/dr-ui/ui/masks.slint#L753), [`ui/dr-ui/ui/masks.slint:812`](../ui/dr-ui/ui/masks.slint#L812) | -| 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:1699`](../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/neutral.rs:1`](../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:378`](../core/dr-pipeline/src/neutral.rs#L378), [`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:1330`](../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/develop.rs:1609`](../ui/dr-ui/src/develop.rs#L1609), [`ui/dr-ui/src/develop.rs:7909`](../ui/dr-ui/src/develop.rs#L7909), [`ui/dr-ui/src/develop.rs:8107`](../ui/dr-ui/src/develop.rs#L8107), [`ui/dr-ui/src/lib.rs:879`](../ui/dr-ui/src/lib.rs#L879), [`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:2569`](../ui/dr-ui/ui/app.slint#L2569) | -| 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:2780`](../ui/dr-ui/ui/app.slint#L2780) | -| 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:1699`](../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/preset.rs:751`](../core/dr-pipeline/src/preset.rs#L751), [`ui/dr-ui/src/develop.rs:8158`](../ui/dr-ui/src/develop.rs#L8158) | -| FR-DEV-3d | [`core/dr-gpu/src/adjust.rs:1014`](../core/dr-gpu/src/adjust.rs#L1014), [`core/dr-gpu/src/adjust.rs:1107`](../core/dr-gpu/src/adjust.rs#L1107), [`core/dr-gpu/src/adjust.rs:114`](../core/dr-gpu/src/adjust.rs#L114), [`core/dr-gpu/src/adjust.rs:798`](../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/adjust.rs:84`](../core/dr-gpu/src/adjust.rs#L84), [`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:991`](../core/dr-pipeline/src/graph.rs#L991), [`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:771`](../core/dr-decode/src/lib.rs#L771), [`core/dr-decode/src/lib.rs:811`](../core/dr-decode/src/lib.rs#L811), [`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:473`](../core/dr-decode/src/profile.rs#L473), [`core/dr-decode/src/profile.rs:507`](../core/dr-decode/src/profile.rs#L507), [`core/dr-decode/src/profile.rs:678`](../core/dr-decode/src/profile.rs#L678), [`core/dr-gpu/src/adjust.rs:37`](../core/dr-gpu/src/adjust.rs#L37), [`core/dr-gpu/src/adjust.rs:995`](../core/dr-gpu/src/adjust.rs#L995), [`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:1985`](../core/dr-pipeline/src/operation.rs#L1985), [`core/dr-pipeline/src/operation.rs:2066`](../core/dr-pipeline/src/operation.rs#L2066), [`core/dr-pipeline/src/operation.rs:2091`](../core/dr-pipeline/src/operation.rs#L2091), [`core/dr-pipeline/src/operation.rs:2106`](../core/dr-pipeline/src/operation.rs#L2106), [`core/dr-pipeline/src/operation.rs:2130`](../core/dr-pipeline/src/operation.rs#L2130), [`core/dr-pipeline/src/operation.rs:310`](../core/dr-pipeline/src/operation.rs#L310), [`core/dr-pipeline/src/operation.rs:471`](../core/dr-pipeline/src/operation.rs#L471), [`core/dr-pipeline/src/operation.rs:481`](../core/dr-pipeline/src/operation.rs#L481), [`core/dr-pipeline/src/operation.rs:769`](../core/dr-pipeline/src/operation.rs#L769) | -| 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:149`](../core/dr-gpu/src/adjust.rs#L149), [`core/dr-gpu/src/adjust.rs:206`](../core/dr-gpu/src/adjust.rs#L206), [`core/dr-gpu/src/adjust.rs:381`](../core/dr-gpu/src/adjust.rs#L381), [`core/dr-gpu/src/adjust.rs:510`](../core/dr-gpu/src/adjust.rs#L510), [`core/dr-gpu/src/adjust.rs:77`](../core/dr-gpu/src/adjust.rs#L77), [`core/dr-gpu/tests/film_sim.rs:195`](../core/dr-gpu/tests/film_sim.rs#L195), [`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:1313`](../core/dr-pipeline/src/operation.rs#L1313), [`core/dr-pipeline/src/operation.rs:1341`](../core/dr-pipeline/src/operation.rs#L1341), [`core/dr-pipeline/src/operation.rs:1387`](../core/dr-pipeline/src/operation.rs#L1387), [`core/dr-pipeline/src/operation.rs:1985`](../core/dr-pipeline/src/operation.rs#L1985), [`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:1055`](../core/dr-pipeline/src/sidecar.rs#L1055), [`core/dr-pipeline/src/sidecar.rs:130`](../core/dr-pipeline/src/sidecar.rs#L130), [`core/dr-pipeline/src/sidecar.rs:203`](../core/dr-pipeline/src/sidecar.rs#L203), [`core/dr-pipeline/src/sidecar.rs:2681`](../core/dr-pipeline/src/sidecar.rs#L2681), [`core/dr-pipeline/src/sidecar.rs:2757`](../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:576`](../core/dr-pipeline/src/sidecar.rs#L576), [`core/dr-pipeline/src/sidecar.rs:876`](../core/dr-pipeline/src/sidecar.rs#L876), [`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:1170`](../ui/dr-ui/src/develop.rs#L1170), [`ui/dr-ui/src/develop.rs:4810`](../ui/dr-ui/src/develop.rs#L4810), [`ui/dr-ui/src/develop.rs:4827`](../ui/dr-ui/src/develop.rs#L4827), [`ui/dr-ui/src/develop.rs:4839`](../ui/dr-ui/src/develop.rs#L4839), [`ui/dr-ui/src/develop.rs:4877`](../ui/dr-ui/src/develop.rs#L4877), [`ui/dr-ui/src/develop.rs:4886`](../ui/dr-ui/src/develop.rs#L4886), [`ui/dr-ui/src/develop.rs:4989`](../ui/dr-ui/src/develop.rs#L4989), [`ui/dr-ui/src/develop.rs:5500`](../ui/dr-ui/src/develop.rs#L5500), [`ui/dr-ui/src/develop.rs:5671`](../ui/dr-ui/src/develop.rs#L5671), [`ui/dr-ui/src/develop.rs:8649`](../ui/dr-ui/src/develop.rs#L8649), [`ui/dr-ui/src/lib.rs:2873`](../ui/dr-ui/src/lib.rs#L2873), [`ui/dr-ui/src/lib.rs:805`](../ui/dr-ui/src/lib.rs#L805), [`ui/dr-ui/src/lib.rs:870`](../ui/dr-ui/src/lib.rs#L870), [`ui/dr-ui/src/library.rs:602`](../ui/dr-ui/src/library.rs#L602), [`ui/dr-ui/src/library.rs:870`](../ui/dr-ui/src/library.rs#L870), [`ui/dr-ui/src/presets.rs:422`](../ui/dr-ui/src/presets.rs#L422), [`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:444`](../core/dr-decode/src/lib.rs#L444), [`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:2778`](../ui/dr-ui/src/develop.rs#L2778), [`ui/dr-ui/src/segmentation.rs:499`](../ui/dr-ui/src/segmentation.rs#L499) | -| FR-DEV-3i | [`core/dr-pipeline/src/mask.rs:558`](../core/dr-pipeline/src/mask.rs#L558), [`core/dr-segment/src/lib.rs:1`](../core/dr-segment/src/lib.rs#L1), [`ui/dr-ui/src/segmentation.rs:1`](../ui/dr-ui/src/segmentation.rs#L1) | -| FR-DEV-4 | [`core/dr-gpu/src/adjust.rs:798`](../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:368`](../core/dr-gpu/src/lib.rs#L368), [`ui/dr-ui/ui/crop.slint:1`](../ui/dr-ui/ui/crop.slint#L1) | -| FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1440`](../core/dr-pipeline/src/graph.rs#L1440), [`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/sidecar.rs:1045`](../core/dr-pipeline/src/sidecar.rs#L1045), [`core/dr-pipeline/src/sidecar.rs:144`](../core/dr-pipeline/src/sidecar.rs#L144), [`core/dr-pipeline/src/sidecar.rs:2472`](../core/dr-pipeline/src/sidecar.rs#L2472), [`core/dr-pipeline/src/sidecar.rs:2508`](../core/dr-pipeline/src/sidecar.rs#L2508), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:303`](../core/dr-pipeline/src/sidecar.rs#L303), [`core/dr-pipeline/src/sidecar.rs:694`](../core/dr-pipeline/src/sidecar.rs#L694), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:857`](../core/dr-pipeline/src/sidecar.rs#L857), [`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:4409`](../ui/dr-ui/src/develop.rs#L4409), [`ui/dr-ui/src/develop.rs:4839`](../ui/dr-ui/src/develop.rs#L4839), [`ui/dr-ui/src/develop.rs:5517`](../ui/dr-ui/src/develop.rs#L5517), [`ui/dr-ui/src/develop.rs:5535`](../ui/dr-ui/src/develop.rs#L5535), [`ui/dr-ui/src/develop.rs:5574`](../ui/dr-ui/src/develop.rs#L5574), [`ui/dr-ui/src/develop.rs:5588`](../ui/dr-ui/src/develop.rs#L5588), [`ui/dr-ui/src/develop.rs:5599`](../ui/dr-ui/src/develop.rs#L5599), [`ui/dr-ui/src/develop.rs:5658`](../ui/dr-ui/src/develop.rs#L5658), [`ui/dr-ui/src/develop.rs:5671`](../ui/dr-ui/src/develop.rs#L5671), [`ui/dr-ui/src/develop.rs:5701`](../ui/dr-ui/src/develop.rs#L5701), [`ui/dr-ui/src/develop.rs:5714`](../ui/dr-ui/src/develop.rs#L5714), [`ui/dr-ui/src/develop.rs:5726`](../ui/dr-ui/src/develop.rs#L5726), [`ui/dr-ui/src/develop.rs:5742`](../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:5778`](../ui/dr-ui/src/develop.rs#L5778), [`ui/dr-ui/src/develop.rs:5797`](../ui/dr-ui/src/develop.rs#L5797), [`ui/dr-ui/src/develop.rs:5813`](../ui/dr-ui/src/develop.rs#L5813), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`ui/dr-ui/src/develop.rs:6675`](../ui/dr-ui/src/develop.rs#L6675), [`ui/dr-ui/src/develop.rs:6897`](../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:6954`](../ui/dr-ui/src/develop.rs#L6954), [`ui/dr-ui/src/develop.rs:7014`](../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:772`](../ui/dr-ui/src/develop.rs#L772), [`ui/dr-ui/src/develop.rs:781`](../ui/dr-ui/src/develop.rs#L781), [`ui/dr-ui/src/labels.rs:12`](../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:278`](../ui/dr-ui/src/labels.rs#L278), [`ui/dr-ui/src/labels.rs:31`](../ui/dr-ui/src/labels.rs#L31), [`ui/dr-ui/src/lib.rs:1921`](../ui/dr-ui/src/lib.rs#L1921), [`ui/dr-ui/src/lib.rs:1926`](../ui/dr-ui/src/lib.rs#L1926), [`ui/dr-ui/src/lib.rs:1989`](../ui/dr-ui/src/lib.rs#L1989), [`ui/dr-ui/src/lib.rs:1998`](../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2010`](../ui/dr-ui/src/lib.rs#L2010), [`ui/dr-ui/src/lib.rs:3139`](../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3159`](../ui/dr-ui/src/lib.rs#L3159), [`ui/dr-ui/src/library.rs:611`](../ui/dr-ui/src/library.rs#L611), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/presets.rs:1678`](../ui/dr-ui/src/presets.rs#L1678), [`ui/dr-ui/src/presets.rs:373`](../ui/dr-ui/src/presets.rs#L373), [`ui/dr-ui/src/presets.rs:437`](../ui/dr-ui/src/presets.rs#L437), [`ui/dr-ui/src/presets.rs:557`](../ui/dr-ui/src/presets.rs#L557), [`ui/dr-ui/ui/history.slint:191`](../ui/dr-ui/ui/history.slint#L191), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:218`](../ui/dr-ui/ui/history.slint#L218), [`ui/dr-ui/ui/history.slint:303`](../ui/dr-ui/ui/history.slint#L303), [`ui/dr-ui/ui/history.slint:43`](../ui/dr-ui/ui/history.slint#L43), [`ui/dr-ui/ui/history.slint:53`](../ui/dr-ui/ui/history.slint#L53) | -| 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:443`](../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop.rs:5457`](../ui/dr-ui/src/develop.rs#L5457), [`ui/dr-ui/src/develop.rs:5478`](../ui/dr-ui/src/develop.rs#L5478), [`ui/dr-ui/src/lib.rs:1888`](../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2674`](../ui/dr-ui/src/lib.rs#L2674), [`ui/dr-ui/src/lib.rs:2703`](../ui/dr-ui/src/lib.rs#L2703), [`ui/dr-ui/src/library.rs:2491`](../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:592`](../ui/dr-ui/src/library.rs#L592), [`ui/dr-ui/src/library_ui.rs:3255`](../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`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:707`](../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../ui/dr-ui/src/presets.rs#L741), [`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:1706`](../ui/dr-ui/ui/app.slint#L1706), [`ui/dr-ui/ui/app.slint:2538`](../ui/dr-ui/ui/app.slint#L2538), [`ui/dr-ui/ui/app.slint:3173`](../ui/dr-ui/ui/app.slint#L3173), [`ui/dr-ui/ui/app.slint:765`](../ui/dr-ui/ui/app.slint#L765), [`ui/dr-ui/ui/app.slint:776`](../ui/dr-ui/ui/app.slint#L776), [`ui/dr-ui/ui/library.slint:1579`](../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4269`](../ui/dr-ui/ui/library.slint#L4269), [`ui/dr-ui/ui/library.slint:4293`](../ui/dr-ui/ui/library.slint#L4293), [`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:119`](../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../ui/dr-ui/ui/settings.slint#L711) | -| 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:4343`](../ui/dr-ui/src/develop.rs#L4343), [`ui/dr-ui/src/develop.rs:4384`](../ui/dr-ui/src/develop.rs#L4384), [`ui/dr-ui/src/develop.rs:5613`](../ui/dr-ui/src/develop.rs#L5613), [`ui/dr-ui/src/develop.rs:5630`](../ui/dr-ui/src/develop.rs#L5630), [`ui/dr-ui/src/develop.rs:5742`](../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:6897`](../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:7014`](../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:797`](../ui/dr-ui/src/develop.rs#L797), [`ui/dr-ui/src/lib.rs:1998`](../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2070`](../ui/dr-ui/src/lib.rs#L2070), [`ui/dr-ui/src/lib.rs:2084`](../ui/dr-ui/src/lib.rs#L2084), [`ui/dr-ui/src/lib.rs:3080`](../ui/dr-ui/src/lib.rs#L3080), [`ui/dr-ui/src/lib.rs:3139`](../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3211`](../ui/dr-ui/src/lib.rs#L3211), [`ui/dr-ui/src/lib.rs:411`](../ui/dr-ui/src/lib.rs#L411), [`ui/dr-ui/ui/app.slint:131`](../ui/dr-ui/ui/app.slint#L131), [`ui/dr-ui/ui/app.slint:2445`](../ui/dr-ui/ui/app.slint#L2445), [`ui/dr-ui/ui/app.slint:2460`](../ui/dr-ui/ui/app.slint#L2460), [`ui/dr-ui/ui/app.slint:2780`](../ui/dr-ui/ui/app.slint#L2780), [`ui/dr-ui/ui/history.slint:102`](../ui/dr-ui/ui/history.slint#L102), [`ui/dr-ui/ui/history.slint:1`](../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:226`](../ui/dr-ui/ui/history.slint#L226), [`ui/dr-ui/ui/history.slint:53`](../ui/dr-ui/ui/history.slint#L53), [`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:1092`](../core/dr-pipeline/src/graph.rs#L1092), [`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:717`](../core/dr-pipeline/src/operation.rs#L717), [`core/dr-pipeline/src/sidecar.rs:1071`](../core/dr-pipeline/src/sidecar.rs#L1071), [`core/dr-pipeline/src/sidecar.rs:1125`](../core/dr-pipeline/src/sidecar.rs#L1125), [`core/dr-pipeline/src/sidecar.rs:1155`](../core/dr-pipeline/src/sidecar.rs#L1155), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:888`](../core/dr-pipeline/src/sidecar.rs#L888), [`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:3209`](../ui/dr-ui/src/develop.rs#L3209), [`ui/dr-ui/src/develop.rs:3247`](../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/develop.rs:3312`](../ui/dr-ui/src/develop.rs#L3312), [`ui/dr-ui/src/develop.rs:3395`](../ui/dr-ui/src/develop.rs#L3395), [`ui/dr-ui/src/develop.rs:3409`](../ui/dr-ui/src/develop.rs#L3409), [`ui/dr-ui/src/develop.rs:904`](../ui/dr-ui/src/develop.rs#L904), [`ui/dr-ui/src/labels.rs:80`](../ui/dr-ui/src/labels.rs#L80), [`ui/dr-ui/src/lib.rs:2028`](../ui/dr-ui/src/lib.rs#L2028), [`ui/dr-ui/src/lib.rs:3364`](../ui/dr-ui/src/lib.rs#L3364), [`ui/dr-ui/src/lib.rs:453`](../ui/dr-ui/src/lib.rs#L453), [`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:2301`](../ui/dr-ui/ui/app.slint#L2301), [`ui/dr-ui/ui/app.slint:2503`](../ui/dr-ui/ui/app.slint#L2503), [`ui/dr-ui/ui/app.slint:3079`](../ui/dr-ui/ui/app.slint#L3079), [`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:2366`](../core/dr-gpu/src/adjust.rs#L2366), [`core/dr-gpu/src/adjust.rs:2443`](../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:2528`](../core/dr-gpu/src/adjust.rs#L2528), [`core/dr-gpu/src/adjust.rs:54`](../core/dr-gpu/src/adjust.rs#L54), [`core/dr-gpu/src/adjust.rs:798`](../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:174`](../core/dr-gpu/src/lib.rs#L174), [`core/dr-gpu/src/lib.rs:194`](../core/dr-gpu/src/lib.rs#L194), [`core/dr-gpu/src/lib.rs:72`](../core/dr-gpu/src/lib.rs#L72), [`core/dr-gpu/src/lib.rs:95`](../core/dr-gpu/src/lib.rs#L95), [`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:922`](../core/dr-pipeline/src/graph.rs#L922), [`core/dr-pipeline/src/graph.rs:952`](../core/dr-pipeline/src/graph.rs#L952), [`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:4030`](../ui/dr-ui/src/develop.rs#L4030), [`ui/dr-ui/src/develop.rs:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:6068`](../ui/dr-ui/src/develop.rs#L6068), [`ui/dr-ui/src/develop.rs:7608`](../ui/dr-ui/src/develop.rs#L7608), [`ui/dr-ui/src/develop.rs:7642`](../ui/dr-ui/src/develop.rs#L7642), [`ui/dr-ui/src/lib.rs:100`](../ui/dr-ui/src/lib.rs#L100), [`ui/dr-ui/src/lib.rs:1026`](../ui/dr-ui/src/lib.rs#L1026), [`ui/dr-ui/src/lib.rs:1085`](../ui/dr-ui/src/lib.rs#L1085) | -| 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:527`](../core/dr-pipeline/src/operation.rs#L527), [`core/dr-types/src/colour.rs:1`](../core/dr-types/src/colour.rs#L1), [`ui/dr-ui/src/develop.rs:4060`](../ui/dr-ui/src/develop.rs#L4060), [`ui/dr-ui/src/develop.rs:9225`](../ui/dr-ui/src/develop.rs#L9225), [`ui/dr-ui/src/lib.rs:1974`](../ui/dr-ui/src/lib.rs#L1974), [`ui/dr-ui/src/lib.rs:3755`](../ui/dr-ui/src/lib.rs#L3755) | -| 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:4114`](../ui/dr-ui/src/develop.rs#L4114), [`ui/dr-ui/src/develop.rs:804`](../ui/dr-ui/src/develop.rs#L804), [`ui/dr-ui/src/develop.rs:8895`](../ui/dr-ui/src/develop.rs#L8895), [`ui/dr-ui/src/develop.rs:8927`](../ui/dr-ui/src/develop.rs#L8927), [`ui/dr-ui/src/histogram.rs:1`](../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:2108`](../ui/dr-ui/src/lib.rs#L2108), [`ui/dr-ui/src/lib.rs:430`](../ui/dr-ui/src/lib.rs#L430), [`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:4006`](../ui/dr-ui/src/develop.rs#L4006), [`ui/dr-ui/src/develop.rs:4060`](../ui/dr-ui/src/develop.rs#L4060), [`ui/dr-ui/src/develop.rs:9225`](../ui/dr-ui/src/develop.rs#L9225), [`ui/dr-ui/src/develop.rs:9271`](../ui/dr-ui/src/develop.rs#L9271), [`ui/dr-ui/src/develop.rs:9290`](../ui/dr-ui/src/develop.rs#L9290), [`ui/dr-ui/src/develop.rs:957`](../ui/dr-ui/src/develop.rs#L957), [`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:1910`](../ui/dr-ui/src/lib.rs#L1910), [`ui/dr-ui/src/lib.rs:1974`](../ui/dr-ui/src/lib.rs#L1974), [`ui/dr-ui/src/lib.rs:3662`](../ui/dr-ui/src/lib.rs#L3662), [`ui/dr-ui/src/lib.rs:3755`](../ui/dr-ui/src/lib.rs#L3755), [`ui/dr-ui/ui/app.slint:1981`](../ui/dr-ui/ui/app.slint#L1981), [`ui/dr-ui/ui/app.slint:64`](../ui/dr-ui/ui/app.slint#L64), [`ui/dr-ui/ui/settings.slint:165`](../ui/dr-ui/ui/settings.slint#L165), [`ui/dr-ui/ui/settings.slint:968`](../ui/dr-ui/ui/settings.slint#L968) | -| 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:157`](../core/dr-export/src/lib.rs#L157), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/lib.rs:57`](../core/dr-export/src/lib.rs#L57), [`core/dr-gpu/src/adjust.rs:2676`](../core/dr-gpu/src/adjust.rs#L2676), [`core/dr-pipeline/src/graph.rs:835`](../core/dr-pipeline/src/graph.rs#L835), [`core/dr-pipeline/src/graph.rs:966`](../core/dr-pipeline/src/graph.rs#L966), [`core/dr-pipeline/src/operation.rs:527`](../core/dr-pipeline/src/operation.rs#L527), [`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:963`](../core/dr-types/src/settings.rs#L963), [`ui/dr-ui/src/develop.rs:9290`](../ui/dr-ui/src/develop.rs#L9290), [`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:186`](../core/dr-export/src/lib.rs#L186), [`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:1008`](../core/dr-types/src/settings.rs#L1008), [`core/dr-types/src/settings.rs:1016`](../core/dr-types/src/settings.rs#L1016), [`core/dr-types/src/settings.rs:1032`](../core/dr-types/src/settings.rs#L1032), [`core/dr-types/src/settings.rs:1101`](../core/dr-types/src/settings.rs#L1101), [`core/dr-types/src/settings.rs:1129`](../core/dr-types/src/settings.rs#L1129), [`core/dr-types/src/settings.rs:1140`](../core/dr-types/src/settings.rs#L1140), [`core/dr-types/src/settings.rs:1146`](../core/dr-types/src/settings.rs#L1146), [`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), [`ui/dr-ui/src/settings_ui.rs:274`](../ui/dr-ui/src/settings_ui.rs#L274), [`ui/dr-ui/src/settings_ui.rs:287`](../ui/dr-ui/src/settings_ui.rs#L287), [`ui/dr-ui/src/settings_ui.rs:302`](../ui/dr-ui/src/settings_ui.rs#L302), [`ui/dr-ui/src/settings_ui.rs:701`](../ui/dr-ui/src/settings_ui.rs#L701), [`ui/dr-ui/ui/settings.slint:851`](../ui/dr-ui/ui/settings.slint#L851), [`ui/dr-ui/ui/settings.slint:861`](../ui/dr-ui/ui/settings.slint#L861) | -| 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:607`](../ui/dr-ui/src/lib.rs#L607), [`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:815`](../ui/dr-ui/src/settings_ui.rs#L815) | -| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1005`](../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:2813`](../ui/dr-ui/src/lib.rs#L2813), [`ui/dr-ui/src/lib.rs:607`](../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/lib.rs:653`](../ui/dr-ui/src/lib.rs#L653), [`ui/dr-ui/src/lib.rs:680`](../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library_ui.rs:4249`](../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8149`](../ui/dr-ui/src/library_ui.rs#L8149), [`ui/dr-ui/src/library_ui.rs:821`](../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8226`](../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8238`](../ui/dr-ui/src/library_ui.rs#L8238), [`ui/dr-ui/src/library_ui.rs:878`](../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1139`](../ui/dr-ui/ui/app.slint#L1139), [`ui/dr-ui/ui/app.slint:1716`](../ui/dr-ui/ui/app.slint#L1716), [`ui/dr-ui/ui/library.slint:1588`](../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4339`](../ui/dr-ui/ui/library.slint#L4339) | -| FR-EXP-8 | [`core/dr-decode/src/lib.rs:366`](../core/dr-decode/src/lib.rs#L366), [`core/dr-decode/src/lib.rs:390`](../core/dr-decode/src/lib.rs#L390), [`core/dr-decode/src/lib.rs:404`](../core/dr-decode/src/lib.rs#L404), [`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:1233`](../core/dr-decode/src/locate.rs#L1233), [`core/dr-decode/src/locate.rs:1292`](../core/dr-decode/src/locate.rs#L1292), [`core/dr-decode/src/locate.rs:359`](../core/dr-decode/src/locate.rs#L359), [`core/dr-decode/src/locate.rs:556`](../core/dr-decode/src/locate.rs#L556), [`core/dr-decode/src/locate.rs:640`](../core/dr-decode/src/locate.rs#L640), [`core/dr-decode/src/locate.rs:653`](../core/dr-decode/src/locate.rs#L653), [`core/dr-decode/src/locate.rs:736`](../core/dr-decode/src/locate.rs#L736), [`core/dr-export/examples/export.rs:99`](../core/dr-export/examples/export.rs#L99), [`core/dr-export/src/encode.rs:117`](../core/dr-export/src/encode.rs#L117), [`core/dr-export/src/encode.rs:161`](../core/dr-export/src/encode.rs#L161), [`core/dr-export/src/encode.rs:1`](../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/encode.rs:206`](../core/dr-export/src/encode.rs#L206), [`core/dr-export/src/encode.rs:235`](../core/dr-export/src/encode.rs#L235), [`core/dr-export/src/encode.rs:311`](../core/dr-export/src/encode.rs#L311), [`core/dr-export/src/encode.rs:325`](../core/dr-export/src/encode.rs#L325), [`core/dr-export/src/encode.rs:408`](../core/dr-export/src/encode.rs#L408), [`core/dr-export/src/encode.rs:456`](../core/dr-export/src/encode.rs#L456), [`core/dr-export/src/encode.rs:70`](../core/dr-export/src/encode.rs#L70), [`core/dr-export/src/encode.rs:795`](../core/dr-export/src/encode.rs#L795), [`core/dr-export/src/encode.rs:809`](../core/dr-export/src/encode.rs#L809), [`core/dr-export/src/encode.rs:850`](../core/dr-export/src/encode.rs#L850), [`core/dr-export/src/encode.rs:898`](../core/dr-export/src/encode.rs#L898), [`core/dr-export/src/exif.rs:1`](../core/dr-export/src/exif.rs#L1), [`core/dr-export/src/lib.rs:140`](../core/dr-export/src/lib.rs#L140), [`core/dr-export/src/metadata.rs:1`](../core/dr-export/src/metadata.rs#L1), [`core/dr-export/src/metadata.rs:41`](../core/dr-export/src/metadata.rs#L41), [`core/dr-export/src/metadata.rs:74`](../core/dr-export/src/metadata.rs#L74), [`core/dr-types/src/lib.rs:655`](../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:671`](../core/dr-types/src/settings.rs#L671), [`ui/dr-ui/src/develop.rs:4581`](../ui/dr-ui/src/develop.rs#L4581), [`ui/dr-ui/src/develop.rs:4693`](../ui/dr-ui/src/develop.rs#L4693), [`ui/dr-ui/src/develop.rs:729`](../ui/dr-ui/src/develop.rs#L729), [`ui/dr-ui/src/export.rs:474`](../ui/dr-ui/src/export.rs#L474), [`ui/dr-ui/src/export.rs:641`](../ui/dr-ui/src/export.rs#L641), [`ui/dr-ui/src/export.rs:687`](../ui/dr-ui/src/export.rs#L687), [`ui/dr-ui/src/export.rs:715`](../ui/dr-ui/src/export.rs#L715), [`ui/dr-ui/src/export.rs:839`](../ui/dr-ui/src/export.rs#L839), [`ui/dr-ui/src/export.rs:857`](../ui/dr-ui/src/export.rs#L857), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:291`](../ui/dr-ui/src/lib.rs#L291), [`ui/dr-ui/src/lib.rs:639`](../ui/dr-ui/src/lib.rs#L639), [`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:546`](../core/dr-decode/src/lib.rs#L546), [`core/dr-export/src/lib.rs:132`](../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1134`](../core/dr-gpu/src/adjust.rs#L1134), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/develop.rs:4714`](../ui/dr-ui/src/develop.rs#L4714), [`ui/dr-ui/src/develop.rs:4752`](../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:7111`](../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/lib.rs:607`](../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/library.rs:3889`](../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | -| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1576`](../ui/dr-ui/src/lib.rs#L1576), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1721`](../ui/dr-ui/ui/app.slint#L1721), [`ui/dr-ui/ui/app.slint:829`](../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/library.slint:1596`](../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4284`](../ui/dr-ui/ui/library.slint#L4284), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | -| FR-MRG-10 | [`core/dr-gpu/src/merge.rs:1`](../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../core/dr-gpu/src/shaders/merge.wgsl#L1), [`core/dr-pano/src/lib.rs:1`](../core/dr-pano/src/lib.rs#L1) | -| FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../core/dr-gpu/src/shaders/merge.wgsl#L1) | -| FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | -| FR-MRG-3 | [`core/dr-decode/examples/linear_dng.rs:1`](../core/dr-decode/examples/linear_dng.rs#L1), [`core/dr-decode/src/lib.rs:137`](../core/dr-decode/src/lib.rs#L137), [`core/dr-decode/src/lib.rs:144`](../core/dr-decode/src/lib.rs#L144), [`core/dr-decode/src/lib.rs:598`](../core/dr-decode/src/lib.rs#L598), [`core/dr-decode/src/profile.rs:395`](../core/dr-decode/src/profile.rs#L395), [`core/dr-export/src/dng.rs:1`](../core/dr-export/src/dng.rs#L1), [`core/dr-gpu/src/demosaic.rs:254`](../core/dr-gpu/src/demosaic.rs#L254), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1) | -| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4478`](../ui/dr-ui/src/library.rs#L4478), [`ui/dr-ui/src/library.rs:4482`](../ui/dr-ui/src/library.rs#L4482), [`ui/dr-ui/src/merge.rs:143`](../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../ui/dr-ui/ui/merge.slint#L46) | -| FR-MRG-5 | [`core/dr-pano/src/align.rs:1`](../core/dr-pano/src/align.rs#L1), [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | -| FR-MRG-6 | [`core/dr-pipeline/src/sidecar.rs:1033`](../core/dr-pipeline/src/sidecar.rs#L1033), [`core/dr-pipeline/src/sidecar.rs:113`](../core/dr-pipeline/src/sidecar.rs#L113), [`core/dr-pipeline/src/sidecar.rs:123`](../core/dr-pipeline/src/sidecar.rs#L123), [`core/dr-pipeline/src/sidecar.rs:2241`](../core/dr-pipeline/src/sidecar.rs#L2241), [`core/dr-pipeline/src/sidecar.rs:841`](../core/dr-pipeline/src/sidecar.rs#L841), [`ui/dr-ui/src/merge.rs:842`](../ui/dr-ui/src/merge.rs#L842) | -| FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:829`](../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/merge.slint:1`](../ui/dr-ui/ui/merge.slint#L1) | -| FR-MRG-8 | [`core/dr-pano/src/xfeat.rs:1`](../core/dr-pano/src/xfeat.rs#L1), [`core/dr-segment/examples/onnx_probe.rs:1`](../core/dr-segment/examples/onnx_probe.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:375`](../core/dr-sync/src/account.rs#L375), [`ui/dr-ui/src/launch.rs:316`](../ui/dr-ui/src/launch.rs#L316), [`ui/dr-ui/src/launch.rs:61`](../ui/dr-ui/src/launch.rs#L61), [`ui/dr-ui/src/launch_ui.rs:418`](../ui/dr-ui/src/launch_ui.rs#L418) | -| FR-NC-10 | [`core/dr-sync/src/account.rs:240`](../core/dr-sync/src/account.rs#L240), [`ui/dr-ui/src/export.rs:1`](../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:680`](../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library.rs:1234`](../ui/dr-ui/src/library.rs#L1234), [`ui/dr-ui/src/library.rs:2527`](../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:653`](../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:2057`](../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:4249`](../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:662`](../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/sidecar_cache.rs:1`](../ui/dr-ui/src/sidecar_cache.rs#L1) | -| FR-NC-12 | [`core/dr-sync-folder/src/lib.rs:1`](../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:1049`](../core/dr-sync-nextcloud/src/lib.rs#L1049), [`core/dr-sync-nextcloud/src/lib.rs:40`](../core/dr-sync-nextcloud/src/lib.rs#L40), [`core/dr-sync-nextcloud/src/provider.rs:1`](../core/dr-sync-nextcloud/src/provider.rs#L1), [`core/dr-sync/src/account.rs:1`](../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:87`](../core/dr-sync/src/account.rs#L87), [`core/dr-sync/src/lib.rs: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:317`](../ui/dr-ui/src/launch_ui.rs#L317), [`ui/dr-ui/src/remote.rs:1`](../ui/dr-ui/src/remote.rs#L1) | -| FR-NC-2 | [`core/dr-sync/src/account.rs:1`](../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:318`](../core/dr-sync/src/account.rs#L318), [`core/dr-sync/src/account.rs:375`](../core/dr-sync/src/account.rs#L375), [`core/dr-sync/src/account.rs:59`](../core/dr-sync/src/account.rs#L59), [`platform/dr-plat/src/secrets.rs:82`](../platform/dr-plat/src/secrets.rs#L82) | -| FR-NC-3 | [`core/dr-decode/src/locate.rs:1`](../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../core/dr-decode/src/preview.rs#L148), [`core/dr-sync/src/capability.rs:85`](../core/dr-sync/src/capability.rs#L85), [`core/dr-thumbs/src/lib.rs:1`](../core/dr-thumbs/src/lib.rs#L1), [`core/dr-types/src/place.rs:1`](../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/ui/app.slint:387`](../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435), [`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:129`](../core/dr-sync/src/scan.rs#L129), [`ui/dr-ui/src/launch.rs:61`](../ui/dr-ui/src/launch.rs#L61) | -| FR-NC-5 | [`core/dr-sync-nextcloud/src/propfind.rs:51`](../core/dr-sync-nextcloud/src/propfind.rs#L51), [`ui/dr-ui/src/import.rs: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:1182`](../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../core/dr-catalog/src/schema.rs#L1637), [`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:3032`](../ui/dr-ui/src/collections_ui.rs#L3032), [`ui/dr-ui/src/collections_ui.rs:3274`](../ui/dr-ui/src/collections_ui.rs#L3274), [`ui/dr-ui/src/collections_ui.rs:4175`](../ui/dr-ui/src/collections_ui.rs#L4175), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:2487`](../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:3852`](../ui/dr-ui/src/lib.rs#L3852), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:3892`](../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/library.rs:2173`](../ui/dr-ui/src/library.rs#L2173), [`ui/dr-ui/src/library.rs:2196`](../ui/dr-ui/src/library.rs#L2196), [`ui/dr-ui/src/library.rs:2471`](../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2652`](../ui/dr-ui/src/library.rs#L2652), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:1482`](../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6881`](../ui/dr-ui/src/library_ui.rs#L6881), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/library_ui.rs:709`](../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:1`](../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:1610`](../ui/dr-ui/ui/app.slint#L1610), [`ui/dr-ui/ui/app.slint:3163`](../ui/dr-ui/ui/app.slint#L3163), [`ui/dr-ui/ui/app.slint:541`](../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/app.slint:549`](../ui/dr-ui/ui/app.slint#L549), [`ui/dr-ui/ui/app.slint:555`](../ui/dr-ui/ui/app.slint#L555), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | -| FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1711`](../ui/dr-ui/src/library_ui.rs#L1711), [`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:4175`](../ui/dr-ui/src/collections_ui.rs#L4175), [`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:1042`](../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library.rs:1084`](../ui/dr-ui/src/library.rs#L1084), [`ui/dr-ui/src/library.rs:2293`](../ui/dr-ui/src/library.rs#L2293), [`ui/dr-ui/src/library.rs:2383`](../ui/dr-ui/src/library.rs#L2383), [`ui/dr-ui/src/library.rs:4060`](../ui/dr-ui/src/library.rs#L4060), [`ui/dr-ui/src/library_ui.rs:1482`](../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../ui/dr-ui/src/repairs.rs#L1140), [`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:120`](../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:4515`](../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/ui/settings.slint:435`](../ui/dr-ui/ui/settings.slint#L435) | -| FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs: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:1559`](../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../ui/dr-ui/src/lib.rs#L1559) | -| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7572`](../ui/dr-ui/src/library.rs#L7572), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336) | -| 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:929`](../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../core/dr-sync/src/scan.rs#L926), [`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:1070`](../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:73`](../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7404`](../ui/dr-ui/src/library.rs#L7404), [`ui/dr-ui/src/library.rs:7572`](../ui/dr-ui/src/library.rs#L7572), [`ui/dr-ui/src/library.rs:824`](../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../ui/dr-ui/src/xmp_sync.rs#L287) | -| 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:211`](../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../core/dr-sync/src/scan.rs#L519), [`core/dr-sync/src/scan.rs:545`](../core/dr-sync/src/scan.rs#L545), [`core/dr-sync/src/scan.rs:574`](../core/dr-sync/src/scan.rs#L574), [`ui/dr-ui/src/library.rs:1355`](../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:2019`](../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library_ui.rs:1310`](../ui/dr-ui/src/library_ui.rs#L1310), [`ui/dr-ui/src/library_ui.rs:1406`](../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:2005`](../ui/dr-ui/src/library_ui.rs#L2005), [`ui/dr-ui/src/library_ui.rs:328`](../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:573`](../ui/dr-ui/src/library_ui.rs#L573) | -| 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:1057`](../core/dr-gpu/src/adjust.rs#L1057), [`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:4554`](../ui/dr-ui/src/develop.rs#L4554), [`ui/dr-ui/src/identity_ui.rs:125`](../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:1377`](../ui/dr-ui/src/lib.rs#L1377), [`ui/dr-ui/src/lib.rs:1862`](../ui/dr-ui/src/lib.rs#L1862), [`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:441`](../apps/darkroom-android/src/lib.rs#L441) | -| FR-PLAT-LIN-1 | [`core/dr-types/src/settings.rs:1`](../core/dr-types/src/settings.rs#L1), [`platform/dr-plat/src/dirs.rs:1`](../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/storage.rs:344`](../platform/dr-plat/src/storage.rs#L344), [`ui/dr-ui/src/lib.rs:1166`](../ui/dr-ui/src/lib.rs#L1166), [`ui/dr-ui/src/preset_store.rs:1`](../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/settings_store.rs:1`](../ui/dr-ui/src/settings_store.rs#L1) | -| FR-PLAT-LIN-2 | [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../platform/dr-plat/src/display/x11.rs#L1) | -| FR-PLAT-WIN-1 | [`platform/dr-plat/src/dirs.rs:1`](../platform/dr-plat/src/dirs.rs#L1) | -| FR-PLAT-WIN-2 | [`apps/darkroom-desktop/build.rs:1`](../apps/darkroom-desktop/build.rs#L1), [`apps/darkroom-desktop/src/main.rs:6`](../apps/darkroom-desktop/src/main.rs#L6), [`ui/dr-ui/src/launch_ui.rs:820`](../ui/dr-ui/src/launch_ui.rs#L820) | -| FR-PLAT-WIN-3 | [`apps/darkroom-desktop/src/main.rs:19`](../apps/darkroom-desktop/src/main.rs#L19) | -| FR-RAW-1 | [`core/dr-decode/src/lib.rs:259`](../core/dr-decode/src/lib.rs#L259), [`core/dr-types/src/lib.rs:132`](../core/dr-types/src/lib.rs#L132), [`core/dr-types/src/lib.rs:203`](../core/dr-types/src/lib.rs#L203) | -| FR-RAW-3 | [`core/dr-decode/src/lib.rs:155`](../core/dr-decode/src/lib.rs#L155), [`core/dr-decode/src/lib.rs:546`](../core/dr-decode/src/lib.rs#L546), [`core/dr-decode/src/locate.rs:1435`](../core/dr-decode/src/locate.rs#L1435) | -| FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:268`](../ui/dr-ui/src/lib.rs#L268) | -| FR-RAW-5 | [`core/dr-decode/src/lib.rs:183`](../core/dr-decode/src/lib.rs#L183), [`core/dr-gpu/src/demosaic.rs:34`](../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:734`](../core/dr-gpu/src/demosaic.rs#L734), [`core/dr-gpu/src/demosaic.rs:813`](../core/dr-gpu/src/demosaic.rs#L813), [`core/dr-gpu/src/demosaic.rs:937`](../core/dr-gpu/src/demosaic.rs#L937) | -| FR-UI-1 | [`core/dr-types/src/settings.rs:1377`](../core/dr-types/src/settings.rs#L1377), [`core/dr-types/src/settings.rs:492`](../core/dr-types/src/settings.rs#L492), [`core/dr-types/src/settings.rs:512`](../core/dr-types/src/settings.rs#L512), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/lib.rs:123`](../ui/dr-ui/src/lib.rs#L123), [`ui/dr-ui/src/lib.rs:145`](../ui/dr-ui/src/lib.rs#L145), [`ui/dr-ui/src/lib.rs:2711`](../ui/dr-ui/src/lib.rs#L2711), [`ui/dr-ui/src/lib.rs:4043`](../ui/dr-ui/src/lib.rs#L4043), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/src/lib.rs:4089`](../ui/dr-ui/src/lib.rs#L4089), [`ui/dr-ui/src/lib.rs:4140`](../ui/dr-ui/src/lib.rs#L4140), [`ui/dr-ui/src/lib.rs:4173`](../ui/dr-ui/src/lib.rs#L4173), [`ui/dr-ui/src/masks_ui.rs:1471`](../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/settings_ui.rs:179`](../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:1010`](../ui/dr-ui/ui/app.slint#L1010), [`ui/dr-ui/ui/app.slint:2842`](../ui/dr-ui/ui/app.slint#L2842), [`ui/dr-ui/ui/app.slint:906`](../ui/dr-ui/ui/app.slint#L906), [`ui/dr-ui/ui/identity.slint:246`](../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`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:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/gestures.rs:1`](../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:108`](../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../ui/dr-ui/ui/app.slint#L994), [`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:2628`](../ui/dr-ui/ui/library.slint#L2628), [`ui/dr-ui/ui/library.slint:4377`](../ui/dr-ui/ui/library.slint#L4377), [`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:136`](../ui/dr-ui/ui/settings.slint#L136) | -| 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:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`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:2859`](../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../ui/dr-ui/ui/masks.slint#L1216), [`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:126`](../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:1288`](../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:1928`](../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:2064`](../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2091`](../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:209`](../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2207`](../ui/dr-ui/src/collections_ui.rs#L2207), [`ui/dr-ui/src/collections_ui.rs:2793`](../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:3300`](../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:3688`](../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/collections_ui.rs:3725`](../ui/dr-ui/src/collections_ui.rs#L3725), [`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:5325`](../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../ui/dr-ui/ui/app.slint#L712), [`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:2628`](../ui/dr-ui/ui/library.slint#L2628), [`ui/dr-ui/ui/library.slint:4231`](../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:4377`](../ui/dr-ui/ui/library.slint#L4377), [`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), [`ui/dr-ui/ui/settings.slint:114`](../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../ui/dr-ui/ui/settings.slint#L656) | -| 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:3329`](../ui/dr-ui/src/lib.rs#L3329), [`ui/dr-ui/src/lib.rs:4237`](../ui/dr-ui/src/lib.rs#L4237), [`ui/dr-ui/src/lib.rs:4428`](../ui/dr-ui/src/lib.rs#L4428), [`ui/dr-ui/src/masks_ui.rs:1518`](../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2569`](../ui/dr-ui/ui/app.slint#L2569), [`ui/dr-ui/ui/app.slint:2609`](../ui/dr-ui/ui/app.slint#L2609), [`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:492`](../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop.rs:1330`](../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/lib.rs:4062`](../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/ui/adjust.slint:974`](../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2325`](../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/settings.slint:681`](../ui/dr-ui/ui/settings.slint#L681), [`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:216`](../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4726`](../ui/dr-ui/src/library.rs#L4726), [`ui/dr-ui/src/library.rs:5494`](../ui/dr-ui/src/library.rs#L5494), [`ui/dr-ui/src/library.rs:5560`](../ui/dr-ui/src/library.rs#L5560), [`ui/dr-ui/src/library_ui.rs:1007`](../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../ui/dr-ui/src/library_ui.rs#L968), [`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:2742`](../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:2780`](../ui/dr-ui/ui/app.slint#L2780) | -| 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/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1) | -| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1822`](../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/src/lib.rs:2847`](../ui/dr-ui/src/lib.rs#L2847), [`ui/dr-ui/ui/app.slint:1150`](../ui/dr-ui/ui/app.slint#L1150), [`ui/dr-ui/ui/library.slint:4339`](../ui/dr-ui/ui/library.slint#L4339) | -| 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:521`](../ui/dr-ui/src/export.rs#L521) | -| NFR-COMPAT-1 | [`core/dr-gpu/src/lib.rs:286`](../core/dr-gpu/src/lib.rs#L286) | -| NFR-OPS-1 | [`core/dr-gpu/src/lib.rs:339`](../core/dr-gpu/src/lib.rs#L339), [`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:1241`](../ui/dr-ui/src/lib.rs#L1241), [`ui/dr-ui/ui/app.slint:1473`](../ui/dr-ui/ui/app.slint#L1473), [`ui/dr-ui/ui/app.slint:75`](../ui/dr-ui/ui/app.slint#L75), [`ui/dr-ui/ui/settings.slint:1015`](../ui/dr-ui/ui/settings.slint#L1015), [`ui/dr-ui/ui/settings.slint:154`](../ui/dr-ui/ui/settings.slint#L154) | -| 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:4238`](../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/lib.rs:2153`](../ui/dr-ui/src/lib.rs#L2153) | -| NFR-P3 | [`tools/bench/src/thumbnails.rs:1`](../tools/bench/src/thumbnails.rs#L1) | -| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4833`](../ui/dr-ui/src/library.rs#L4833), [`ui/dr-ui/src/library.rs:5996`](../ui/dr-ui/src/library.rs#L5996), [`ui/dr-ui/src/library_ui.rs:5005`](../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../ui/dr-ui/src/library_ui.rs#L64) | -| NFR-P9 | [`core/dr-catalog/src/schema.rs:917`](../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/references.rs:1`](../core/dr-face/src/references.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1`](../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/export.rs:1005`](../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/library.rs:1`](../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library_ui.rs:1`](../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/trash.rs:1`](../ui/dr-ui/src/trash.rs#L1) | -| NFR-PORT-1 | [`core/dr-catalog/src/walk.rs:1`](../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:272`](../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../core/dr-types/src/lib.rs#L305), [`platform/dr-plat/src/dirs.rs:1`](../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/display.rs:1`](../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/storage.rs:1`](../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:287`](../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:344`](../platform/dr-plat/src/storage.rs#L344), [`platform/dr-plat/src/volumes.rs:1`](../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../platform/dr-plat/src/volumes.rs#L62) | -| NFR-PORT-2 | [`core/dr-gpu/src/lib.rs:1`](../core/dr-gpu/src/lib.rs#L1) | -| NFR-PORT-3 | [`platform/dr-plat/src/storage.rs:1`](../platform/dr-plat/src/storage.rs#L1) | -| NFR-R1 | [`core/dr-catalog/src/schema.rs:361`](../core/dr-catalog/src/schema.rs#L361), [`core/dr-catalog/src/sync.rs:1`](../core/dr-catalog/src/sync.rs#L1), [`core/dr-gpu/src/lib.rs:194`](../core/dr-gpu/src/lib.rs#L194), [`core/dr-sync/src/account.rs:240`](../core/dr-sync/src/account.rs#L240), [`ui/dr-ui/src/library.rs:1234`](../ui/dr-ui/src/library.rs#L1234) | -| NFR-R2 | [`core/dr-catalog/src/recovery.rs:1`](../core/dr-catalog/src/recovery.rs#L1), [`core/dr-catalog/src/recovery.rs:222`](../core/dr-catalog/src/recovery.rs#L222), [`core/dr-catalog/src/sync.rs:61`](../core/dr-catalog/src/sync.rs#L61), [`core/dr-catalog/src/trash.rs:1`](../core/dr-catalog/src/trash.rs#L1), [`ui/dr-ui/src/derived_sync.rs:613`](../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:736`](../ui/dr-ui/src/derived_sync.rs#L736), [`ui/dr-ui/src/library_ui.rs:4174`](../ui/dr-ui/src/library_ui.rs#L4174), [`ui/dr-ui/src/library_ui.rs:4492`](../ui/dr-ui/src/library_ui.rs#L4492) | -| NFR-R3 | [`core/dr-decode/src/error.rs:30`](../core/dr-decode/src/error.rs#L30) | -| NFR-R4 | [`core/dr-types/src/settings.rs:92`](../core/dr-types/src/settings.rs#L92), [`ui/dr-ui/src/library.rs:1627`](../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library_ui.rs:3427`](../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:392`](../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/settings_ui.rs:540`](../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/ui/settings.slint:1093`](../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../ui/dr-ui/ui/settings.slint#L199) | -| NFR-R5 | [`core/dr-catalog/src/collections.rs:1`](../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/error.rs:1`](../core/dr-catalog/src/error.rs#L1), [`core/dr-catalog/src/keywords.rs:1`](../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/schema.rs:1`](../core/dr-catalog/src/schema.rs#L1) | -| NFR-R6 | [`core/dr-catalog/src/error.rs:1`](../core/dr-catalog/src/error.rs#L1), [`core/dr-catalog/src/lib.rs:255`](../core/dr-catalog/src/lib.rs#L255), [`core/dr-catalog/src/recovery.rs:1`](../core/dr-catalog/src/recovery.rs#L1) | -| NFR-R7 | [`core/dr-gpu/src/error.rs:1`](../core/dr-gpu/src/error.rs#L1) | -| NFR-R8 | [`core/dr-gpu/src/error.rs:1`](../core/dr-gpu/src/error.rs#L1) | -| NFR-RES-1 | [`core/dr-gpu/src/adjust.rs:1057`](../core/dr-gpu/src/adjust.rs#L1057), [`core/dr-pipeline/src/history.rs:86`](../core/dr-pipeline/src/history.rs#L86), [`ui/dr-ui/src/develop.rs:4554`](../ui/dr-ui/src/develop.rs#L4554), [`ui/dr-ui/src/identity_ui.rs:125`](../ui/dr-ui/src/identity_ui.rs#L125), [`ui/dr-ui/src/lib.rs:100`](../ui/dr-ui/src/lib.rs#L100), [`ui/dr-ui/src/memory.rs:1`](../ui/dr-ui/src/memory.rs#L1) | -| NFR-RES-2 | [`ui/dr-ui/src/faces.rs:462`](../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/library.rs:3624`](../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/repairs.rs:1140`](../ui/dr-ui/src/repairs.rs#L1140), [`ui/dr-ui/src/repairs.rs:1`](../ui/dr-ui/src/repairs.rs#L1) | -| NFR-RES-4 | [`core/dr-catalog/src/cache.rs:1`](../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/face_shard.rs:1`](../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-catalog/src/schema.rs:1182`](../core/dr-catalog/src/schema.rs#L1182), [`core/dr-gpu/src/lib.rs:95`](../core/dr-gpu/src/lib.rs#L95), [`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:393`](../core/dr-thumbs/src/lib.rs#L393) | -| NFR-SEC-1 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../core/dr-decode/src/error.rs#L30) | -| NFR-SEC-2 | [`core/dr-sync/src/account.rs:318`](../core/dr-sync/src/account.rs#L318), [`platform/dr-plat/src/crash.rs:1`](../platform/dr-plat/src/crash.rs#L1), [`platform/dr-plat/src/diagnostics.rs:1`](../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/diagnostics/redact.rs:1`](../platform/dr-plat/src/diagnostics/redact.rs#L1), [`platform/dr-plat/src/secrets.rs:82`](../platform/dr-plat/src/secrets.rs#L82) | -| 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-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:1011`](../core/dr-catalog/src/schema.rs#L1011), [`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:368`](../core/dr-gpu/src/lib.rs#L368) | -| R5 | [`core/dr-gpu/tests/zoom_resolution.rs:1`](../core/dr-gpu/tests/zoom_resolution.rs#L1) | -| R6 | [`core/dr-sync-nextcloud/src/lib.rs:1`](../core/dr-sync-nextcloud/src/lib.rs#L1) | - -## Deferred (post-v1) - -Defined in `requirements.md` and marked `(post-v1)` on the defining line. Not in the denominator; a tag naming one is recorded here rather than counted. - -- FR-PLG-1 -- FR-PLG-10 -- FR-PLG-11 -- FR-PLG-12 -- FR-PLG-1a -- FR-PLG-2 — tagged in [`core/dr-pipeline/src/declared/decl.rs:1`](../core/dr-pipeline/src/declared/decl.rs#L1), [`core/dr-pipeline/src/declared/expr.rs:152`](../core/dr-pipeline/src/declared/expr.rs#L152), [`core/dr-pipeline/src/declared/expr.rs:1`](../core/dr-pipeline/src/declared/expr.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:1`](../core/dr-pipeline/src/declared/mod.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:82`](../core/dr-pipeline/src/declared/mod.rs#L82), [`core/dr-pipeline/src/descriptor.rs:15`](../core/dr-pipeline/src/descriptor.rs#L15), [`core/dr-pipeline/src/descriptor.rs:734`](../core/dr-pipeline/src/descriptor.rs#L734), [`core/dr-pipeline/src/operation.rs:232`](../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/tests/declared_parity.rs:1`](../core/dr-pipeline/tests/declared_parity.rs#L1), [`core/dr-pipeline/tests/declared_parity.rs:240`](../core/dr-pipeline/tests/declared_parity.rs#L240), [`core/dr-pipeline/tests/declared_parity.rs:305`](../core/dr-pipeline/tests/declared_parity.rs#L305), [`core/dr-pipeline/tests/declared_parity.rs:358`](../core/dr-pipeline/tests/declared_parity.rs#L358), [`core/dr-pipeline/tests/declared_parity.rs:418`](../core/dr-pipeline/tests/declared_parity.rs#L418) -- FR-PLG-2a -- FR-PLG-2b -- FR-PLG-2c -- FR-PLG-2d — tagged in [`core/dr-pipeline/src/declared/decl.rs:112`](../core/dr-pipeline/src/declared/decl.rs#L112), [`core/dr-pipeline/src/declared/decl.rs:154`](../core/dr-pipeline/src/declared/decl.rs#L154), [`core/dr-pipeline/src/declared/decl.rs:1`](../core/dr-pipeline/src/declared/decl.rs#L1), [`core/dr-pipeline/src/declared/decl.rs:422`](../core/dr-pipeline/src/declared/decl.rs#L422), [`core/dr-pipeline/src/declared/decl.rs:67`](../core/dr-pipeline/src/declared/decl.rs#L67), [`core/dr-pipeline/src/declared/mod.rs:1`](../core/dr-pipeline/src/declared/mod.rs#L1), [`core/dr-pipeline/src/declared/mod.rs:384`](../core/dr-pipeline/src/declared/mod.rs#L384), [`core/dr-pipeline/src/declared/mod.rs:403`](../core/dr-pipeline/src/declared/mod.rs#L403) -- FR-PLG-3 -- FR-PLG-3a -- FR-PLG-4 -- FR-PLG-4a -- FR-PLG-5 -- FR-PLG-5a -- FR-PLG-5b -- FR-PLG-5c -- FR-PLG-6 -- FR-PLG-6a -- FR-PLG-7 -- FR-PLG-8 — tagged in [`core/dr-pipeline/src/sidecar.rs:2345`](../core/dr-pipeline/src/sidecar.rs#L2345), [`core/dr-pipeline/src/sidecar.rs:2378`](../core/dr-pipeline/src/sidecar.rs#L2378) -- FR-PLG-9 -- NFR-SEC-6 - -## Not yet tagged - -30 of 184 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built. - -
Show untagged requirements - -- FR-CAT-14 -- FR-CULL-6 -- FR-CULL-7 -- FR-DEV-3g -- FR-DSP-2 -- FR-DSP-4 -- FR-MRG-9 -- FR-NC-11 -- FR-PLAT-AND-1 -- FR-PLAT-LIN-3 -- FR-RAW-2 -- NFR-A11Y-1 -- NFR-ARCH-1 -- NFR-COMPAT-2 -- NFR-MRG-1 -- NFR-MRG-2 -- NFR-OPS-4 -- NFR-P10 -- NFR-P11 -- NFR-P12 -- NFR-P15 -- NFR-P2 -- NFR-P4 -- NFR-P6 -- NFR-P7 -- NFR-P8 -- NFR-RES-3 -- R1 -- R2 -- R7 - -
diff --git a/models/LICENCE.md b/models/LICENCE.md index d83ce32..e6aaa64 100644 --- a/models/LICENCE.md +++ b/models/LICENCE.md @@ -39,11 +39,11 @@ bite the moment any hosted or server-side rendering appeared, and that is the thing to remember rather than rediscover. This was decided deliberately (D14), not arrived at by accident, and -`docs/segmentation.md` §7 records the reasoning. +`docs/dev/segmentation.md` §7 records the reasoning. ## Class vocabulary — a caveat worth reading -`docs/segmentation.md` §4 specified YOLO **pretrained on ADE20K**, whose 150 +`docs/dev/segmentation.md` §4 specified YOLO **pretrained on ADE20K**, whose 150 classes include the *stuff* categories that matter most in photography — sky, vegetation, water, wall, mountain. @@ -108,7 +108,7 @@ the dataset licence restricts models trained on it by name. The bare 512 generator at a fixed `1×4×512×512`, six operator types; the tiling, the context and the blend are Rust (`dr_pano::fill`). Since -2026-09-20 the shipped file is the fine-tune (`docs/panorama.md` §14), +2026-09-20 the shipped file is the fine-tune (`docs/dev/panorama.md` §14), exported by `python -m infill.export` in `darkroom-infill`; `tools/export-migan.sh` still produces the stock generator from the upstream checkpoint, which the fine-tune starts from. The fine-tuned weights are a diff --git a/models/face/README.md b/models/face/README.md index ddb9674..b253ba4 100644 --- a/models/face/README.md +++ b/models/face/README.md @@ -29,7 +29,7 @@ directory as the pair, so a hand-placed pair does not pick up a package's eye mo directory it otherwise outranks. scrfd_500m_640.int8.onnx 0.8 MB the same three, in the form the Hexagon NPU takes - scrfd_2.5g_640.int8.onnx 0.9 MB (docs/inference.md §5) — opset 17, per-channel int8 + scrfd_2.5g_640.int8.onnx 0.9 MB (docs/dev/inference.md §5) — opset 17, per-channel int8 scrfd_10g_640.int8.onnx 4.3 MB weights, uint8 activations, calibrated on 96 photographs The int8 files are **derived** by `tools/quantise-models.sh` from the f32 ones beside them and @@ -53,12 +53,12 @@ cannot parse any of the graphs while they are dynamic: ./tools/fix-face-model-shapes.sh 2d106det.onnx models/face/2d106det_b1.onnx --dim None=1 `2d106det_b1.onnx` is from the same `buffalo_l.zip` as `det_10g.onnx` and under the same grant: the -106-point landmark model whose lid contours the eye boxes are cut from (docs/faces.md §17.2). +106-point landmark model whose lid contours the eye boxes are cut from (docs/dev/faces.md §17.2). sha256 as fetched `f001b856…a7109dbf`, as shipped `afc2984c…03368ef26`. The weights carry a non-commercial research-only grant. They are here because this is a private repository and self-installed builds; they come back out before anything is published, and the -restriction binds whoever uses the app, not only the project. docs/faces.md §2.2a is the decision. +restriction binds whoever uses the app, not only the project. docs/dev/faces.md §2.2a is the decision. ## The two classifiers are a different matter @@ -96,4 +96,4 @@ Attribution, as ODC-By asks for the eye dataset: The variant choice was measured, not taken from the F1 column: on family snapshots the S variant of OCEC read more open eyes as open than M or L did, which overfit their own domain -(docs/faces.md §17). +(docs/dev/faces.md §17). diff --git a/packaging/PKGBUILD b/packaging/PKGBUILD index 7f35768..966fd8e 100644 --- a/packaging/PKGBUILD +++ b/packaging/PKGBUILD @@ -67,7 +67,7 @@ package() { # pointers here. Installing one produces a package whose face indexing # fails inside the graph loader on the user's machine, so refuse instead. # - # The last three are the eye-state models (docs/faces.md §17): landmarks, + # The last three are the eye-state models (docs/dev/faces.md §17): landmarks, # open/closed, sunglasses. Optional to the app, which indexes without # them, but shipped beside the pair so the eyes-open filter works out of # the box. diff --git a/packaging/flatpak/paris.tourolle.darkroom.yml b/packaging/flatpak/paris.tourolle.darkroom.yml index e94d9b2..4df2803 100644 --- a/packaging/flatpak/paris.tourolle.darkroom.yml +++ b/packaging/flatpak/paris.tourolle.darkroom.yml @@ -8,7 +8,7 @@ # flatpak-builder --user --install --force-clean \ # build/flatpak packaging/flatpak/paris.tourolle.darkroom.yml # -# Read docs/distribution.md before changing any permission below. Every line in +# Read docs/dev/distribution.md before changing any permission below. Every line in # `finish-args` is a hole in the sandbox, and the one that is conspicuously # absent — `--filesystem=` — is absent on purpose and is explained there. id: paris.tourolle.darkroom @@ -99,7 +99,7 @@ finish-args: # honest error. # # `--filesystem=host` would make that work today and is exactly what the - # requirement forbids, so it is not here. docs/distribution.md §4 records what + # requirement forbids, so it is not here. docs/dev/distribution.md §4 records what # closes the gap and how to run a Flatpak build in the meantime. modules: diff --git a/packaging/windows/darkroom.nsi b/packaging/windows/darkroom.nsi index f6dcbb3..05c97d8 100644 --- a/packaging/windows/darkroom.nsi +++ b/packaging/windows/darkroom.nsi @@ -1,6 +1,6 @@ ; DarkRoom — Windows installer ; -; Built by docker/windows/package.sh with makensis on Linux; see docs/windows.md +; Built by docker/windows/package.sh with makensis on Linux; see docs/dev/windows.md ; §5 for every decision below. Nothing here is Windows-specific to *write* — ; NSIS has always compiled on POSIX hosts. ; @@ -34,7 +34,7 @@ SetCompressor /SOLID lzma Name "${NAME} ${VERSION}" OutFile "${OUT}" -; Per-user, no elevation (docs/windows.md §5.1). An unsigned installer that +; Per-user, no elevation (docs/dev/windows.md §5.1). An unsigned installer that ; also asks for administrator rights is the most alarming thing Windows can ; show, and a per-user install keeps the binaries under the same account as ; the library the application builds. @@ -105,7 +105,7 @@ FunctionEnd Section "Uninstall" ; What the installer wrote, and nothing the application wrote - ; (docs/windows.md §5.3): %LOCALAPPDATA%\darkroom and %APPDATA%\darkroom — + ; (docs/dev/windows.md §5.3): %LOCALAPPDATA%\darkroom and %APPDATA%\darkroom — ; the catalog, the thumbnails, the face index, the settings — stay. An ; uninstaller that deletes a library index the user spent two hours ; building is the destructive default this project argues against diff --git a/tools/bench/Cargo.toml b/tools/bench/Cargo.toml index 2ed24d8..8f5ad19 100644 --- a/tools/bench/Cargo.toml +++ b/tools/bench/Cargo.toml @@ -13,7 +13,7 @@ license.workspace = true # into a job that has no adapter to use them with, and adding `dr-ui` would # pull Slint. The GPU half of the suite is `dr-gpu`'s own frame-budget test, # which already exists and already skips itself where there is no device — see -# `docs/benchmarks.md`. +# `docs/dev/benchmarks.md`. [dependencies] dr-types.workspace = true dr-catalog.workspace = true diff --git a/tools/bench/src/baseline.rs b/tools/bench/src/baseline.rs index d8321b1..0cf2ab6 100644 --- a/tools/bench/src/baseline.rs +++ b/tools/bench/src/baseline.rs @@ -1,6 +1,6 @@ //! The committed numbers, and what counts as a regression against them. //! -//! `docs/frame-budget.md` commits its measurements by hand and says why: *"a +//! `docs/dev/frame-budget.md` commits its measurements by hand and says why: *"a //! regression should be a diff rather than somebody's memory."* This is the //! same idea in a form a program can read, because §8 asks for more than a //! record — *"a regression beyond stated tolerance fails the build"*. @@ -80,7 +80,7 @@ pub struct Metric { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Baseline { /// Prose for whoever opens the JSON first. Kept in the file rather than - /// only in `docs/benchmarks.md`, because the person who finds this in a + /// only in `docs/dev/benchmarks.md`, because the person who finds this in a /// failing CI log is not reading the docs directory at that moment. #[serde(rename = "_readme")] pub readme: Vec, @@ -173,15 +173,15 @@ impl Baseline { /// Where the committed baseline lives, found the way `tools/traceability` /// finds the repo root: by walking up from this crate's manifest until - /// `docs/requirements.md` appears. + /// `docs/dev/requirements.md` appears. pub fn default_path() -> Result { let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - while !dir.join("docs/requirements.md").exists() { + while !dir.join("docs/dev/requirements.md").exists() { if !dir.pop() { anyhow::bail!("could not locate the repo root above this crate"); } } - Ok(dir.join("docs/bench-baseline.json")) + Ok(dir.join("docs/dev/bench-baseline.json")) } } diff --git a/tools/bench/src/exporting.rs b/tools/bench/src/exporting.rs index 16dcc6e..4ba08e4 100644 --- a/tools/bench/src/exporting.rs +++ b/tools/bench/src/exporting.rs @@ -16,7 +16,7 @@ //! //! That is a deliberate refusal rather than an oversight. `CONTRIBUTING.md` //! asks that a requirement be closed by a test that would fail if the -//! behaviour were removed, and `docs/code-health.md` CH-4 records what the +//! behaviour were removed, and `docs/dev/code-health.md` CH-4 records what the //! coverage figure looks like when tags are hung on plumbing instead. A tag //! here would say the export budget is checked; the GPU half of it would still //! be unchecked. @@ -26,7 +26,7 @@ //! It is a **one-sided** gate, and that is worth having. The encode half is a //! lower bound on the whole: if resizing, sharpening and encoding 24 MP alone //! take longer than two seconds, NFR-P7 is violated no matter how fast the -//! render is. So the budget in `docs/bench-baseline.json` is the requirement's +//! render is. So the budget in `docs/dev/bench-baseline.json` is the requirement's //! own 2000 ms, and exceeding it fails the build honestly. Coming in under it //! proves nothing about the requirement, and the report says so rather than //! printing a tick. @@ -64,7 +64,7 @@ const RUNS: usize = 5; /// A row of the export table. pub struct EncodeRun { - /// The name this row carries in `docs/bench-baseline.json`. + /// The name this row carries in `docs/dev/bench-baseline.json`. pub key: &'static str, pub label: &'static str, pub width: u32, diff --git a/tools/bench/src/fixture.rs b/tools/bench/src/fixture.rs index fa292d3..a57a3ee 100644 --- a/tools/bench/src/fixture.rs +++ b/tools/bench/src/fixture.rs @@ -1,6 +1,6 @@ //! The synthetic 50k catalog, and the handful of real files it points at. //! -//! `docs/requirements.md` §8 asks for "an automated benchmark suite against a +//! `docs/dev/requirements.md` §8 asks for "an automated benchmark suite against a //! synthetic 50k catalog". The hard part of that sentence is *50k*: a real //! library of that size is several terabytes and cannot live in a repository, //! in a CI cache, or on a laptop that also has to compile the thing. diff --git a/tools/bench/src/main.rs b/tools/bench/src/main.rs index 48f13da..89f56bb 100644 --- a/tools/bench/src/main.rs +++ b/tools/bench/src/main.rs @@ -1,4 +1,4 @@ -//! The benchmark suite `docs/requirements.md` §8 has been promising. +//! The benchmark suite `docs/dev/requirements.md` §8 has been promising. //! //! §8 says performance is verified by *"an automated benchmark suite against a //! synthetic 50k catalog, run per-commit … A regression beyond stated @@ -191,17 +191,17 @@ enum Mode { fn print_help() { println!( "\ -dr-bench — DarkRoom's performance suite (docs/requirements.md §8) +dr-bench — DarkRoom's performance suite (docs/dev/requirements.md §8) run measure and print, judging nothing check measure, print, and exit 1 on a violated budget or a regression - record measure and rewrite docs/bench-baseline.json from the result + record measure and rewrite docs/dev/bench-baseline.json from the result Flags: --reference this machine is the reference desktop, so machine-sensitive budgets are asserted rather than reported --fixture where the synthetic 50k catalog lives (or $DR_BENCH_DIR) - --baseline the committed numbers (default docs/bench-baseline.json) + --baseline the committed numbers (default docs/dev/bench-baseline.json) --lanes sweep lanes for the thumbnail row (default: CPU threads) --thumbnails images in the thumbnail row (default 1200) @@ -307,8 +307,8 @@ fn measure_and_report( } println!(); println!( - " {} gate(s) failed. docs/benchmarks.md says what each metric measures and\n \ - docs/bench-baseline.json holds the numbers these used to be.", + " {} gate(s) failed. docs/dev/benchmarks.md says what each metric measures and\n \ + docs/dev/bench-baseline.json holds the numbers these used to be.", failures.len() ); Ok(mode != Mode::Gate) @@ -453,7 +453,7 @@ fn print_verdict( machine: &str, comparable_fixture: bool, ) -> Vec { - println!("Against docs/bench-baseline.json"); + println!("Against docs/dev/bench-baseline.json"); match (&base.recorded_on, cx.same_machine) { (None, _) => println!( " No baseline has been recorded yet. Budgets are still gated; drift is not.\n \ diff --git a/tools/ci-local.sh b/tools/ci-local.sh index ec9c99c..2a6390b 100755 --- a/tools/ci-local.sh +++ b/tools/ci-local.sh @@ -180,7 +180,7 @@ job_traceability() { # Compared against the working tree, not against HEAD. # - # CI asks `git diff --quiet docs/traceability.md` after regenerating, which + # CI asks `git diff --quiet docs/dev/traceability.md` after regenerating, which # is right there and wrong here: CI starts from a clean checkout, so the # only diff it can see is the one regeneration introduced. Locally the file # is usually already modified for honest reasons — an uncommitted feature @@ -191,14 +191,14 @@ job_traceability() { step "traceability: matrix is up to date" local before before="$(mktemp)" - cp docs/traceability.md "${before}" + cp docs/dev/traceability.md "${before}" cargo run -q -p traceability -- report - if diff -q "${before}" docs/traceability.md >/dev/null; then + if diff -q "${before}" docs/dev/traceability.md >/dev/null; then record "traceability/matrix" 0 else - echo "docs/traceability.md was stale; regenerating changed it:" - diff --stat "${before}" docs/traceability.md 2>/dev/null \ - || diff "${before}" docs/traceability.md | head -20 + echo "docs/dev/traceability.md was stale; regenerating changed it:" + diff --stat "${before}" docs/dev/traceability.md 2>/dev/null \ + || diff "${before}" docs/dev/traceability.md | head -20 record "traceability/matrix" 1 fi rm -f "${before}" diff --git a/tools/export-migan.sh b/tools/export-migan.sh index 9c96630..89831e4 100755 --- a/tools/export-migan.sh +++ b/tools/export-migan.sh @@ -9,7 +9,7 @@ # ./tools/export-migan.sh # -> models/inpaint/migan-512.onnx # # Since 2026-09-20 the file that ships is not this export but a fine-tune of -# it on panorama-border voids (docs/panorama.md §14), made in the +# it on panorama-border voids (docs/dev/panorama.md §14), made in the # `darkroom-infill` repository with `python -m infill.export`. This script # still yields the stock generator — the fine-tune's starting point, and the # model the page's "mirror depth" knob above zero was built around. diff --git a/tools/face-tests-on-device.sh b/tools/face-tests-on-device.sh index 121b7b1..5f547e5 100755 --- a/tools/face-tests-on-device.sh +++ b/tools/face-tests-on-device.sh @@ -5,7 +5,7 @@ # # ## Why this exists # -# `dr-face`'s similarity scan picks its dot product per machine (docs/faces.md +# `dr-face`'s similarity scan picks its dot product per machine (docs/dev/faces.md # §9): AVX2 where the CPU has it, **NEON on aarch64**, and a portable loop # otherwise. The NEON kernel is the one that runs on the phone and the tablet, # and it is the one a desktop `cargo test` never executes — a wrong lane index diff --git a/tools/fetch-android-runtime.sh b/tools/fetch-android-runtime.sh index 5b11351..3f622b8 100755 --- a/tools/fetch-android-runtime.sh +++ b/tools/fetch-android-runtime.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Fetch the inference runtime the Android APK carries (docs/inference.md §3). +# Fetch the inference runtime the Android APK carries (docs/dev/inference.md §3). # # ./tools/fetch-android-runtime.sh [DEST] # diff --git a/tools/fetch-desktop-runtime.sh b/tools/fetch-desktop-runtime.sh index 337c26d..6b05e06 100755 --- a/tools/fetch-desktop-runtime.sh +++ b/tools/fetch-desktop-runtime.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Put a GPU-capable ONNX Runtime where the desktop app looks for one -# (docs/inference.md §3): `runtime/` beside the models in the user data +# (docs/dev/inference.md §3): `runtime/` beside the models in the user data # directory, ahead of the system library. # # ./tools/fetch-desktop-runtime.sh [DEST] diff --git a/tools/fix-face-model-shapes.sh b/tools/fix-face-model-shapes.sh index 9348fdc..fa35818 100755 --- a/tools/fix-face-model-shapes.sh +++ b/tools/fix-face-model-shapes.sh @@ -4,14 +4,14 @@ # ./tools/fix-face-model-shapes.sh IN.onnx OUT.onnx --input NAME=1,3,640,640 # ./tools/fix-face-model-shapes.sh IN.onnx OUT.onnx --dim NAME=1 # -# The two the face pipeline needs, verified 2026-08-26 (docs/faces.md §12 M1): +# The two the face pipeline needs, verified 2026-08-26 (docs/dev/faces.md §12 M1): # # ... det_500m.onnx scrfd_500m_640.onnx --input input.1=1,3,640,640 # ... det_2.5g.onnx scrfd_2.5g_640.onnx --input input.1=1,3,640,640 # ... det_10g.onnx scrfd_10g_640.onnx --input input.1=1,3,640,640 # ... w600k_mbf.onnx arcface_mbf_b1.onnx --dim None=1 # -# And the three eye-state models, verified 2026-09-19 (docs/faces.md §17). +# And the three eye-state models, verified 2026-09-19 (docs/dev/faces.md §17). # The landmark model's batch is the literal "None" like the embedder's; the # two classifiers' is a *named* dim_param "batch": # @@ -43,7 +43,7 @@ # ## Why it is a script and not a build step # # Same reason as the segmentation export: the model is not a build input -# (docs/faces.md §2.2 — the weights are never committed, because InsightFace's +# (docs/dev/faces.md §2.2 — the weights are never committed, because InsightFace's # grant is non-commercial). This runs once, wherever the user's model lives, # and the app loads the result. It exists so the transformation is reproducible # rather than a binary someone once produced and nobody can regenerate. diff --git a/tools/quantise-models.sh b/tools/quantise-models.sh index 91703c4..8d67e71 100755 --- a/tools/quantise-models.sh +++ b/tools/quantise-models.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Produce the int8 form of a model for the Hexagon (docs/inference.md §5). +# Produce the int8 form of a model for the Hexagon (docs/dev/inference.md §5). # # ./tools/quantise-models.sh PHOTO_DIR MODEL.onnx [MODEL.onnx ...] # diff --git a/tools/traceability/src/main.rs b/tools/traceability/src/main.rs index b01fe51..620b057 100644 --- a/tools/traceability/src/main.rs +++ b/tools/traceability/src/main.rs @@ -1,7 +1,7 @@ //! Traceability gate and matrix generator. //! //! ```text -//! traces report # write docs/traceability.md +//! traces report # write docs/dev/traceability.md //! traces json # machine-readable, to stdout //! traces check # gate: non-zero exit on failure //! traces gestures # write docs/gestures.md and the app's gesture table @@ -67,7 +67,7 @@ fn main() -> Result<()> { return run_gestures(&base, mode == "gestures-check"); } - let req_path = base.join("docs/requirements.md"); + let req_path = base.join("docs/dev/requirements.md"); let markdown = std::fs::read_to_string(&req_path) .with_context(|| format!("reading {}", req_path.display()))?; let defined = parse_defined_requirements(&markdown); @@ -106,7 +106,7 @@ fn main() -> Result<()> { println!("\ntraceability gate: PASS"); } _ => { - let out = base.join("docs/traceability.md"); + let out = base.join("docs/dev/traceability.md"); let md = render(&files, &entries, &defined, &coverage); std::fs::write(&out, md)?; print_summary(&files, &entries, &defined, &coverage); @@ -195,7 +195,7 @@ fn run_gestures(base: &Path, check: bool) -> Result<()> { fn gate(files: &[PathBuf], defined: &DefinedRequirements, cov: &Coverage) -> Result<()> { // A run that parsed nothing is misconfigured, not passing. if defined.total() == 0 { - bail!("no requirements parsed from docs/requirements.md — misconfigured, not 0% coverage"); + bail!("no requirements parsed from docs/dev/requirements.md — misconfigured, not 0% coverage"); } if files.is_empty() { bail!("no source files scanned — misconfigured, not 0% coverage"); @@ -325,7 +325,7 @@ fn render( for (id, es) in &by_req { let mut locs: Vec = es .iter() - .map(|e| format!("[`{}:{}`](../{}#L{})", e.file, e.line, e.file, e.line)) + .map(|e| format!("[`{}:{}`](../../{}#L{})", e.file, e.line, e.file, e.line)) .collect(); locs.sort(); locs.dedup(); @@ -346,7 +346,7 @@ fn render( let mut locs: Vec = entries .iter() .filter(|e| e.requirements.contains(id)) - .map(|e| format!("[`{}:{}`](../{}#L{})", e.file, e.line, e.file, e.line)) + .map(|e| format!("[`{}:{}`](../../{}#L{})", e.file, e.line, e.file, e.line)) .collect(); locs.sort(); locs.dedup(); @@ -379,9 +379,9 @@ fn render( /// The repo root, found by walking up from the executable's manifest dir. fn repo_root() -> Result { let mut dir = Path::new(env!("CARGO_MANIFEST_DIR")).to_path_buf(); - while !dir.join("docs/requirements.md").exists() { + while !dir.join("docs/dev/requirements.md").exists() { if !dir.pop() { - bail!("could not locate repo root (no docs/requirements.md above the tool)"); + bail!("could not locate repo root (no docs/dev/requirements.md above the tool)"); } } Ok(dir) diff --git a/ui/dr-ui/Cargo.toml b/ui/dr-ui/Cargo.toml index 7f554ae..60e5cfd 100644 --- a/ui/dr-ui/Cargo.toml +++ b/ui/dr-ui/Cargo.toml @@ -47,10 +47,10 @@ dr-lens.workspace = true dr-pipeline.workspace = true dr-catalog.workspace = true # The face pipeline, with the ONNX runtime: this is the layer that actually -# runs the models over the library (docs/faces.md). +# runs the models over the library (docs/dev/faces.md). dr-face = { workspace = true, features = ["inference"] } # The engine behind both. `native` here means the *app* may look for a -# runtime file; the build stays C-free either way (docs/inference.md §3). +# runtime file; the build stays C-free either way (docs/dev/inference.md §3). dr-inference-engine = { workspace = true, features = ["native"] } dr-thumbs.workspace = true # For the drag ghost only: the composite under the cursor has to reach the diff --git a/ui/dr-ui/examples/face_detectors.rs b/ui/dr-ui/examples/face_detectors.rs index e2a1090..9a97a76 100644 --- a/ui/dr-ui/examples/face_detectors.rs +++ b/ui/dr-ui/examples/face_detectors.rs @@ -14,7 +14,7 @@ //! //! # What it measures, and what it cannot //! -//! docs/faces.md §12 M4 is recall against hand-labelled faces. There are no +//! docs/dev/faces.md §12 M4 is recall against hand-labelled faces. There are no //! labels here, so this is the cheaper question that decides whether M4 is //! worth the labelling: *do the detectors disagree, where, and does the //! disagreement look like faces*. A candidate whose extras are all real faces diff --git a/ui/dr-ui/examples/face_index.rs b/ui/dr-ui/examples/face_index.rs index 82535b5..50a3bfc 100644 --- a/ui/dr-ui/examples/face_index.rs +++ b/ui/dr-ui/examples/face_index.rs @@ -8,7 +8,7 @@ //! //! # Why this exists beside the button in the Identity screen //! -//! Indexing a real library is hours of work (docs/faces.md §12.2), and the +//! Indexing a real library is hours of work (docs/dev/faces.md §12.2), and the //! cases where that is worth starting — an overnight pass, a fresh import, a //! machine left running — are exactly the ones where holding a window open is //! the wrong shape. The check half is useful on its own: it is cheap, it @@ -181,7 +181,7 @@ fn main() { \n\ Face crops must be sampled from a buffer longer than {}px and the\n\ store's largest tier is {}px, so every image here would be refused.\n\ - The measurement behind that floor is docs/faces.md §7b.\n\ + The measurement behind that floor is docs/dev/faces.md §7b.\n\ \n\ Index from the app's Identity screen instead: that pass renders at\n\ native resolution, which is what the crop needs.", diff --git a/ui/dr-ui/examples/face_native.rs b/ui/dr-ui/examples/face_native.rs index a3e5d0e..69f5f32 100644 --- a/ui/dr-ui/examples/face_native.rs +++ b/ui/dr-ui/examples/face_native.rs @@ -15,7 +15,7 @@ //! //! `--export DIR` also writes each native render out as a JPEG, so the //! model-free tooling in `dr-face`'s examples — `eyes` above all — can be -//! run over native pixels rather than proxies (docs/faces.md §17.4). +//! run over native pixels rather than proxies (docs/dev/faces.md §17.4). //! //! The models must have had their input dims frozen first; see //! `tools/fix-face-model-shapes.sh`. diff --git a/ui/dr-ui/src/bursts.rs b/ui/dr-ui/src/bursts.rs index ee32725..358cf89 100644 --- a/ui/dr-ui/src/bursts.rs +++ b/ui/dr-ui/src/bursts.rs @@ -26,7 +26,7 @@ //! not: a burst is a property of a *run* of frames, so a per-image job would //! regroup the library once per photograph. Since the two have to happen in that //! order and the second cannot be split, both live in one pass — the same -//! argument docs/catalog.md §10.2 makes for face clustering. +//! argument docs/dev/catalog.md §10.2 makes for face clustering. //! //! # It is never on the UI thread //! diff --git a/ui/dr-ui/src/develop.rs b/ui/dr-ui/src/develop.rs index 1803f85..b9b8054 100644 --- a/ui/dr-ui/src/develop.rs +++ b/ui/dr-ui/src/develop.rs @@ -258,7 +258,7 @@ impl SegmentationJob { /// /// The model reads the photograph as captured, not as edited: the /// segmentation must survive an exposure change, or every slider would - /// invalidate the masks that depend on it (docs/segmentation.md §3). + /// invalidate the masks that depend on it (docs/dev/segmentation.md §3). /// /// **Still the sensor's orientation, deliberately.** Standing the picture /// up is what `segmentation::compute` does to the buffer this returns, @@ -2387,7 +2387,7 @@ impl DevelopSession { } // ---------------------------------------------------------------------- - // Segmentation (S15, docs/segmentation.md) + // Segmentation (S15, docs/dev/segmentation.md) // ---------------------------------------------------------------------- /// This session's name, carried by any work started against it. @@ -3569,7 +3569,7 @@ impl DevelopSession { /// The instance's own coverage is the mask, rather than the watershed /// regions it overlaps. Snapping to regions was the original design and /// it is not currently worth doing: the hierarchy those ids index into - /// collapses on a photograph (docs/segmentation.md §15), so snapping + /// collapses on a photograph (docs/dev/segmentation.md §15), so snapping /// would trade the model's approximately-right outline for a /// confidently-wrong one. pub fn add_subject_mask(&mut self, index: usize) -> Option { diff --git a/ui/dr-ui/src/faces.rs b/ui/dr-ui/src/faces.rs index 14240b1..555f269 100644 --- a/ui/dr-ui/src/faces.rs +++ b/ui/dr-ui/src/faces.rs @@ -12,7 +12,7 @@ //! thing that makes the feature affordable: a library that has been browsed has //! already paid for its proxies, so face indexing adds **no RAW decodes that //! were not already happening**. The tier is `ThumbSize::Large` — 1024 on the -//! long edge — and docs/faces.md §7 has the table of what the embedder actually +//! long edge — and docs/dev/faces.md §7 has the table of what the embedder actually //! receives at that resolution. //! //! # Why clustering is a separate pass and not a job @@ -39,7 +39,7 @@ use dr_types::ImageId; /// The tier a stored face crop is cut from. See the module note. /// /// **No longer a tier faces are found or cropped at**, and the distinction is -/// the whole of `docs/faces.md` §7: cutting an already-located face out of a +/// the whole of `docs/dev/faces.md` §7: cutting an already-located face out of a /// stored 1024px proxy so the People screen can draw a thumbnail of it is /// fine, because that crop is only ever looked at. Sampling the *embedder's* /// 112×112 from a buffer this size is what left 47% of the reference library's @@ -845,7 +845,7 @@ pub fn spawn_store_face_sweep( // Models first: they are the expensive failure, and there is no point // listing ten thousand images before discovering the weights are // missing. This is also the path a library with face indexing enabled - // but no model downloaded takes (docs/faces.md §2.2), so it must be a + // but no model downloaded takes (docs/dev/faces.md §2.2), so it must be a // quiet return rather than an error. let mut detector = match Detector::from_path(&models.detector) { Ok(d) => d, diff --git a/ui/dr-ui/src/inference.rs b/ui/dr-ui/src/inference.rs index bae0762..aa5cc18 100644 --- a/ui/dr-ui/src/inference.rs +++ b/ui/dr-ui/src/inference.rs @@ -1,4 +1,4 @@ -//! The app's side of `dr-inference-engine` (docs/inference.md §8). +//! The app's side of `dr-inference-engine` (docs/dev/inference.md §8). //! //! What lives here is what only the app knows: where the runtime file might //! be, where the disposable cache goes, which model files this device has, diff --git a/ui/dr-ui/src/lib.rs b/ui/dr-ui/src/lib.rs index e1846e2..c7eb484 100644 --- a/ui/dr-ui/src/lib.rs +++ b/ui/dr-ui/src/lib.rs @@ -1485,7 +1485,7 @@ pub fn run(paths: Vec) -> Result<()> { .map(std::rc::Rc::new) }, // The weights are not shipped and are not a build input - // (docs/faces.md §2): the user puts them beside the catalog, + // (docs/dev/faces.md §2): the user puts them beside the catalog, // and their absence is the ordinary state of a fresh install. { let lib = library.clone(); diff --git a/ui/dr-ui/src/library.rs b/ui/dr-ui/src/library.rs index 7a3b539..06fc597 100644 --- a/ui/dr-ui/src/library.rs +++ b/ui/dr-ui/src/library.rs @@ -4261,7 +4261,7 @@ pub fn thumbs_dir(account: &Account) -> PathBuf { /// **Not shipped with the application** and not a build input: the InsightFace /// weights carry a non-commercial research grant incompatible with this /// project's licence, so the user obtains them and the app loads them from here -/// (docs/faces.md §2). An absent directory is the ordinary state of a fresh +/// (docs/dev/faces.md §2). An absent directory is the ordinary state of a fresh /// install, not an error. pub fn face_models_dir(account: &Account) -> PathBuf { catalog_path(account) @@ -4334,7 +4334,7 @@ impl FaceModelPaths { } /// Where the inference engine keeps what it derives per device: the probe -/// result and compiled engines (docs/inference.md §4, §5). A peer of +/// result and compiled engines (docs/dev/inference.md §4, §5). A peer of /// `thumbs`, not of the catalog: disposable, regenerable, never synced. pub fn inference_cache_dir() -> PathBuf { data_root().join("inference") diff --git a/ui/dr-ui/src/recovery_ui.rs b/ui/dr-ui/src/recovery_ui.rs index 7dabb2c..31abae0 100644 --- a/ui/dr-ui/src/recovery_ui.rs +++ b/ui/dr-ui/src/recovery_ui.rs @@ -22,7 +22,7 @@ //! the catalog holds has authoritative backing outside it, which is what makes //! a rebuild survivable — but a manual collection is a set of images the user //! assembled by hand and nothing in the filesystem records it -//! (`docs/catalog.md` §8.1). So the labels say which one loses them, and the +//! (`docs/dev/catalog.md` §8.1). So the labels say which one loses them, and the //! rebuild is not given the affirmative styling while a restore is on offer. //! //! # Why the scan is held back diff --git a/ui/dr-ui/src/remote.rs b/ui/dr-ui/src/remote.rs index d5ada14..5b4baa0 100644 --- a/ui/dr-ui/src/remote.rs +++ b/ui/dr-ui/src/remote.rs @@ -12,7 +12,7 @@ //! Everything above this module works through `&dyn RemoteBackend`, and every //! account it opens is a [`dr_sync::Account`] — configuration with no server //! in it. Adding a backend is implementing two traits and adding a line to -//! [`registry`]; nothing else in `dr-ui` changes. See `docs/storage.md`. +//! [`registry`]; nothing else in `dr-ui` changes. See `docs/dev/storage.md`. //! //! # Why the registry is built here and not in `dr-sync` //! diff --git a/ui/dr-ui/src/repairs.rs b/ui/dr-ui/src/repairs.rs index 598f79d..9b2ace4 100644 --- a/ui/dr-ui/src/repairs.rs +++ b/ui/dr-ui/src/repairs.rs @@ -322,7 +322,7 @@ pub fn registry( // detector found on a proxy as found. The re-index converges on // provenance: every box, landmark, crop and vector from the current // detector over the native render, because those are what every - // later per-face pass reads (docs/faces.md §17.4a). + // later per-face pass reads (docs/dev/faces.md §17.4a). out.push(Repair { name: "face-detection", label: "images to detect faces in with the chosen detector", diff --git a/ui/dr-ui/src/segmentation.rs b/ui/dr-ui/src/segmentation.rs index 36edb1d..aa4efe0 100644 --- a/ui/dr-ui/src/segmentation.rs +++ b/ui/dr-ui/src/segmentation.rs @@ -6,7 +6,7 @@ //! # What used to be here //! //! A watershed over-segmented the image, a merge tree turned that into a -//! granularity ladder, and a click walked up it (docs/segmentation.md, arms A +//! granularity ladder, and a click walked up it (docs/dev/segmentation.md, arms A //! and C). It is gone from this path, and the reason is measured rather than //! aesthetic: on a real photograph the saddles are near zero almost //! everywhere, so the merge order joins everything meaningful before it joins @@ -354,7 +354,7 @@ pub struct Options { /// Run the model over overlapping tiles instead of the whole frame once. /// /// Off by default and deliberately so. The graph's input is fixed at - /// 640x640 (docs/segmentation.md F6), so every image is letterboxed into + /// 640x640 (docs/dev/segmentation.md F6), so every image is letterboxed into /// it and a subject 200px across in a 1600px proxy reaches the model at /// 80px — which is where a coarse outline comes from. Tiling is the only /// route to more resolution with a fixed window, and it costs one diff --git a/ui/dr-ui/src/xmp_sync.rs b/ui/dr-ui/src/xmp_sync.rs index 2be3914..0a4b16b 100644 --- a/ui/dr-ui/src/xmp_sync.rs +++ b/ui/dr-ui/src/xmp_sync.rs @@ -2,7 +2,7 @@ //! Standard XMP sidecars, read into the catalog and written back out of it. //! //! `dr-xmp` reads and writes the file. This is the other half the requirement -//! asks for and the half `docs/outstanding.md` called "the larger": which +//! asks for and the half `docs/dev/outstanding.md` called "the larger": which //! images a given `.xmp` describes, what the catalog holds about them, how //! the two are reconciled, where a disagreement goes, and the write in the //! other direction. Nothing here parses XML and nothing in `dr-xmp` knows a diff --git a/ui/dr-ui/ui/identity.slint b/ui/dr-ui/ui/identity.slint index 85d380e..c2fd89d 100644 --- a/ui/dr-ui/ui/identity.slint +++ b/ui/dr-ui/ui/identity.slint @@ -276,7 +276,7 @@ export component IdentityScreen inherits Rectangle { /// existed. The same sweep, fetching the same originals; the button says /// what it will actually do. in property coverage-read-only: false; - // No model on disk: face indexing cannot run at all (docs/faces.md §2.2). + // No model on disk: face indexing cannot run at all (docs/dev/faces.md §2.2). in property model-missing: false; in property picked-count: 0; /// Where leaving goes back to — "‹ Library" or "‹ Develop". diff --git a/ui/dr-ui/ui/recovery.slint b/ui/dr-ui/ui/recovery.slint index cc5372b..cabdf91 100644 --- a/ui/dr-ui/ui/recovery.slint +++ b/ui/dr-ui/ui/recovery.slint @@ -23,7 +23,7 @@ // // A restore keeps the user's collections; a rebuild cannot, because a manual // collection is a set of images the user assembled by hand and nothing in the -// filesystem records it (docs/catalog.md §8.1). So the two answers are not +// filesystem records it (docs/dev/catalog.md §8.1). So the two answers are not // interchangeable, the difference is stated in the button rather than in a // second dialogue after it, and the rebuild is the plain button even when it // is the only one available. diff --git a/ui/dr-ui/ui/settings.slint b/ui/dr-ui/ui/settings.slint index 56195ee..caae54f 100644 --- a/ui/dr-ui/ui/settings.slint +++ b/ui/dr-ui/ui/settings.slint @@ -98,7 +98,7 @@ export component SettingsPage inherits Rectangle { /// it — so both buttons go quiet together. callback reindex-faces(); /// TRACES: FR-CULL-8 - /// Which detector the pass finds faces with — docs/faces.md §12.3 for + /// Which detector the pass finds faces with — docs/dev/faces.md §12.3 for /// what each costs and finds. The choice is a model change: coverage is /// counted per pipeline, so picking another one starts from nothing. in property <[string]> face-detector-labels; @@ -144,7 +144,7 @@ export component SettingsPage inherits Rectangle { in property adapter; in property backend; /// What runs the neural models and how it was chosen — the two lines - /// `dr_ui::inference::about_lines` produces (docs/inference.md §4). + /// `dr_ui::inference::about_lines` produces (docs/dev/inference.md §4). in property inference-backend; in property inference-detail; in property fps; diff --git a/ui/dr-ui/ui/toolrail.slint b/ui/dr-ui/ui/toolrail.slint index 3b8414b..17c613c 100644 --- a/ui/dr-ui/ui/toolrail.slint +++ b/ui/dr-ui/ui/toolrail.slint @@ -17,7 +17,7 @@ // answer the same question and only one of them is on screen at a time. // // **Why a rail is the right shape for a finger and the wrong one for a mouse.** -// See `groups-in-rail` below, and D-N6 in `docs/ui-navigation.md` for the +// See `groups-in-rail` below, and D-N6 in `docs/dev/ui-navigation.md` for the // decision it reverses and the half of that decision that still stands. // // **Why it left the chip strip.** These four used to be chips at the top of From aee62dc7f2ca6cf26cd2e7a3acb2bdb7e7b575ae Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 20:26:54 +0200 Subject: [PATCH 12/13] Wrap the line the docs move pushed past the width limit --- tools/traceability/src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/traceability/src/main.rs b/tools/traceability/src/main.rs index 620b057..be76394 100644 --- a/tools/traceability/src/main.rs +++ b/tools/traceability/src/main.rs @@ -195,7 +195,9 @@ fn run_gestures(base: &Path, check: bool) -> Result<()> { fn gate(files: &[PathBuf], defined: &DefinedRequirements, cov: &Coverage) -> Result<()> { // A run that parsed nothing is misconfigured, not passing. if defined.total() == 0 { - bail!("no requirements parsed from docs/dev/requirements.md — misconfigured, not 0% coverage"); + bail!( + "no requirements parsed from docs/dev/requirements.md — misconfigured, not 0% coverage" + ); } if files.is_empty() { bail!("no source files scanned — misconfigured, not 0% coverage"); From fbfa89129658248798692211069ab1aca37974db Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Sun, 20 Sep 2026 21:23:23 +0200 Subject: [PATCH 13/13] Regenerate the traceability matrix after the rebase --- docs/dev/traceability.md | 48 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/dev/traceability.md b/docs/dev/traceability.md index bd4a21c..0bd166c 100644 --- a/docs/dev/traceability.md +++ b/docs/dev/traceability.md @@ -9,7 +9,7 @@ Denominators are parsed from [`requirements.md`](requirements.md) at run time, n | Metric | Value | |---|---| -| Source files scanned | 392 | +| Source files scanned | 394 | | TRACES tags found | 1573 | | Requirements defined | 184 | | Requirements deferred (post-v1) | 24 | @@ -39,27 +39,27 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:1559`](../../ui/dr-ui/src/lib.rs#L1559), [`ui/dr-ui/src/library.rs:183`](../../ui/dr-ui/src/library.rs#L183), [`ui/dr-ui/src/library.rs:3396`](../../ui/dr-ui/src/library.rs#L3396), [`ui/dr-ui/ui/import.slint:5`](../../ui/dr-ui/ui/import.slint#L5) | | FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:137`](../../core/dr-pipeline/src/sidecar.rs#L137) | | FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library.rs:1564`](../../ui/dr-ui/src/library.rs#L1564), [`ui/dr-ui/src/library.rs:1627`](../../ui/dr-ui/src/library.rs#L1627), [`ui/dr-ui/src/library.rs:1643`](../../ui/dr-ui/src/library.rs#L1643), [`ui/dr-ui/src/library.rs:1750`](../../ui/dr-ui/src/library.rs#L1750), [`ui/dr-ui/src/library_ui.rs:1322`](../../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:540`](../../ui/dr-ui/src/settings_ui.rs#L540), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:900`](../../ui/dr-ui/ui/app.slint#L900), [`ui/dr-ui/ui/settings.slint:1093`](../../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../../ui/dr-ui/ui/settings.slint#L199) | -| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../../core/dr-thumbs/src/lib.rs#L393), [`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:4592`](../../ui/dr-ui/src/library.rs#L4592), [`ui/dr-ui/src/library.rs:4626`](../../ui/dr-ui/src/library.rs#L4626), [`ui/dr-ui/src/library_ui.rs:238`](../../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../../ui/dr-ui/src/library_ui.rs#L914), [`ui/dr-ui/src/trash.rs:1`](../../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:745`](../../ui/dr-ui/ui/collections.slint#L745) | +| FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../../core/dr-thumbs/src/lib.rs#L393), [`core/dr-types/src/place.rs:91`](../../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui.rs:1526`](../../ui/dr-ui/src/collections_ui.rs#L1526), [`ui/dr-ui/src/collections_ui.rs:2433`](../../ui/dr-ui/src/collections_ui.rs#L2433), [`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:914`](../../ui/dr-ui/src/library_ui.rs#L914), [`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:105`](../../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs: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:3940`](../../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:177`](../../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6027`](../../ui/dr-ui/src/library_ui.rs#L6027), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:387`](../../ui/dr-ui/ui/app.slint#L387), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`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:564`](../../core/dr-catalog/src/schema.rs#L564), [`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:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`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:4640`](../../ui/dr-ui/src/library.rs#L4640), [`ui/dr-ui/src/library_ui.rs:789`](../../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../../ui/dr-ui/ui/app.slint#L575), [`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:4246`](../../ui/dr-ui/ui/library.slint#L4246) | -| 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:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`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:5116`](../../ui/dr-ui/src/library.rs#L5116), [`ui/dr-ui/src/library_ui.rs:396`](../../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../../ui/dr-ui/ui/settings.slint#L191) | -| 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:4921`](../../ui/dr-ui/src/library.rs#L4921), [`ui/dr-ui/src/library.rs:4947`](../../ui/dr-ui/src/library.rs#L4947), [`ui/dr-ui/src/library.rs:5002`](../../ui/dr-ui/src/library.rs#L5002), [`ui/dr-ui/src/library_ui.rs:2774`](../../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../../ui/dr-ui/ui/app.slint#L599), [`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:2942`](../../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998) | -| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:7386`](../../ui/dr-ui/src/library.rs#L7386), [`ui/dr-ui/src/library.rs:73`](../../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:926`](../../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../../ui/dr-ui/src/library.rs#L2527), [`ui/dr-ui/src/library.rs:274`](../../ui/dr-ui/src/library.rs#L274), [`ui/dr-ui/src/library.rs:5224`](../../ui/dr-ui/src/library.rs#L5224), [`ui/dr-ui/src/library.rs:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../../ui/dr-ui/src/presets.rs#L498), [`ui/dr-ui/src/sidecar_cache.rs:1`](../../ui/dr-ui/src/sidecar_cache.rs#L1), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | +| FR-CAT-5 | [`core/dr-catalog/src/keywords.rs:1`](../../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:301`](../../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`ui/dr-ui/src/collections_ui.rs:1822`](../../ui/dr-ui/src/collections_ui.rs#L1822), [`ui/dr-ui/src/collections_ui.rs:1928`](../../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:1977`](../../ui/dr-ui/src/collections_ui.rs#L1977), [`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:789`](../../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8167`](../../ui/dr-ui/src/library_ui.rs#L8167), [`ui/dr-ui/src/library_ui.rs:8178`](../../ui/dr-ui/src/library_ui.rs#L8178), [`ui/dr-ui/src/library_ui.rs:8191`](../../ui/dr-ui/src/library_ui.rs#L8191), [`ui/dr-ui/src/library_ui.rs:8206`](../../ui/dr-ui/src/library_ui.rs#L8206), [`ui/dr-ui/src/library_ui.rs:8215`](../../ui/dr-ui/src/library_ui.rs#L8215), [`ui/dr-ui/ui/app.slint:308`](../../ui/dr-ui/ui/app.slint#L308), [`ui/dr-ui/ui/app.slint:575`](../../ui/dr-ui/ui/app.slint#L575), [`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:4253`](../../ui/dr-ui/ui/library.slint#L4253) | +| 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:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`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:396`](../../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6766`](../../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:6819`](../../ui/dr-ui/src/library_ui.rs#L6819), [`ui/dr-ui/src/library_ui.rs:8307`](../../ui/dr-ui/src/library_ui.rs#L8307), [`ui/dr-ui/ui/app.slint:320`](../../ui/dr-ui/ui/app.slint#L320), [`ui/dr-ui/ui/app.slint:575`](../../ui/dr-ui/ui/app.slint#L575), [`ui/dr-ui/ui/app.slint:896`](../../ui/dr-ui/ui/app.slint#L896), [`ui/dr-ui/ui/library.slint:111`](../../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4253`](../../ui/dr-ui/ui/library.slint#L4253), [`ui/dr-ui/ui/settings.slint:191`](../../ui/dr-ui/ui/settings.slint#L191) | +| 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:117`](../../ui/dr-ui/src/collections_ui.rs#L117), [`ui/dr-ui/src/collections_ui.rs:1208`](../../ui/dr-ui/src/collections_ui.rs#L1208), [`ui/dr-ui/src/collections_ui.rs:1316`](../../ui/dr-ui/src/collections_ui.rs#L1316), [`ui/dr-ui/src/collections_ui.rs:1795`](../../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1841`](../../ui/dr-ui/src/collections_ui.rs#L1841), [`ui/dr-ui/src/collections_ui.rs:1`](../../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/collections_ui.rs:2091`](../../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:2156`](../../ui/dr-ui/src/collections_ui.rs#L2156), [`ui/dr-ui/src/collections_ui.rs:2216`](../../ui/dr-ui/src/collections_ui.rs#L2216), [`ui/dr-ui/src/collections_ui.rs:2793`](../../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:2893`](../../ui/dr-ui/src/collections_ui.rs#L2893), [`ui/dr-ui/src/collections_ui.rs:2995`](../../ui/dr-ui/src/collections_ui.rs#L2995), [`ui/dr-ui/src/collections_ui.rs:3051`](../../ui/dr-ui/src/collections_ui.rs#L3051), [`ui/dr-ui/src/collections_ui.rs:3212`](../../ui/dr-ui/src/collections_ui.rs#L3212), [`ui/dr-ui/src/collections_ui.rs:3234`](../../ui/dr-ui/src/collections_ui.rs#L3234), [`ui/dr-ui/src/collections_ui.rs:329`](../../ui/dr-ui/src/collections_ui.rs#L329), [`ui/dr-ui/src/collections_ui.rs:3300`](../../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:339`](../../ui/dr-ui/src/collections_ui.rs#L339), [`ui/dr-ui/src/collections_ui.rs:3420`](../../ui/dr-ui/src/collections_ui.rs#L3420), [`ui/dr-ui/src/collections_ui.rs:362`](../../ui/dr-ui/src/collections_ui.rs#L362), [`ui/dr-ui/src/collections_ui.rs:3725`](../../ui/dr-ui/src/collections_ui.rs#L3725), [`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:2774`](../../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:311`](../../ui/dr-ui/ui/app.slint#L311), [`ui/dr-ui/ui/app.slint:3213`](../../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../../ui/dr-ui/ui/app.slint#L599), [`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:2949`](../../ui/dr-ui/ui/library.slint#L2949), [`ui/dr-ui/ui/library.slint:4231`](../../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998) | +| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`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:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`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:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop.rs:2155`](../../ui/dr-ui/src/develop.rs#L2155), [`ui/dr-ui/src/develop.rs:5463`](../../ui/dr-ui/src/develop.rs#L5463), [`ui/dr-ui/src/develop.rs:5492`](../../ui/dr-ui/src/develop.rs#L5492), [`ui/dr-ui/src/develop.rs:7057`](../../ui/dr-ui/src/develop.rs#L7057), [`ui/dr-ui/src/develop.rs:7111`](../../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/develop.rs:7213`](../../ui/dr-ui/src/develop.rs#L7213), [`ui/dr-ui/src/export.rs:812`](../../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1330`](../../ui/dr-ui/src/lib.rs#L1330), [`ui/dr-ui/src/lib.rs:1888`](../../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2457`](../../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/lib.rs:2604`](../../ui/dr-ui/src/lib.rs#L2604), [`ui/dr-ui/src/lib.rs:757`](../../ui/dr-ui/src/lib.rs#L757), [`ui/dr-ui/src/library.rs:1455`](../../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2491`](../../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:616`](../../ui/dr-ui/src/library.rs#L616), [`ui/dr-ui/src/library.rs:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:73`](../../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7404`](../../ui/dr-ui/src/library.rs#L7404), [`ui/dr-ui/src/library.rs:926`](../../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library_ui.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6350`](../../ui/dr-ui/src/library_ui.rs#L6350), [`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:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`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:211`](../../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop.rs:4752`](../../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:4795`](../../ui/dr-ui/src/develop.rs#L4795), [`ui/dr-ui/src/library.rs:1355`](../../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:169`](../../ui/dr-ui/src/library.rs#L169), [`ui/dr-ui/src/library.rs:2019`](../../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library.rs:2471`](../../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2527`](../../ui/dr-ui/src/library.rs#L2527), [`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:653`](../../ui/dr-ui/src/library.rs#L653), [`ui/dr-ui/src/library.rs:910`](../../ui/dr-ui/src/library.rs#L910), [`ui/dr-ui/src/library.rs:926`](../../ui/dr-ui/src/library.rs#L926), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1406`](../../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6864`](../../ui/dr-ui/src/library_ui.rs#L6864), [`ui/dr-ui/src/library_ui.rs:6946`](../../ui/dr-ui/src/library_ui.rs#L6946), [`ui/dr-ui/src/presets.rs:486`](../../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../../ui/dr-ui/src/presets.rs#L498), [`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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:781`](../../core/dr-catalog/src/schema.rs#L781), [`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-face/src/references.rs:1`](../../core/dr-face/src/references.rs#L1), [`core/dr-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`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:2416`](../../ui/dr-ui/src/develop.rs#L2416), [`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:1325`](../../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2576`](../../ui/dr-ui/src/lib.rs#L2576), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../../ui/dr-ui/ui/identity.slint#L1), [`ui/dr-ui/ui/settings.slint:529`](../../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:94`](../../ui/dr-ui/ui/settings.slint#L94) | | FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`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:345`](../../ui/dr-ui/src/library.rs#L345), [`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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../../core/dr-catalog/src/schema.rs#L603), [`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-13 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7219`](../../ui/dr-ui/src/library.rs#L7219), [`ui/dr-ui/src/library.rs:7262`](../../ui/dr-ui/src/library.rs#L7262), [`ui/dr-ui/src/library.rs:7300`](../../ui/dr-ui/src/library.rs#L7300), [`ui/dr-ui/ui/app.slint:707`](../../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-13 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7237`](../../ui/dr-ui/src/library.rs#L7237), [`ui/dr-ui/src/library.rs:7280`](../../ui/dr-ui/src/library.rs#L7280), [`ui/dr-ui/src/library.rs:7318`](../../ui/dr-ui/src/library.rs#L7318), [`ui/dr-ui/ui/app.slint:707`](../../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) | | 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:4146`](../../ui/dr-ui/src/develop.rs#L4146), [`ui/dr-ui/src/develop.rs:4159`](../../ui/dr-ui/src/develop.rs#L4159), [`ui/dr-ui/src/develop.rs:4204`](../../ui/dr-ui/src/develop.rs#L4204), [`ui/dr-ui/src/develop.rs:4215`](../../ui/dr-ui/src/develop.rs#L4215), [`ui/dr-ui/src/develop.rs:4221`](../../ui/dr-ui/src/develop.rs#L4221), [`ui/dr-ui/src/develop.rs:4238`](../../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/develop.rs:810`](../../ui/dr-ui/src/develop.rs#L810), [`ui/dr-ui/src/develop.rs:830`](../../ui/dr-ui/src/develop.rs#L830), [`ui/dr-ui/src/develop.rs:836`](../../ui/dr-ui/src/develop.rs#L836), [`ui/dr-ui/src/develop.rs:8992`](../../ui/dr-ui/src/develop.rs#L8992), [`ui/dr-ui/src/develop.rs:9056`](../../ui/dr-ui/src/develop.rs#L9056), [`ui/dr-ui/src/develop.rs:9079`](../../ui/dr-ui/src/develop.rs#L9079), [`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:1932`](../../ui/dr-ui/src/lib.rs#L1932), [`ui/dr-ui/src/lib.rs:2040`](../../ui/dr-ui/src/lib.rs#L2040), [`ui/dr-ui/src/lib.rs:2153`](../../ui/dr-ui/src/lib.rs#L2153), [`ui/dr-ui/src/lib.rs:2194`](../../ui/dr-ui/src/lib.rs#L2194), [`ui/dr-ui/src/lib.rs:3685`](../../ui/dr-ui/src/lib.rs#L3685), [`ui/dr-ui/src/lib.rs:442`](../../ui/dr-ui/src/lib.rs#L442), [`ui/dr-ui/src/peaking.rs:1`](../../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:2028`](../../ui/dr-ui/ui/app.slint#L2028), [`ui/dr-ui/ui/app.slint:3035`](../../ui/dr-ui/ui/app.slint#L3035), [`ui/dr-ui/ui/app.slint:90`](../../ui/dr-ui/ui/app.slint#L90), [`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:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`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:564`](../../ui/dr-ui/src/library.rs#L564) | -| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../../core/dr-catalog/src/schema.rs#L646), [`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:6039`](../../ui/dr-ui/src/library.rs#L6039) | +| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../../core/dr-catalog/src/schema.rs#L646), [`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:6057`](../../ui/dr-ui/src/library.rs#L6057) | | 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:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:714`](../../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1325`](../../ui/dr-ui/src/identity_ui.rs#L1325), [`ui/dr-ui/src/identity_ui.rs:603`](../../ui/dr-ui/src/identity_ui.rs#L603), [`ui/dr-ui/src/lib.rs:1511`](../../ui/dr-ui/src/lib.rs#L1511), [`ui/dr-ui/src/lib.rs:3940`](../../ui/dr-ui/src/lib.rs#L3940), [`ui/dr-ui/src/library.rs:3624`](../../ui/dr-ui/src/library.rs#L3624), [`ui/dr-ui/src/library.rs:3889`](../../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/src/library_ui.rs:406`](../../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:552`](../../ui/dr-ui/src/settings_ui.rs#L552), [`ui/dr-ui/ui/app.slint:946`](../../ui/dr-ui/ui/app.slint#L946), [`ui/dr-ui/ui/settings.slint:100`](../../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../../ui/dr-ui/ui/settings.slint#L529), [`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-8a | [`core/dr-catalog/src/faces.rs:124`](../../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7219`](../../ui/dr-ui/src/library.rs#L7219), [`ui/dr-ui/src/library.rs:7262`](../../ui/dr-ui/src/library.rs#L7262), [`ui/dr-ui/src/library.rs:7300`](../../ui/dr-ui/src/library.rs#L7300), [`ui/dr-ui/src/repairs.rs:571`](../../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:7237`](../../ui/dr-ui/src/library.rs#L7237), [`ui/dr-ui/src/library.rs:7280`](../../ui/dr-ui/src/library.rs#L7280), [`ui/dr-ui/src/library.rs:7318`](../../ui/dr-ui/src/library.rs#L7318), [`ui/dr-ui/src/repairs.rs:571`](../../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:707`](../../ui/dr-ui/ui/app.slint#L707), [`ui/dr-ui/ui/identity.slint:273`](../../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) | | FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:781`](../../core/dr-catalog/src/schema.rs#L781), [`core/dr-face/src/assign.rs:1`](../../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:517`](../../ui/dr-ui/src/repairs.rs#L517), [`ui/dr-ui/ui/identity.slint:347`](../../ui/dr-ui/ui/identity.slint#L347) | | 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:2845`](../../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1336`](../../core/dr-pipeline/src/sidecar.rs#L1336), [`core/dr-pipeline/src/sidecar.rs:1515`](../../core/dr-pipeline/src/sidecar.rs#L1515), [`core/dr-pipeline/src/sidecar.rs:1604`](../../core/dr-pipeline/src/sidecar.rs#L1604), [`core/dr-pipeline/src/sidecar.rs:1708`](../../core/dr-pipeline/src/sidecar.rs#L1708), [`core/dr-pipeline/src/sidecar.rs:1916`](../../core/dr-pipeline/src/sidecar.rs#L1916), [`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:2318`](../../ui/dr-ui/src/develop.rs#L2318), [`ui/dr-ui/src/develop.rs:3666`](../../ui/dr-ui/src/develop.rs#L3666), [`ui/dr-ui/src/develop.rs:3693`](../../ui/dr-ui/src/develop.rs#L3693), [`ui/dr-ui/src/develop.rs:3725`](../../ui/dr-ui/src/develop.rs#L3725), [`ui/dr-ui/src/develop.rs:3749`](../../ui/dr-ui/src/develop.rs#L3749), [`ui/dr-ui/src/develop.rs:3755`](../../ui/dr-ui/src/develop.rs#L3755), [`ui/dr-ui/src/develop.rs:3762`](../../ui/dr-ui/src/develop.rs#L3762), [`ui/dr-ui/src/develop.rs:3782`](../../ui/dr-ui/src/develop.rs#L3782), [`ui/dr-ui/src/labels.rs:63`](../../ui/dr-ui/src/labels.rs#L63), [`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) | @@ -82,7 +82,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-DEV-3i | [`core/dr-pipeline/src/mask.rs:558`](../../core/dr-pipeline/src/mask.rs#L558), [`core/dr-segment/src/lib.rs:1`](../../core/dr-segment/src/lib.rs#L1), [`ui/dr-ui/src/segmentation.rs:1`](../../ui/dr-ui/src/segmentation.rs#L1) | | FR-DEV-4 | [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:368`](../../core/dr-gpu/src/lib.rs#L368), [`ui/dr-ui/ui/crop.slint:1`](../../ui/dr-ui/ui/crop.slint#L1) | | FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1440`](../../core/dr-pipeline/src/graph.rs#L1440), [`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/sidecar.rs:1045`](../../core/dr-pipeline/src/sidecar.rs#L1045), [`core/dr-pipeline/src/sidecar.rs:144`](../../core/dr-pipeline/src/sidecar.rs#L144), [`core/dr-pipeline/src/sidecar.rs:2472`](../../core/dr-pipeline/src/sidecar.rs#L2472), [`core/dr-pipeline/src/sidecar.rs:2508`](../../core/dr-pipeline/src/sidecar.rs#L2508), [`core/dr-pipeline/src/sidecar.rs:2520`](../../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:303`](../../core/dr-pipeline/src/sidecar.rs#L303), [`core/dr-pipeline/src/sidecar.rs:694`](../../core/dr-pipeline/src/sidecar.rs#L694), [`core/dr-pipeline/src/sidecar.rs:710`](../../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:857`](../../core/dr-pipeline/src/sidecar.rs#L857), [`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:4409`](../../ui/dr-ui/src/develop.rs#L4409), [`ui/dr-ui/src/develop.rs:4839`](../../ui/dr-ui/src/develop.rs#L4839), [`ui/dr-ui/src/develop.rs:5517`](../../ui/dr-ui/src/develop.rs#L5517), [`ui/dr-ui/src/develop.rs:5535`](../../ui/dr-ui/src/develop.rs#L5535), [`ui/dr-ui/src/develop.rs:5574`](../../ui/dr-ui/src/develop.rs#L5574), [`ui/dr-ui/src/develop.rs:5588`](../../ui/dr-ui/src/develop.rs#L5588), [`ui/dr-ui/src/develop.rs:5599`](../../ui/dr-ui/src/develop.rs#L5599), [`ui/dr-ui/src/develop.rs:5658`](../../ui/dr-ui/src/develop.rs#L5658), [`ui/dr-ui/src/develop.rs:5671`](../../ui/dr-ui/src/develop.rs#L5671), [`ui/dr-ui/src/develop.rs:5701`](../../ui/dr-ui/src/develop.rs#L5701), [`ui/dr-ui/src/develop.rs:5714`](../../ui/dr-ui/src/develop.rs#L5714), [`ui/dr-ui/src/develop.rs:5726`](../../ui/dr-ui/src/develop.rs#L5726), [`ui/dr-ui/src/develop.rs:5742`](../../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:5778`](../../ui/dr-ui/src/develop.rs#L5778), [`ui/dr-ui/src/develop.rs:5797`](../../ui/dr-ui/src/develop.rs#L5797), [`ui/dr-ui/src/develop.rs:5813`](../../ui/dr-ui/src/develop.rs#L5813), [`ui/dr-ui/src/develop.rs:6655`](../../ui/dr-ui/src/develop.rs#L6655), [`ui/dr-ui/src/develop.rs:6675`](../../ui/dr-ui/src/develop.rs#L6675), [`ui/dr-ui/src/develop.rs:6897`](../../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:6954`](../../ui/dr-ui/src/develop.rs#L6954), [`ui/dr-ui/src/develop.rs:7014`](../../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:772`](../../ui/dr-ui/src/develop.rs#L772), [`ui/dr-ui/src/develop.rs:781`](../../ui/dr-ui/src/develop.rs#L781), [`ui/dr-ui/src/labels.rs:12`](../../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:278`](../../ui/dr-ui/src/labels.rs#L278), [`ui/dr-ui/src/labels.rs:31`](../../ui/dr-ui/src/labels.rs#L31), [`ui/dr-ui/src/lib.rs:1921`](../../ui/dr-ui/src/lib.rs#L1921), [`ui/dr-ui/src/lib.rs:1926`](../../ui/dr-ui/src/lib.rs#L1926), [`ui/dr-ui/src/lib.rs:1989`](../../ui/dr-ui/src/lib.rs#L1989), [`ui/dr-ui/src/lib.rs:1998`](../../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2010`](../../ui/dr-ui/src/lib.rs#L2010), [`ui/dr-ui/src/lib.rs:3139`](../../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3159`](../../ui/dr-ui/src/lib.rs#L3159), [`ui/dr-ui/src/library.rs:611`](../../ui/dr-ui/src/library.rs#L611), [`ui/dr-ui/src/library.rs:896`](../../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/presets.rs:1678`](../../ui/dr-ui/src/presets.rs#L1678), [`ui/dr-ui/src/presets.rs:373`](../../ui/dr-ui/src/presets.rs#L373), [`ui/dr-ui/src/presets.rs:437`](../../ui/dr-ui/src/presets.rs#L437), [`ui/dr-ui/src/presets.rs:557`](../../ui/dr-ui/src/presets.rs#L557), [`ui/dr-ui/ui/history.slint:191`](../../ui/dr-ui/ui/history.slint#L191), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:218`](../../ui/dr-ui/ui/history.slint#L218), [`ui/dr-ui/ui/history.slint:303`](../../ui/dr-ui/ui/history.slint#L303), [`ui/dr-ui/ui/history.slint:43`](../../ui/dr-ui/ui/history.slint#L43), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53) | -| 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:443`](../../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop.rs:5457`](../../ui/dr-ui/src/develop.rs#L5457), [`ui/dr-ui/src/develop.rs:5478`](../../ui/dr-ui/src/develop.rs#L5478), [`ui/dr-ui/src/lib.rs:1888`](../../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2674`](../../ui/dr-ui/src/lib.rs#L2674), [`ui/dr-ui/src/lib.rs:2703`](../../ui/dr-ui/src/lib.rs#L2703), [`ui/dr-ui/src/library.rs:2491`](../../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:592`](../../ui/dr-ui/src/library.rs#L592), [`ui/dr-ui/src/library_ui.rs:3255`](../../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`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:707`](../../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../../ui/dr-ui/src/presets.rs#L741), [`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:1706`](../../ui/dr-ui/ui/app.slint#L1706), [`ui/dr-ui/ui/app.slint:2538`](../../ui/dr-ui/ui/app.slint#L2538), [`ui/dr-ui/ui/app.slint:3173`](../../ui/dr-ui/ui/app.slint#L3173), [`ui/dr-ui/ui/app.slint:765`](../../ui/dr-ui/ui/app.slint#L765), [`ui/dr-ui/ui/app.slint:776`](../../ui/dr-ui/ui/app.slint#L776), [`ui/dr-ui/ui/library.slint:1579`](../../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4262`](../../ui/dr-ui/ui/library.slint#L4262), [`ui/dr-ui/ui/library.slint:4286`](../../ui/dr-ui/ui/library.slint#L4286), [`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:119`](../../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../../ui/dr-ui/ui/settings.slint#L711) | +| 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:443`](../../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop.rs:5457`](../../ui/dr-ui/src/develop.rs#L5457), [`ui/dr-ui/src/develop.rs:5478`](../../ui/dr-ui/src/develop.rs#L5478), [`ui/dr-ui/src/lib.rs:1888`](../../ui/dr-ui/src/lib.rs#L1888), [`ui/dr-ui/src/lib.rs:2674`](../../ui/dr-ui/src/lib.rs#L2674), [`ui/dr-ui/src/lib.rs:2703`](../../ui/dr-ui/src/lib.rs#L2703), [`ui/dr-ui/src/library.rs:2491`](../../ui/dr-ui/src/library.rs#L2491), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:592`](../../ui/dr-ui/src/library.rs#L592), [`ui/dr-ui/src/library_ui.rs:3255`](../../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`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:707`](../../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../../ui/dr-ui/src/presets.rs#L741), [`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:1706`](../../ui/dr-ui/ui/app.slint#L1706), [`ui/dr-ui/ui/app.slint:2538`](../../ui/dr-ui/ui/app.slint#L2538), [`ui/dr-ui/ui/app.slint:3173`](../../ui/dr-ui/ui/app.slint#L3173), [`ui/dr-ui/ui/app.slint:765`](../../ui/dr-ui/ui/app.slint#L765), [`ui/dr-ui/ui/app.slint:776`](../../ui/dr-ui/ui/app.slint#L776), [`ui/dr-ui/ui/library.slint:1579`](../../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4269`](../../ui/dr-ui/ui/library.slint#L4269), [`ui/dr-ui/ui/library.slint:4293`](../../ui/dr-ui/ui/library.slint#L4293), [`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:119`](../../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../../ui/dr-ui/ui/settings.slint#L711) | | 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:4343`](../../ui/dr-ui/src/develop.rs#L4343), [`ui/dr-ui/src/develop.rs:4384`](../../ui/dr-ui/src/develop.rs#L4384), [`ui/dr-ui/src/develop.rs:5613`](../../ui/dr-ui/src/develop.rs#L5613), [`ui/dr-ui/src/develop.rs:5630`](../../ui/dr-ui/src/develop.rs#L5630), [`ui/dr-ui/src/develop.rs:5742`](../../ui/dr-ui/src/develop.rs#L5742), [`ui/dr-ui/src/develop.rs:5774`](../../ui/dr-ui/src/develop.rs#L5774), [`ui/dr-ui/src/develop.rs:6897`](../../ui/dr-ui/src/develop.rs#L6897), [`ui/dr-ui/src/develop.rs:7014`](../../ui/dr-ui/src/develop.rs#L7014), [`ui/dr-ui/src/develop.rs:797`](../../ui/dr-ui/src/develop.rs#L797), [`ui/dr-ui/src/lib.rs:1998`](../../ui/dr-ui/src/lib.rs#L1998), [`ui/dr-ui/src/lib.rs:2070`](../../ui/dr-ui/src/lib.rs#L2070), [`ui/dr-ui/src/lib.rs:2084`](../../ui/dr-ui/src/lib.rs#L2084), [`ui/dr-ui/src/lib.rs:3080`](../../ui/dr-ui/src/lib.rs#L3080), [`ui/dr-ui/src/lib.rs:3139`](../../ui/dr-ui/src/lib.rs#L3139), [`ui/dr-ui/src/lib.rs:3211`](../../ui/dr-ui/src/lib.rs#L3211), [`ui/dr-ui/src/lib.rs:411`](../../ui/dr-ui/src/lib.rs#L411), [`ui/dr-ui/ui/app.slint:131`](../../ui/dr-ui/ui/app.slint#L131), [`ui/dr-ui/ui/app.slint:2445`](../../ui/dr-ui/ui/app.slint#L2445), [`ui/dr-ui/ui/app.slint:2460`](../../ui/dr-ui/ui/app.slint#L2460), [`ui/dr-ui/ui/app.slint:2780`](../../ui/dr-ui/ui/app.slint#L2780), [`ui/dr-ui/ui/history.slint:102`](../../ui/dr-ui/ui/history.slint#L102), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:226`](../../ui/dr-ui/ui/history.slint#L226), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53), [`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:1092`](../../core/dr-pipeline/src/graph.rs#L1092), [`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:717`](../../core/dr-pipeline/src/operation.rs#L717), [`core/dr-pipeline/src/sidecar.rs:1071`](../../core/dr-pipeline/src/sidecar.rs#L1071), [`core/dr-pipeline/src/sidecar.rs:1125`](../../core/dr-pipeline/src/sidecar.rs#L1125), [`core/dr-pipeline/src/sidecar.rs:1155`](../../core/dr-pipeline/src/sidecar.rs#L1155), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:888`](../../core/dr-pipeline/src/sidecar.rs#L888), [`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:3209`](../../ui/dr-ui/src/develop.rs#L3209), [`ui/dr-ui/src/develop.rs:3247`](../../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/develop.rs:3312`](../../ui/dr-ui/src/develop.rs#L3312), [`ui/dr-ui/src/develop.rs:3395`](../../ui/dr-ui/src/develop.rs#L3395), [`ui/dr-ui/src/develop.rs:3409`](../../ui/dr-ui/src/develop.rs#L3409), [`ui/dr-ui/src/develop.rs:904`](../../ui/dr-ui/src/develop.rs#L904), [`ui/dr-ui/src/labels.rs:80`](../../ui/dr-ui/src/labels.rs#L80), [`ui/dr-ui/src/lib.rs:2028`](../../ui/dr-ui/src/lib.rs#L2028), [`ui/dr-ui/src/lib.rs:3364`](../../ui/dr-ui/src/lib.rs#L3364), [`ui/dr-ui/src/lib.rs:453`](../../ui/dr-ui/src/lib.rs#L453), [`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:2301`](../../ui/dr-ui/ui/app.slint#L2301), [`ui/dr-ui/ui/app.slint:2503`](../../ui/dr-ui/ui/app.slint#L2503), [`ui/dr-ui/ui/app.slint:3079`](../../ui/dr-ui/ui/app.slint#L3079), [`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:2366`](../../core/dr-gpu/src/adjust.rs#L2366), [`core/dr-gpu/src/adjust.rs:2443`](../../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:2528`](../../core/dr-gpu/src/adjust.rs#L2528), [`core/dr-gpu/src/adjust.rs:54`](../../core/dr-gpu/src/adjust.rs#L54), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:174`](../../core/dr-gpu/src/lib.rs#L174), [`core/dr-gpu/src/lib.rs:194`](../../core/dr-gpu/src/lib.rs#L194), [`core/dr-gpu/src/lib.rs:72`](../../core/dr-gpu/src/lib.rs#L72), [`core/dr-gpu/src/lib.rs:95`](../../core/dr-gpu/src/lib.rs#L95), [`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:922`](../../core/dr-pipeline/src/graph.rs#L922), [`core/dr-pipeline/src/graph.rs:952`](../../core/dr-pipeline/src/graph.rs#L952), [`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:4030`](../../ui/dr-ui/src/develop.rs#L4030), [`ui/dr-ui/src/develop.rs:5325`](../../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:6068`](../../ui/dr-ui/src/develop.rs#L6068), [`ui/dr-ui/src/develop.rs:7608`](../../ui/dr-ui/src/develop.rs#L7608), [`ui/dr-ui/src/develop.rs:7642`](../../ui/dr-ui/src/develop.rs#L7642), [`ui/dr-ui/src/lib.rs:100`](../../ui/dr-ui/src/lib.rs#L100), [`ui/dr-ui/src/lib.rs:1026`](../../ui/dr-ui/src/lib.rs#L1026), [`ui/dr-ui/src/lib.rs:1085`](../../ui/dr-ui/src/lib.rs#L1085) | @@ -97,15 +97,15 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:607`](../../ui/dr-ui/src/lib.rs#L607), [`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:815`](../../ui/dr-ui/src/settings_ui.rs#L815) | -| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:2813`](../../ui/dr-ui/src/lib.rs#L2813), [`ui/dr-ui/src/lib.rs:607`](../../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/lib.rs:653`](../../ui/dr-ui/src/lib.rs#L653), [`ui/dr-ui/src/lib.rs:680`](../../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8149`](../../ui/dr-ui/src/library_ui.rs#L8149), [`ui/dr-ui/src/library_ui.rs:821`](../../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8226`](../../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8238`](../../ui/dr-ui/src/library_ui.rs#L8238), [`ui/dr-ui/src/library_ui.rs:878`](../../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1139`](../../ui/dr-ui/ui/app.slint#L1139), [`ui/dr-ui/ui/app.slint:1716`](../../ui/dr-ui/ui/app.slint#L1716), [`ui/dr-ui/ui/library.slint:1588`](../../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) | +| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:2813`](../../ui/dr-ui/src/lib.rs#L2813), [`ui/dr-ui/src/lib.rs:607`](../../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/lib.rs:653`](../../ui/dr-ui/src/lib.rs#L653), [`ui/dr-ui/src/lib.rs:680`](../../ui/dr-ui/src/lib.rs#L680), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8149`](../../ui/dr-ui/src/library_ui.rs#L8149), [`ui/dr-ui/src/library_ui.rs:821`](../../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8226`](../../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8238`](../../ui/dr-ui/src/library_ui.rs#L8238), [`ui/dr-ui/src/library_ui.rs:878`](../../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1139`](../../ui/dr-ui/ui/app.slint#L1139), [`ui/dr-ui/ui/app.slint:1716`](../../ui/dr-ui/ui/app.slint#L1716), [`ui/dr-ui/ui/library.slint:1588`](../../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4339`](../../ui/dr-ui/ui/library.slint#L4339) | | FR-EXP-8 | [`core/dr-decode/src/lib.rs:366`](../../core/dr-decode/src/lib.rs#L366), [`core/dr-decode/src/lib.rs:390`](../../core/dr-decode/src/lib.rs#L390), [`core/dr-decode/src/lib.rs:404`](../../core/dr-decode/src/lib.rs#L404), [`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:1233`](../../core/dr-decode/src/locate.rs#L1233), [`core/dr-decode/src/locate.rs:1292`](../../core/dr-decode/src/locate.rs#L1292), [`core/dr-decode/src/locate.rs:359`](../../core/dr-decode/src/locate.rs#L359), [`core/dr-decode/src/locate.rs:556`](../../core/dr-decode/src/locate.rs#L556), [`core/dr-decode/src/locate.rs:640`](../../core/dr-decode/src/locate.rs#L640), [`core/dr-decode/src/locate.rs:653`](../../core/dr-decode/src/locate.rs#L653), [`core/dr-decode/src/locate.rs:736`](../../core/dr-decode/src/locate.rs#L736), [`core/dr-export/examples/export.rs:99`](../../core/dr-export/examples/export.rs#L99), [`core/dr-export/src/encode.rs:117`](../../core/dr-export/src/encode.rs#L117), [`core/dr-export/src/encode.rs:161`](../../core/dr-export/src/encode.rs#L161), [`core/dr-export/src/encode.rs:1`](../../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/encode.rs:206`](../../core/dr-export/src/encode.rs#L206), [`core/dr-export/src/encode.rs:235`](../../core/dr-export/src/encode.rs#L235), [`core/dr-export/src/encode.rs:311`](../../core/dr-export/src/encode.rs#L311), [`core/dr-export/src/encode.rs:325`](../../core/dr-export/src/encode.rs#L325), [`core/dr-export/src/encode.rs:408`](../../core/dr-export/src/encode.rs#L408), [`core/dr-export/src/encode.rs:456`](../../core/dr-export/src/encode.rs#L456), [`core/dr-export/src/encode.rs:70`](../../core/dr-export/src/encode.rs#L70), [`core/dr-export/src/encode.rs:795`](../../core/dr-export/src/encode.rs#L795), [`core/dr-export/src/encode.rs:809`](../../core/dr-export/src/encode.rs#L809), [`core/dr-export/src/encode.rs:850`](../../core/dr-export/src/encode.rs#L850), [`core/dr-export/src/encode.rs:898`](../../core/dr-export/src/encode.rs#L898), [`core/dr-export/src/exif.rs:1`](../../core/dr-export/src/exif.rs#L1), [`core/dr-export/src/lib.rs:140`](../../core/dr-export/src/lib.rs#L140), [`core/dr-export/src/metadata.rs:1`](../../core/dr-export/src/metadata.rs#L1), [`core/dr-export/src/metadata.rs:41`](../../core/dr-export/src/metadata.rs#L41), [`core/dr-export/src/metadata.rs:74`](../../core/dr-export/src/metadata.rs#L74), [`core/dr-types/src/lib.rs:655`](../../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:671`](../../core/dr-types/src/settings.rs#L671), [`ui/dr-ui/src/develop.rs:4581`](../../ui/dr-ui/src/develop.rs#L4581), [`ui/dr-ui/src/develop.rs:4693`](../../ui/dr-ui/src/develop.rs#L4693), [`ui/dr-ui/src/develop.rs:729`](../../ui/dr-ui/src/develop.rs#L729), [`ui/dr-ui/src/export.rs:474`](../../ui/dr-ui/src/export.rs#L474), [`ui/dr-ui/src/export.rs:641`](../../ui/dr-ui/src/export.rs#L641), [`ui/dr-ui/src/export.rs:687`](../../ui/dr-ui/src/export.rs#L687), [`ui/dr-ui/src/export.rs:715`](../../ui/dr-ui/src/export.rs#L715), [`ui/dr-ui/src/export.rs:839`](../../ui/dr-ui/src/export.rs#L839), [`ui/dr-ui/src/export.rs:857`](../../ui/dr-ui/src/export.rs#L857), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268), [`ui/dr-ui/src/lib.rs:291`](../../ui/dr-ui/src/lib.rs#L291), [`ui/dr-ui/src/lib.rs:639`](../../ui/dr-ui/src/lib.rs#L639), [`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:546`](../../core/dr-decode/src/lib.rs#L546), [`core/dr-export/src/lib.rs:132`](../../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1134`](../../core/dr-gpu/src/adjust.rs#L1134), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/develop.rs:4714`](../../ui/dr-ui/src/develop.rs#L4714), [`ui/dr-ui/src/develop.rs:4752`](../../ui/dr-ui/src/develop.rs#L4752), [`ui/dr-ui/src/develop.rs:7111`](../../ui/dr-ui/src/develop.rs#L7111), [`ui/dr-ui/src/lib.rs:607`](../../ui/dr-ui/src/lib.rs#L607), [`ui/dr-ui/src/library.rs:3889`](../../ui/dr-ui/src/library.rs#L3889), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | -| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1576`](../../ui/dr-ui/src/lib.rs#L1576), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1721`](../../ui/dr-ui/ui/app.slint#L1721), [`ui/dr-ui/ui/app.slint:829`](../../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/library.slint:1596`](../../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4277`](../../ui/dr-ui/ui/library.slint#L4277), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | +| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1576`](../../ui/dr-ui/src/lib.rs#L1576), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1721`](../../ui/dr-ui/ui/app.slint#L1721), [`ui/dr-ui/ui/app.slint:829`](../../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/library.slint:1596`](../../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4284`](../../ui/dr-ui/ui/library.slint#L4284), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | | FR-MRG-10 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1) | | FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1) | | FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1) | | FR-MRG-3 | [`core/dr-decode/examples/linear_dng.rs:1`](../../core/dr-decode/examples/linear_dng.rs#L1), [`core/dr-decode/src/lib.rs:137`](../../core/dr-decode/src/lib.rs#L137), [`core/dr-decode/src/lib.rs:144`](../../core/dr-decode/src/lib.rs#L144), [`core/dr-decode/src/lib.rs:598`](../../core/dr-decode/src/lib.rs#L598), [`core/dr-decode/src/profile.rs:395`](../../core/dr-decode/src/profile.rs#L395), [`core/dr-export/src/dng.rs:1`](../../core/dr-export/src/dng.rs#L1), [`core/dr-gpu/src/demosaic.rs:254`](../../core/dr-gpu/src/demosaic.rs#L254), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1) | -| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4457`](../../ui/dr-ui/src/library.rs#L4457), [`ui/dr-ui/src/library.rs:4461`](../../ui/dr-ui/src/library.rs#L4461), [`ui/dr-ui/src/merge.rs:143`](../../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../../ui/dr-ui/ui/merge.slint#L46) | +| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library.rs:4478`](../../ui/dr-ui/src/library.rs#L4478), [`ui/dr-ui/src/library.rs:4482`](../../ui/dr-ui/src/library.rs#L4482), [`ui/dr-ui/src/merge.rs:143`](../../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../../ui/dr-ui/ui/merge.slint#L46) | | FR-MRG-5 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | | FR-MRG-6 | [`core/dr-pipeline/src/sidecar.rs:1033`](../../core/dr-pipeline/src/sidecar.rs#L1033), [`core/dr-pipeline/src/sidecar.rs:113`](../../core/dr-pipeline/src/sidecar.rs#L113), [`core/dr-pipeline/src/sidecar.rs:123`](../../core/dr-pipeline/src/sidecar.rs#L123), [`core/dr-pipeline/src/sidecar.rs:2241`](../../core/dr-pipeline/src/sidecar.rs#L2241), [`core/dr-pipeline/src/sidecar.rs:841`](../../core/dr-pipeline/src/sidecar.rs#L841), [`ui/dr-ui/src/merge.rs:842`](../../ui/dr-ui/src/merge.rs#L842) | | FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:829`](../../ui/dr-ui/ui/app.slint#L829), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) | @@ -119,15 +119,15 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:129`](../../core/dr-sync/src/scan.rs#L129), [`ui/dr-ui/src/launch.rs:61`](../../ui/dr-ui/src/launch.rs#L61) | | FR-NC-5 | [`core/dr-sync-nextcloud/src/propfind.rs:51`](../../core/dr-sync-nextcloud/src/propfind.rs#L51), [`ui/dr-ui/src/import.rs: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:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../../core/dr-catalog/src/schema.rs#L1637), [`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:1350`](../../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:2487`](../../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:2558`](../../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:3852`](../../ui/dr-ui/src/lib.rs#L3852), [`ui/dr-ui/src/lib.rs:3853`](../../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:3892`](../../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/library.rs:2173`](../../ui/dr-ui/src/library.rs#L2173), [`ui/dr-ui/src/library.rs:2196`](../../ui/dr-ui/src/library.rs#L2196), [`ui/dr-ui/src/library.rs:2471`](../../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2652`](../../ui/dr-ui/src/library.rs#L2652), [`ui/dr-ui/src/library.rs:2789`](../../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6881`](../../ui/dr-ui/src/library_ui.rs#L6881), [`ui/dr-ui/src/library_ui.rs:6899`](../../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/library_ui.rs:709`](../../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:1610`](../../ui/dr-ui/ui/app.slint#L1610), [`ui/dr-ui/ui/app.slint:3163`](../../ui/dr-ui/ui/app.slint#L3163), [`ui/dr-ui/ui/app.slint:541`](../../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/app.slint:549`](../../ui/dr-ui/ui/app.slint#L549), [`ui/dr-ui/ui/app.slint:555`](../../ui/dr-ui/ui/app.slint#L555), [`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), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) | +| 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:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../../core/dr-catalog/src/schema.rs#L1637), [`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:3032`](../../ui/dr-ui/src/collections_ui.rs#L3032), [`ui/dr-ui/src/collections_ui.rs:3274`](../../ui/dr-ui/src/collections_ui.rs#L3274), [`ui/dr-ui/src/collections_ui.rs:4175`](../../ui/dr-ui/src/collections_ui.rs#L4175), [`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:1350`](../../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:2487`](../../ui/dr-ui/src/lib.rs#L2487), [`ui/dr-ui/src/lib.rs:2558`](../../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:3852`](../../ui/dr-ui/src/lib.rs#L3852), [`ui/dr-ui/src/lib.rs:3853`](../../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:3892`](../../ui/dr-ui/src/lib.rs#L3892), [`ui/dr-ui/src/library.rs:2173`](../../ui/dr-ui/src/library.rs#L2173), [`ui/dr-ui/src/library.rs:2196`](../../ui/dr-ui/src/library.rs#L2196), [`ui/dr-ui/src/library.rs:2471`](../../ui/dr-ui/src/library.rs#L2471), [`ui/dr-ui/src/library.rs:2652`](../../ui/dr-ui/src/library.rs#L2652), [`ui/dr-ui/src/library.rs:2789`](../../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6881`](../../ui/dr-ui/src/library_ui.rs#L6881), [`ui/dr-ui/src/library_ui.rs:6899`](../../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/library_ui.rs:709`](../../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:1610`](../../ui/dr-ui/ui/app.slint#L1610), [`ui/dr-ui/ui/app.slint:3163`](../../ui/dr-ui/ui/app.slint#L3163), [`ui/dr-ui/ui/app.slint:541`](../../ui/dr-ui/ui/app.slint#L541), [`ui/dr-ui/ui/app.slint:549`](../../ui/dr-ui/ui/app.slint#L549), [`ui/dr-ui/ui/app.slint:555`](../../ui/dr-ui/ui/app.slint#L555), [`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), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) | | FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`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:1042`](../../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library.rs:1084`](../../ui/dr-ui/src/library.rs#L1084), [`ui/dr-ui/src/library.rs:2293`](../../ui/dr-ui/src/library.rs#L2293), [`ui/dr-ui/src/library.rs:2383`](../../ui/dr-ui/src/library.rs#L2383), [`ui/dr-ui/src/library.rs:4060`](../../ui/dr-ui/src/library.rs#L4060), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../../ui/dr-ui/src/repairs.rs#L1140), [`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-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:4175`](../../ui/dr-ui/src/collections_ui.rs#L4175), [`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:1042`](../../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library.rs:1084`](../../ui/dr-ui/src/library.rs#L1084), [`ui/dr-ui/src/library.rs:2293`](../../ui/dr-ui/src/library.rs#L2293), [`ui/dr-ui/src/library.rs:2383`](../../ui/dr-ui/src/library.rs#L2383), [`ui/dr-ui/src/library.rs:4060`](../../ui/dr-ui/src/library.rs#L4060), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../../ui/dr-ui/src/repairs.rs#L1140), [`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:120`](../../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library.rs:3940`](../../ui/dr-ui/src/library.rs#L3940), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435) | | FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs: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:1559`](../../ui/dr-ui/src/lib.rs#L1559), [`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:1559`](../../ui/dr-ui/src/lib.rs#L1559) | -| 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:929`](../../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7554`](../../ui/dr-ui/src/library.rs#L7554), [`ui/dr-ui/src/library.rs:824`](../../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336) | -| 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:929`](../../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`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:1070`](../../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:7386`](../../ui/dr-ui/src/library.rs#L7386), [`ui/dr-ui/src/library.rs:73`](../../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7554`](../../ui/dr-ui/src/library.rs#L7554), [`ui/dr-ui/src/library.rs:824`](../../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287) | +| 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:929`](../../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:327`](../../core/dr-catalog/src/schema.rs#L327), [`core/dr-pipeline/src/sidecar.rs:137`](../../core/dr-pipeline/src/sidecar.rs#L137), [`core/dr-pipeline/src/sidecar.rs:2991`](../../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:660`](../../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:735`](../../core/dr-pipeline/src/sidecar.rs#L735), [`core/dr-pipeline/src/sidecar.rs:96`](../../core/dr-pipeline/src/sidecar.rs#L96), [`ui/dr-ui/src/lib.rs:2457`](../../ui/dr-ui/src/lib.rs#L2457), [`ui/dr-ui/src/library.rs:1126`](../../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:2582`](../../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:564`](../../ui/dr-ui/src/library.rs#L564), [`ui/dr-ui/src/library.rs:7572`](../../ui/dr-ui/src/library.rs#L7572), [`ui/dr-ui/src/library.rs:824`](../../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336) | +| 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:929`](../../core/dr-catalog/src/rating.rs#L929), [`core/dr-catalog/src/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:327`](../../core/dr-catalog/src/schema.rs#L327), [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`core/dr-catalog/src/sync.rs:1`](../../core/dr-catalog/src/sync.rs#L1), [`core/dr-pipeline/src/sidecar.rs:192`](../../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:2520`](../../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:2757`](../../core/dr-pipeline/src/sidecar.rs#L2757), [`core/dr-pipeline/src/sidecar.rs:2991`](../../core/dr-pipeline/src/sidecar.rs#L2991), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:493`](../../core/dr-pipeline/src/sidecar.rs#L493), [`core/dr-pipeline/src/sidecar.rs:660`](../../core/dr-pipeline/src/sidecar.rs#L660), [`core/dr-pipeline/src/sidecar.rs:710`](../../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:735`](../../core/dr-pipeline/src/sidecar.rs#L735), [`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-nextcloud/src/lib.rs:139`](../../core/dr-sync-nextcloud/src/lib.rs#L139), [`core/dr-sync/src/scan.rs:31`](../../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`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:1070`](../../ui/dr-ui/src/derived_sync.rs#L1070), [`ui/dr-ui/src/derived_sync.rs:613`](../../ui/dr-ui/src/derived_sync.rs#L613), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/derived_sync.rs:675`](../../ui/dr-ui/src/derived_sync.rs#L675), [`ui/dr-ui/src/derived_sync.rs:821`](../../ui/dr-ui/src/derived_sync.rs#L821), [`ui/dr-ui/src/library.rs:1126`](../../ui/dr-ui/src/library.rs#L1126), [`ui/dr-ui/src/library.rs:1146`](../../ui/dr-ui/src/library.rs#L1146), [`ui/dr-ui/src/library.rs:1455`](../../ui/dr-ui/src/library.rs#L1455), [`ui/dr-ui/src/library.rs:1490`](../../ui/dr-ui/src/library.rs#L1490), [`ui/dr-ui/src/library.rs:2582`](../../ui/dr-ui/src/library.rs#L2582), [`ui/dr-ui/src/library.rs:73`](../../ui/dr-ui/src/library.rs#L73), [`ui/dr-ui/src/library.rs:7404`](../../ui/dr-ui/src/library.rs#L7404), [`ui/dr-ui/src/library.rs:7572`](../../ui/dr-ui/src/library.rs#L7572), [`ui/dr-ui/src/library.rs:824`](../../ui/dr-ui/src/library.rs#L824), [`ui/dr-ui/src/library.rs:896`](../../ui/dr-ui/src/library.rs#L896), [`ui/dr-ui/src/library.rs:980`](../../ui/dr-ui/src/library.rs#L980), [`ui/dr-ui/src/library_ui.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/presets.rs:288`](../../ui/dr-ui/src/presets.rs#L288), [`ui/dr-ui/src/presets.rs:336`](../../ui/dr-ui/src/presets.rs#L336), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287) | | 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:211`](../../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../../core/dr-sync/src/scan.rs#L519), [`core/dr-sync/src/scan.rs:545`](../../core/dr-sync/src/scan.rs#L545), [`core/dr-sync/src/scan.rs:574`](../../core/dr-sync/src/scan.rs#L574), [`ui/dr-ui/src/library.rs:1355`](../../ui/dr-ui/src/library.rs#L1355), [`ui/dr-ui/src/library.rs:1408`](../../ui/dr-ui/src/library.rs#L1408), [`ui/dr-ui/src/library.rs:1439`](../../ui/dr-ui/src/library.rs#L1439), [`ui/dr-ui/src/library.rs:2019`](../../ui/dr-ui/src/library.rs#L2019), [`ui/dr-ui/src/library_ui.rs:1310`](../../ui/dr-ui/src/library_ui.rs#L1310), [`ui/dr-ui/src/library_ui.rs:1406`](../../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:2005`](../../ui/dr-ui/src/library_ui.rs#L2005), [`ui/dr-ui/src/library_ui.rs:328`](../../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:573`](../../ui/dr-ui/src/library_ui.rs#L573) | | 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) | @@ -143,17 +143,17 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:268`](../../ui/dr-ui/src/lib.rs#L268) | | FR-RAW-5 | [`core/dr-decode/src/lib.rs:183`](../../core/dr-decode/src/lib.rs#L183), [`core/dr-gpu/src/demosaic.rs:34`](../../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:734`](../../core/dr-gpu/src/demosaic.rs#L734), [`core/dr-gpu/src/demosaic.rs:813`](../../core/dr-gpu/src/demosaic.rs#L813), [`core/dr-gpu/src/demosaic.rs:937`](../../core/dr-gpu/src/demosaic.rs#L937) | | FR-UI-1 | [`core/dr-types/src/settings.rs:1377`](../../core/dr-types/src/settings.rs#L1377), [`core/dr-types/src/settings.rs:492`](../../core/dr-types/src/settings.rs#L492), [`core/dr-types/src/settings.rs:512`](../../core/dr-types/src/settings.rs#L512), [`ui/dr-ui/src/lib.rs:108`](../../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/lib.rs:123`](../../ui/dr-ui/src/lib.rs#L123), [`ui/dr-ui/src/lib.rs:145`](../../ui/dr-ui/src/lib.rs#L145), [`ui/dr-ui/src/lib.rs:2711`](../../ui/dr-ui/src/lib.rs#L2711), [`ui/dr-ui/src/lib.rs:4043`](../../ui/dr-ui/src/lib.rs#L4043), [`ui/dr-ui/src/lib.rs:4062`](../../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/src/lib.rs:4089`](../../ui/dr-ui/src/lib.rs#L4089), [`ui/dr-ui/src/lib.rs:4140`](../../ui/dr-ui/src/lib.rs#L4140), [`ui/dr-ui/src/lib.rs:4173`](../../ui/dr-ui/src/lib.rs#L4173), [`ui/dr-ui/src/masks_ui.rs:1471`](../../ui/dr-ui/src/masks_ui.rs#L1471), [`ui/dr-ui/src/settings_ui.rs:179`](../../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:1010`](../../ui/dr-ui/ui/app.slint#L1010), [`ui/dr-ui/ui/app.slint:2842`](../../ui/dr-ui/ui/app.slint#L2842), [`ui/dr-ui/ui/app.slint:906`](../../ui/dr-ui/ui/app.slint#L906), [`ui/dr-ui/ui/identity.slint:246`](../../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:108`](../../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../../ui/dr-ui/ui/app.slint#L994), [`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:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`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:136`](../../ui/dr-ui/ui/settings.slint#L136) | -| 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:2859`](../../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`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:5325`](../../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../../ui/dr-ui/ui/app.slint#L712), [`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:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`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), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) | +| 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:1288`](../../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:2064`](../../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2793`](../../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:3688`](../../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/gestures.rs:1`](../../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:108`](../../ui/dr-ui/src/lib.rs#L108), [`ui/dr-ui/src/library_ui.rs:6766`](../../ui/dr-ui/src/library_ui.rs#L6766), [`ui/dr-ui/src/library_ui.rs:8257`](../../ui/dr-ui/src/library_ui.rs#L8257), [`ui/dr-ui/ui/app.slint:594`](../../ui/dr-ui/ui/app.slint#L594), [`ui/dr-ui/ui/app.slint:608`](../../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:71`](../../ui/dr-ui/ui/app.slint#L71), [`ui/dr-ui/ui/app.slint:994`](../../ui/dr-ui/ui/app.slint#L994), [`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:2628`](../../ui/dr-ui/ui/library.slint#L2628), [`ui/dr-ui/ui/library.slint:4377`](../../ui/dr-ui/ui/library.slint#L4377), [`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:136`](../../ui/dr-ui/ui/settings.slint#L136) | +| 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:2793`](../../ui/dr-ui/src/collections_ui.rs#L2793), [`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:2859`](../../ui/dr-ui/src/develop.rs#L2859), [`ui/dr-ui/src/develop.rs:3247`](../../ui/dr-ui/src/develop.rs#L3247), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`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:2385`](../../ui/dr-ui/ui/app.slint#L2385), [`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:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`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:126`](../../ui/dr-ui/src/collections_ui.rs#L126), [`ui/dr-ui/src/collections_ui.rs:1288`](../../ui/dr-ui/src/collections_ui.rs#L1288), [`ui/dr-ui/src/collections_ui.rs:1298`](../../ui/dr-ui/src/collections_ui.rs#L1298), [`ui/dr-ui/src/collections_ui.rs:154`](../../ui/dr-ui/src/collections_ui.rs#L154), [`ui/dr-ui/src/collections_ui.rs:1795`](../../ui/dr-ui/src/collections_ui.rs#L1795), [`ui/dr-ui/src/collections_ui.rs:1812`](../../ui/dr-ui/src/collections_ui.rs#L1812), [`ui/dr-ui/src/collections_ui.rs:1928`](../../ui/dr-ui/src/collections_ui.rs#L1928), [`ui/dr-ui/src/collections_ui.rs:2064`](../../ui/dr-ui/src/collections_ui.rs#L2064), [`ui/dr-ui/src/collections_ui.rs:2091`](../../ui/dr-ui/src/collections_ui.rs#L2091), [`ui/dr-ui/src/collections_ui.rs:209`](../../ui/dr-ui/src/collections_ui.rs#L209), [`ui/dr-ui/src/collections_ui.rs:2207`](../../ui/dr-ui/src/collections_ui.rs#L2207), [`ui/dr-ui/src/collections_ui.rs:2793`](../../ui/dr-ui/src/collections_ui.rs#L2793), [`ui/dr-ui/src/collections_ui.rs:2847`](../../ui/dr-ui/src/collections_ui.rs#L2847), [`ui/dr-ui/src/collections_ui.rs:3300`](../../ui/dr-ui/src/collections_ui.rs#L3300), [`ui/dr-ui/src/collections_ui.rs:3688`](../../ui/dr-ui/src/collections_ui.rs#L3688), [`ui/dr-ui/src/collections_ui.rs:3725`](../../ui/dr-ui/src/collections_ui.rs#L3725), [`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:5325`](../../ui/dr-ui/src/develop.rs#L5325), [`ui/dr-ui/src/develop.rs:5350`](../../ui/dr-ui/src/develop.rs#L5350), [`ui/dr-ui/src/develop.rs:5361`](../../ui/dr-ui/src/develop.rs#L5361), [`ui/dr-ui/src/develop.rs:5375`](../../ui/dr-ui/src/develop.rs#L5375), [`ui/dr-ui/src/develop.rs:6603`](../../ui/dr-ui/src/develop.rs#L6603), [`ui/dr-ui/src/develop.rs:6634`](../../ui/dr-ui/src/develop.rs#L6634), [`ui/dr-ui/src/develop.rs:6655`](../../ui/dr-ui/src/develop.rs#L6655), [`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:1350`](../../ui/dr-ui/src/lib.rs#L1350), [`ui/dr-ui/src/lib.rs:1944`](../../ui/dr-ui/src/lib.rs#L1944), [`ui/dr-ui/src/lib.rs:2368`](../../ui/dr-ui/src/lib.rs#L2368), [`ui/dr-ui/src/lib.rs:2558`](../../ui/dr-ui/src/lib.rs#L2558), [`ui/dr-ui/src/lib.rs:2618`](../../ui/dr-ui/src/lib.rs#L2618), [`ui/dr-ui/src/lib.rs:3284`](../../ui/dr-ui/src/lib.rs#L3284), [`ui/dr-ui/src/lib.rs:3853`](../../ui/dr-ui/src/lib.rs#L3853), [`ui/dr-ui/src/lib.rs:4277`](../../ui/dr-ui/src/lib.rs#L4277), [`ui/dr-ui/src/lib.rs:460`](../../ui/dr-ui/src/lib.rs#L460), [`ui/dr-ui/src/lib.rs:489`](../../ui/dr-ui/src/lib.rs#L489), [`ui/dr-ui/src/library.rs:2789`](../../ui/dr-ui/src/library.rs#L2789), [`ui/dr-ui/src/library.rs:2804`](../../ui/dr-ui/src/library.rs#L2804), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5970`](../../ui/dr-ui/src/library_ui.rs#L5970), [`ui/dr-ui/src/library_ui.rs:5998`](../../ui/dr-ui/src/library_ui.rs#L5998), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6899`](../../ui/dr-ui/src/library_ui.rs#L6899), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:524`](../../ui/dr-ui/src/settings_ui.rs#L524), [`ui/dr-ui/ui/app.slint:171`](../../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2080`](../../ui/dr-ui/ui/app.slint#L2080), [`ui/dr-ui/ui/app.slint:2202`](../../ui/dr-ui/ui/app.slint#L2202), [`ui/dr-ui/ui/app.slint:2609`](../../ui/dr-ui/ui/app.slint#L2609), [`ui/dr-ui/ui/app.slint:2742`](../../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:3213`](../../ui/dr-ui/ui/app.slint#L3213), [`ui/dr-ui/ui/app.slint:570`](../../ui/dr-ui/ui/app.slint#L570), [`ui/dr-ui/ui/app.slint:599`](../../ui/dr-ui/ui/app.slint#L599), [`ui/dr-ui/ui/app.slint:608`](../../ui/dr-ui/ui/app.slint#L608), [`ui/dr-ui/ui/app.slint:712`](../../ui/dr-ui/ui/app.slint#L712), [`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:2628`](../../ui/dr-ui/ui/library.slint#L2628), [`ui/dr-ui/ui/library.slint:4231`](../../ui/dr-ui/ui/library.slint#L4231), [`ui/dr-ui/ui/library.slint:4318`](../../ui/dr-ui/ui/library.slint#L4318), [`ui/dr-ui/ui/library.slint:4377`](../../ui/dr-ui/ui/library.slint#L4377), [`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), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) | | 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:3329`](../../ui/dr-ui/src/lib.rs#L3329), [`ui/dr-ui/src/lib.rs:4237`](../../ui/dr-ui/src/lib.rs#L4237), [`ui/dr-ui/src/lib.rs:4428`](../../ui/dr-ui/src/lib.rs#L4428), [`ui/dr-ui/src/masks_ui.rs:1518`](../../ui/dr-ui/src/masks_ui.rs#L1518), [`ui/dr-ui/ui/app.slint:2569`](../../ui/dr-ui/ui/app.slint#L2569), [`ui/dr-ui/ui/app.slint:2609`](../../ui/dr-ui/ui/app.slint#L2609), [`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:492`](../../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop.rs:1330`](../../ui/dr-ui/src/develop.rs#L1330), [`ui/dr-ui/src/lib.rs:4062`](../../ui/dr-ui/src/lib.rs#L4062), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2325`](../../ui/dr-ui/ui/app.slint#L2325), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:216`](../../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4708`](../../ui/dr-ui/src/library.rs#L4708), [`ui/dr-ui/src/library.rs:5476`](../../ui/dr-ui/src/library.rs#L5476), [`ui/dr-ui/src/library.rs:5542`](../../ui/dr-ui/src/library.rs#L5542), [`ui/dr-ui/src/library_ui.rs:1007`](../../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../../ui/dr-ui/src/library_ui.rs#L968), [`ui/dr-ui/src/place.rs:1`](../../ui/dr-ui/src/place.rs#L1) | +| 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:216`](../../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../../ui/dr-ui/src/derived_sync.rs#L986), [`ui/dr-ui/src/library.rs:1187`](../../ui/dr-ui/src/library.rs#L1187), [`ui/dr-ui/src/library.rs:4726`](../../ui/dr-ui/src/library.rs#L4726), [`ui/dr-ui/src/library.rs:5494`](../../ui/dr-ui/src/library.rs#L5494), [`ui/dr-ui/src/library.rs:5560`](../../ui/dr-ui/src/library.rs#L5560), [`ui/dr-ui/src/library_ui.rs:1007`](../../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6143`](../../ui/dr-ui/src/library_ui.rs#L6143), [`ui/dr-ui/src/library_ui.rs:6366`](../../ui/dr-ui/src/library_ui.rs#L6366), [`ui/dr-ui/src/library_ui.rs:7120`](../../ui/dr-ui/src/library_ui.rs#L7120), [`ui/dr-ui/src/library_ui.rs:935`](../../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../../ui/dr-ui/src/library_ui.rs#L968), [`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:2742`](../../ui/dr-ui/ui/app.slint#L2742), [`ui/dr-ui/ui/app.slint:2780`](../../ui/dr-ui/ui/app.slint#L2780) | | 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/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1) | -| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1822`](../../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/src/lib.rs:2847`](../../ui/dr-ui/src/lib.rs#L2847), [`ui/dr-ui/ui/app.slint:1150`](../../ui/dr-ui/ui/app.slint#L1150), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) | +| NFR-ARCH-3 | [`ui/dr-ui/src/export.rs:1822`](../../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/src/lib.rs:2847`](../../ui/dr-ui/src/lib.rs#L2847), [`ui/dr-ui/ui/app.slint:1150`](../../ui/dr-ui/ui/app.slint#L1150), [`ui/dr-ui/ui/library.slint:4339`](../../ui/dr-ui/ui/library.slint#L4339) | | 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:521`](../../ui/dr-ui/src/export.rs#L521) | | NFR-COMPAT-1 | [`core/dr-gpu/src/lib.rs:286`](../../core/dr-gpu/src/lib.rs#L286) | | NFR-OPS-1 | [`core/dr-gpu/src/lib.rs:339`](../../core/dr-gpu/src/lib.rs#L339), [`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:1241`](../../ui/dr-ui/src/lib.rs#L1241), [`ui/dr-ui/ui/app.slint:1473`](../../ui/dr-ui/ui/app.slint#L1473), [`ui/dr-ui/ui/app.slint:75`](../../ui/dr-ui/ui/app.slint#L75), [`ui/dr-ui/ui/settings.slint:1015`](../../ui/dr-ui/ui/settings.slint#L1015), [`ui/dr-ui/ui/settings.slint:154`](../../ui/dr-ui/ui/settings.slint#L154) | @@ -163,7 +163,7 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc | 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:4238`](../../ui/dr-ui/src/develop.rs#L4238), [`ui/dr-ui/src/lib.rs:2153`](../../ui/dr-ui/src/lib.rs#L2153) | | NFR-P3 | [`tools/bench/src/thumbnails.rs:1`](../../tools/bench/src/thumbnails.rs#L1) | -| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4815`](../../ui/dr-ui/src/library.rs#L4815), [`ui/dr-ui/src/library.rs:5978`](../../ui/dr-ui/src/library.rs#L5978), [`ui/dr-ui/src/library_ui.rs:5005`](../../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../../ui/dr-ui/src/library_ui.rs#L64) | +| NFR-P5 | [`core/dr-catalog/src/schema.rs:564`](../../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library.rs:4833`](../../ui/dr-ui/src/library.rs#L4833), [`ui/dr-ui/src/library.rs:5996`](../../ui/dr-ui/src/library.rs#L5996), [`ui/dr-ui/src/library_ui.rs:5005`](../../ui/dr-ui/src/library_ui.rs#L5005), [`ui/dr-ui/src/library_ui.rs:64`](../../ui/dr-ui/src/library_ui.rs#L64) | | NFR-P9 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/references.rs:1`](../../core/dr-face/src/references.rs#L1), [`ui/dr-ui/src/collections_ui.rs:1`](../../ui/dr-ui/src/collections_ui.rs#L1), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/library.rs:1`](../../ui/dr-ui/src/library.rs#L1), [`ui/dr-ui/src/library_ui.rs:1`](../../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/trash.rs:1`](../../ui/dr-ui/src/trash.rs#L1) | | NFR-PORT-1 | [`core/dr-catalog/src/walk.rs:1`](../../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:272`](../../core/dr-types/src/lib.rs#L272), [`core/dr-types/src/lib.rs:305`](../../core/dr-types/src/lib.rs#L305), [`platform/dr-plat/src/dirs.rs:1`](../../platform/dr-plat/src/dirs.rs#L1), [`platform/dr-plat/src/display.rs:1`](../../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/storage.rs:1`](../../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:287`](../../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:344`](../../platform/dr-plat/src/storage.rs#L344), [`platform/dr-plat/src/volumes.rs:1`](../../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../../platform/dr-plat/src/volumes.rs#L62) | | NFR-PORT-2 | [`core/dr-gpu/src/lib.rs:1`](../../core/dr-gpu/src/lib.rs#L1) |