Files
DarkRoom/docs/traceability.md
T
dtourolleandClaude Opus 5 ce201c7dd6 Name the two spaces a photograph lives in, so a turn cannot go the wrong way
Every orientation bug this codebase has had has been the same bug: a turn of
the right size applied in the wrong direction. That failure is worth naming
precisely, because it does not look like one — a quarter turn applied
backwards lands 180 degrees from right, so the result is a plausible
transform of the picture rather than anything obviously broken, and on
landscape frames it is not wrong at all. It was the straighten shear, and it
was the segmentation overlay, and each time it was found by eye rather than
by a test.

The reason it keeps happening is that "rotate 90 degrees clockwise" cannot be
checked by reading it. The reader has to hold in their head which of the two
images is being rotated and which way the y axis runs, and there were four
hand-written copies of the permutation to hold it for: the shader prologue,
its CPU twin, the thumbnail path, and the segmentation.

So nothing added here says clockwise, anticlockwise, horizontal or vertical.
The functions say *which space they take and which space they return* —
`into_shown` and `into_stored`, `source_pixel` and `shown_pixel`,
`into_shown_rect` and `into_stored_rect` — and each takes the dimensions of
the space it reads from, so no caller has to work out which pair it is
holding. `StoredRect` and `ShownRect` are separate types because they are the
same four numbers meaning different things, which is exactly the case where a
mistake is silent: a shown rect measured against stored dimensions produces a
rectangle in the wrong place, not an error.

Underneath there is one permutation. `source_pixel` was already shared by the
prologue and the thumbnails; `source_point` is its normalised twin, written
beside it so the two cannot drift, and everything else is those two read
forwards or backwards. `Orientation::inverse` is the group inverse rather
than `4 - turns`: mirrors apply after the turn, so undoing means undoing them
first, and a mirror seen from the far side of an odd turn is about the other
axis. That is the diagonal-mirror case, tags 5 and 7, and getting it wrong
renders as — again — 180 degrees.

Three call sites lose their own copy: the thumbnail path, `dr-ui`'s
segmentation, and `dr-gpu`'s `local` example. "Upright" now means one thing
across the application rather than one thing per caller.

The gate that matters most is `the_render_and_the_orientation_map_agree`. The
shader prologue and `Orientation` answer the same question by different
routes, and until now nothing checked that they answered it the same way. It
now checks every EXIF tag against every user rotation and mirror on top of
it, because the composition is where the two could agree singly and disagree
together.

The rest earn their place by having caught something. Writing these found two
real errors in this commit's own new code before it ran anywhere: `shown_pixel`
was handed the dimensions of the wrong space and overflowed, and the rect map
turned the wrong way for the diagonal mirrors. A round trip that returns what
went in is the only check worth having here, since every wrong answer is
still a picture.

No behaviour changes. The permutations are the ones that were already being
applied; they are simply applied from one place now.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 09:46:24 +02:00

73 KiB

Requirements traceability matrix

Denominators are parsed from requirements.md at run time, never hardcoded. Coverage is the intersection of tagged and defined IDs over defined IDs, so it cannot exceed 100%.

Summary

Metric Value
Source files scanned 237
TRACES tags found 716
Requirements defined 177
Requirements covered 92
Coverage 52.0% (92/177)

By type

Type Covered Defined
FR 73 122
NFR 17 49
R 2 6

Orphan tags

A tag naming an ID requirements.md does not define — what renumbering produces, and what a typo produces.

None.

Tagged requirements

ID Tagged in
FR-CAT-1 core/dr-catalog/src/scan.rs:1, core/dr-catalog/src/walk.rs:109, core/dr-catalog/src/walk.rs:162, core/dr-catalog/src/walk.rs:1, core/dr-sync/src/scan.rs:93, core/dr-types/src/lib.rs:200, core/dr-types/src/lib.rs:269, core/dr-types/src/lib.rs:302, tools/traceability/src/lib.rs:479, tools/traceability/src/lib.rs:511, ui/dr-ui/src/activity.rs:1, ui/dr-ui/src/library.rs:1
FR-CAT-10 core/dr-ingest/src/layout.rs:1, core/dr-ingest/src/lib.rs:1, core/dr-ingest/src/lib.rs:733, core/dr-types/src/settings.rs:116, ui/dr-ui/src/import.rs:1, ui/dr-ui/src/import.rs:337, ui/dr-ui/src/import_ui.rs:1, ui/dr-ui/src/lib.rs:1048, ui/dr-ui/ui/import.slint:5, ui/dr-ui/ui/library.slint:1007, ui/dr-ui/ui/library.slint:1161, ui/dr-ui/ui/library.slint:857
FR-CAT-11 core/dr-catalog/src/dedup.rs:1, core/dr-ingest/src/lib.rs:1, core/dr-ingest/src/lib.rs:392, core/dr-sync/src/upload.rs:40, ui/dr-ui/src/import.rs:1, ui/dr-ui/src/import_ui.rs:1, ui/dr-ui/src/lib.rs:1048, ui/dr-ui/src/library.rs:152, ui/dr-ui/src/library.rs:2122, ui/dr-ui/ui/import.slint:5
FR-CAT-12 core/dr-pipeline/src/sidecar.rs:118
FR-CAT-13 core/dr-catalog/src/keywords.rs:1
FR-CAT-15 core/dr-catalog/src/schema.rs:422, core/dr-catalog/src/trash.rs:1, core/dr-sync-nextcloud/src/lib.rs:447, core/dr-sync/src/lib.rs:124, core/dr-sync/src/scan.rs:426, core/dr-sync/src/scan.rs:57, core/dr-thumbs/src/lib.rs:376, ui/dr-ui/src/collections_ui.rs:1225, ui/dr-ui/src/collections_ui.rs:1995, ui/dr-ui/src/library.rs:152, ui/dr-ui/src/library.rs:169, ui/dr-ui/src/library.rs:198, ui/dr-ui/src/library.rs:3007, ui/dr-ui/src/library.rs:3041, ui/dr-ui/src/library_ui.rs:184, ui/dr-ui/src/library_ui.rs:757, ui/dr-ui/src/trash.rs:1, ui/dr-ui/ui/collections.slint:572
FR-CAT-1a core/dr-catalog/src/walk.rs:1, core/dr-types/src/lib.rs:53
FR-CAT-2 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/schema.rs:1, tools/traceability/src/lib.rs:479
FR-CAT-3 core/dr-catalog/src/jobs.rs:1, core/dr-catalog/src/walk.rs:66, core/dr-sync/src/scan.rs:69, core/dr-thumbs/src/codec.rs:1, core/dr-thumbs/src/lib.rs:1, ui/dr-ui/src/derived_sync.rs:1, ui/dr-ui/src/import.rs:464, ui/dr-ui/src/import.rs:489, ui/dr-ui/src/library.rs:2598, ui/dr-ui/src/library.rs:2624, ui/dr-ui/src/library_ui.rs:171, ui/dr-ui/src/library_ui.rs:3608, ui/dr-ui/src/library_ui.rs:4574, ui/dr-ui/ui/app.slint:526, ui/dr-ui/ui/settings.slint:340, ui/dr-ui/ui/settings.slint:72
FR-CAT-4 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/query.rs:1, core/dr-catalog/src/schema.rs:292, ui/dr-ui/src/library.rs:179, ui/dr-ui/src/library.rs:1, ui/dr-ui/src/library_ui.rs:1
FR-CAT-5 core/dr-catalog/src/keywords.rs:1, core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/rating.rs:1, core/dr-catalog/src/schema.rs:337, core/dr-catalog/src/schema.rs:840, core/dr-decode/src/lib.rs:285, core/dr-decode/src/lib.rs:404, core/dr-pipeline/src/sidecar.rs:135, ui/dr-ui/src/collections_ui.rs:1578, ui/dr-ui/src/collections_ui.rs:1597, ui/dr-ui/src/collections_ui.rs:243, ui/dr-ui/src/collections_ui.rs:340, ui/dr-ui/src/collections_ui.rs:89, ui/dr-ui/src/library.rs:3055, ui/dr-ui/src/library_ui.rs:6255, ui/dr-ui/src/library_ui.rs:6266, ui/dr-ui/src/library_ui.rs:6279, ui/dr-ui/src/library_ui.rs:628, ui/dr-ui/src/library_ui.rs:6294, ui/dr-ui/src/library_ui.rs:6303, ui/dr-ui/ui/app.slint:471, ui/dr-ui/ui/app.slint:600, ui/dr-ui/ui/library.slint:1209, ui/dr-ui/ui/library.slint:1212, ui/dr-ui/ui/library.slint:18, ui/dr-ui/ui/library.slint:850, ui/dr-ui/ui/library.slint:901
FR-CAT-6 core/dr-catalog/src/collections.rs:1, core/dr-catalog/src/keywords.rs:1, core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/query.rs:1, core/dr-catalog/src/rating.rs:1, core/dr-catalog/src/schema.rs:337, core/dr-types/src/selector.rs:1, core/dr-types/src/settings.rs:63, core/dr-types/src/time.rs:67, core/dr-types/src/time.rs:90, ui/dr-ui/src/library.rs:203, ui/dr-ui/src/library.rs:3301, ui/dr-ui/src/library_ui.rs:315, ui/dr-ui/src/library_ui.rs:387, ui/dr-ui/src/library_ui.rs:5124, ui/dr-ui/src/library_ui.rs:5177, ui/dr-ui/src/library_ui.rs:6395, ui/dr-ui/ui/app.slint:474, ui/dr-ui/ui/app.slint:600, ui/dr-ui/ui/app.slint:839, ui/dr-ui/ui/library.slint:109, ui/dr-ui/ui/library.slint:1278, ui/dr-ui/ui/library.slint:901, ui/dr-ui/ui/settings.slint:115
FR-CAT-7 core/dr-catalog/src/collections.rs:1, core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/sync.rs:1, core/dr-types/src/selector.rs:1, ui/dr-ui/src/collections_ui.rs:1693, ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/derived_sync.rs:1, ui/dr-ui/src/library_ui.rs:3466, ui/dr-ui/src/library_ui.rs:4164, ui/dr-ui/ui/app.slint:595, ui/dr-ui/ui/collections.slint:4, ui/dr-ui/ui/library.slint:2516, ui/dr-ui/ui/library.slint:872, ui/dr-ui/ui/library.slint:891
FR-CAT-8 core/dr-pipeline/src/graph.rs:345, core/dr-pipeline/src/graph.rs:384, core/dr-pipeline/src/ops/curve.rs:136, core/dr-pipeline/src/ops/curve.rs:652, core/dr-pipeline/src/sidecar.rs:1627, core/dr-pipeline/src/sidecar.rs:92, core/dr-pipeline/src/state.rs:1, core/dr-pipeline/src/state.rs:75, core/dr-pipeline/tests/tone_curve.rs:34, ui/dr-ui/src/develop.rs:3187, ui/dr-ui/src/develop.rs:3216, ui/dr-ui/src/export.rs:752, ui/dr-ui/src/lib.rs:1285, ui/dr-ui/src/lib.rs:1658, ui/dr-ui/src/lib.rs:1763, ui/dr-ui/src/lib.rs:470, ui/dr-ui/src/lib.rs:895, ui/dr-ui/src/library.rs:1545, ui/dr-ui/src/library.rs:364, ui/dr-ui/src/library.rs:411, ui/dr-ui/src/library.rs:448, ui/dr-ui/src/library.rs:696, ui/dr-ui/src/library_ui.rs:4866, ui/dr-ui/src/sidecar_cache.rs:1
FR-CAT-9 core/dr-catalog/src/cache.rs:1, core/dr-catalog/src/scan.rs:1, core/dr-catalog/src/schema.rs:394, core/dr-catalog/src/walk.rs:162, core/dr-catalog/src/walk.rs:1, core/dr-catalog/src/walk.rs:435, core/dr-catalog/src/walk.rs:704, core/dr-sync-nextcloud/src/desktop_client.rs:30, core/dr-sync/src/reachability.rs:1, core/dr-types/src/lib.rs:119, ui/dr-ui/src/develop.rs:2712, ui/dr-ui/src/library.rs:138, ui/dr-ui/src/library.rs:1505, ui/dr-ui/src/library.rs:1582, ui/dr-ui/src/library.rs:220, ui/dr-ui/src/library.rs:3408, ui/dr-ui/src/library.rs:448, ui/dr-ui/src/library.rs:680, ui/dr-ui/src/library.rs:696, ui/dr-ui/src/library.rs:750, ui/dr-ui/src/library_ui.rs:1564, ui/dr-ui/src/library_ui.rs:1590, ui/dr-ui/src/library_ui.rs:1606, ui/dr-ui/src/library_ui.rs:1700, ui/dr-ui/src/library_ui.rs:226, ui/dr-ui/src/library_ui.rs:2316, ui/dr-ui/src/library_ui.rs:259, ui/dr-ui/src/library_ui.rs:2754, ui/dr-ui/src/library_ui.rs:2976, ui/dr-ui/src/library_ui.rs:3257, ui/dr-ui/src/library_ui.rs:3329, ui/dr-ui/src/library_ui.rs:3517, ui/dr-ui/src/library_ui.rs:3635, ui/dr-ui/src/library_ui.rs:440, ui/dr-ui/src/library_ui.rs:498, ui/dr-ui/src/library_ui.rs:5222, ui/dr-ui/src/library_ui.rs:5337, ui/dr-ui/src/presets.rs:326, ui/dr-ui/src/presets.rs:338, ui/dr-ui/src/sidecar_cache.rs:1
FR-CULL-1 core/dr-decode/src/preview.rs:121
FR-CULL-2 core/dr-decode/src/locate.rs:1, core/dr-decode/src/preview.rs:148, ui/dr-ui/src/import.rs:464
FR-CULL-4 core/dr-catalog/src/rating.rs:1, core/dr-pipeline/src/sidecar.rs:135, ui/dr-ui/src/library.rs:203, ui/dr-ui/src/library.rs:364
FR-DEV-2 core/dr-pipeline/src/operation.rs:352
FR-DEV-3 core/dr-gpu/src/adjust.rs:2165, core/dr-gpu/src/adjust.rs:651, core/dr-gpu/src/adjust.rs:770, core/dr-gpu/src/adjust.rs:84, core/dr-gpu/tests/tone_curve.rs:1, core/dr-pipeline/src/detail.rs:387, core/dr-pipeline/src/detail.rs:465, core/dr-pipeline/src/framing.rs:188, core/dr-pipeline/src/framing.rs:362, core/dr-pipeline/src/framing.rs:617, core/dr-pipeline/src/graph.rs:169, core/dr-pipeline/src/graph.rs:573, core/dr-pipeline/src/mask.rs:120, core/dr-pipeline/src/operation.rs:299, core/dr-pipeline/src/operation.rs:479, core/dr-pipeline/src/ops/capture_sharpen.rs:1, core/dr-pipeline/src/ops/capture_sharpen.rs:207, core/dr-pipeline/src/ops/curve.rs:1, core/dr-pipeline/src/ops/curve.rs:218, core/dr-pipeline/src/ops/curve.rs:631, core/dr-pipeline/src/ops/curve.rs:99, core/dr-pipeline/src/ops/local_contrast.rs:1, core/dr-pipeline/src/ops/noise_reduction.rs:1, core/dr-pipeline/src/ops/noise_reduction.rs:270, core/dr-pipeline/src/sidecar.rs:156, core/dr-pipeline/src/sidecar.rs:1627, core/dr-pipeline/src/sidecar.rs:1687, core/dr-pipeline/tests/tone_curve.rs:1, ui/dr-ui/src/develop.rs:101, ui/dr-ui/src/develop.rs:1196, ui/dr-ui/src/develop.rs:144, ui/dr-ui/src/develop.rs:1674, ui/dr-ui/src/develop.rs:1690, ui/dr-ui/src/develop.rs:1712, ui/dr-ui/src/develop.rs:1858, ui/dr-ui/src/develop.rs:1956, ui/dr-ui/src/develop.rs:258, ui/dr-ui/src/develop.rs:295, ui/dr-ui/src/develop.rs:3187, ui/dr-ui/src/develop.rs:3751, ui/dr-ui/src/develop.rs:3805, ui/dr-ui/src/develop.rs:3849, ui/dr-ui/src/develop.rs:3899, ui/dr-ui/src/develop.rs:546, ui/dr-ui/src/develop.rs:593, ui/dr-ui/src/lib.rs:1342, ui/dr-ui/src/lib.rs:2013, ui/dr-ui/src/lib.rs:291, ui/dr-ui/src/library.rs:411, ui/dr-ui/src/masks_ui.rs:218, ui/dr-ui/src/masks_ui.rs:41, ui/dr-ui/src/masks_ui.rs:816, ui/dr-ui/src/masks_ui.rs:930, ui/dr-ui/src/segmentation.rs:219, ui/dr-ui/src/segmentation.rs:322, ui/dr-ui/src/segmentation.rs:350, ui/dr-ui/ui/app.slint:1997, ui/dr-ui/ui/app.slint:926
FR-DEV-3a core/dr-pipeline/build.rs:1807, core/dr-pipeline/ops/exposure.yaml:1, core/dr-pipeline/src/descriptor.rs:117, core/dr-pipeline/src/descriptor.rs:157, core/dr-pipeline/src/descriptor.rs:177, core/dr-pipeline/src/descriptor.rs:232, core/dr-pipeline/src/framing.rs:259, core/dr-pipeline/src/graph.rs:23, core/dr-pipeline/src/graph.rs:250, core/dr-pipeline/src/graph.rs:45, core/dr-pipeline/src/graph.rs:58, core/dr-pipeline/src/mask.rs:954, core/dr-pipeline/src/operation.rs:328, core/dr-pipeline/src/ops/curve.rs:318, ui/dr-ui/src/develop.rs:1093, ui/dr-ui/src/lib.rs:585
FR-DEV-3b core/dr-pipeline/src/descriptor.rs:177, core/dr-pipeline/src/framing.rs:259, core/dr-pipeline/src/graph.rs:58, core/dr-pipeline/src/operation.rs:328
FR-DEV-3c core/dr-pipeline/build.rs:1807, core/dr-pipeline/ops/exposure.yaml:1, core/dr-pipeline/src/graph.rs:250, core/dr-pipeline/src/graph.rs:45, core/dr-pipeline/src/mask.rs:954, ui/dr-ui/src/develop.rs:4478
FR-DEV-3d core/dr-gpu/src/adjust.rs:1041, core/dr-gpu/src/adjust.rs:104, core/dr-gpu/src/adjust.rs:770, core/dr-gpu/src/adjust.rs:84, core/dr-gpu/src/adjust.rs:986, core/dr-gpu/tests/capture_sharpen.rs:434, core/dr-gpu/tests/detail_stage.rs:242, core/dr-gpu/tests/local_contrast.rs:476, core/dr-gpu/tests/noise_reduction.rs:556, core/dr-pipeline/src/framing.rs:188, core/dr-pipeline/src/graph.rs:612, core/dr-pipeline/src/operation.rs:31, core/dr-pipeline/src/operation.rs:352, core/dr-pipeline/src/operation.rs:52, core/dr-pipeline/src/operation.rs:70
FR-DEV-3e core/dr-decode/src/base_curve.rs:145, core/dr-decode/src/base_curve.rs:158, core/dr-decode/src/base_curve.rs:1, core/dr-decode/src/base_curve.rs:267, core/dr-decode/src/base_curve.rs:347, core/dr-decode/src/base_curve.rs:55, core/dr-decode/src/lib.rs:121, core/dr-decode/src/lib.rs:708, core/dr-decode/src/lib.rs:748, core/dr-decode/src/profile.rs:102, core/dr-decode/src/profile.rs:151, core/dr-decode/src/profile.rs:1, core/dr-decode/src/profile.rs:235, core/dr-decode/src/profile.rs:286, core/dr-decode/src/profile.rs:343, core/dr-decode/src/profile.rs:458, core/dr-decode/src/profile.rs:492, core/dr-decode/src/profile.rs:630, core/dr-gpu/src/adjust.rs:37, core/dr-gpu/src/adjust.rs:967, core/dr-gpu/src/demosaic.rs:121, core/dr-gpu/src/demosaic.rs:86, core/dr-gpu/tests/base_curve.rs:1, core/dr-pipeline/src/operation.rs:1424, core/dr-pipeline/src/operation.rs:1505, core/dr-pipeline/src/operation.rs:1530, core/dr-pipeline/src/operation.rs:1545, core/dr-pipeline/src/operation.rs:1569, core/dr-pipeline/src/operation.rs:279, core/dr-pipeline/src/operation.rs:403, core/dr-pipeline/src/operation.rs:413, core/dr-pipeline/src/operation.rs:563
FR-DEV-3f core/dr-film/src/bake.rs:271, core/dr-film/src/bake.rs:62, core/dr-film/src/boolean_grain.rs:1, core/dr-film/src/boolean_grain.rs:78, core/dr-film/src/grain.rs:140, core/dr-film/src/grain.rs:1, core/dr-film/src/grain.rs:302, core/dr-film/src/grain.rs:79, core/dr-film/src/lib.rs:160, core/dr-film/src/lib.rs:1, core/dr-film/src/profile.rs:100, core/dr-film/src/profile.rs:142, core/dr-film/src/profile.rs:182, core/dr-film/src/profile.rs:259, core/dr-film/src/profile.rs:502, core/dr-film/src/profile.rs:73, core/dr-gpu/src/adjust.rs:139, core/dr-gpu/src/adjust.rs:196, core/dr-gpu/src/adjust.rs:357, core/dr-gpu/src/adjust.rs:483, core/dr-gpu/src/adjust.rs:77, core/dr-gpu/tests/film_sim.rs:191, core/dr-gpu/tests/film_sim.rs:1, core/dr-pipeline/src/graph.rs:101, core/dr-pipeline/src/graph.rs:124, core/dr-pipeline/src/graph.rs:324, core/dr-pipeline/src/operation.rs:1028, core/dr-pipeline/src/operation.rs:1057, core/dr-pipeline/src/operation.rs:1424, core/dr-pipeline/src/operation.rs:265, core/dr-pipeline/src/operation.rs:279, core/dr-pipeline/src/ops/film_sim.rs:126, core/dr-pipeline/src/ops/film_sim.rs:150, core/dr-pipeline/src/ops/film_sim.rs:1, core/dr-pipeline/src/ops/film_sim.rs:328, core/dr-pipeline/src/ops/film_sim.rs:42, core/dr-pipeline/src/ops/film_sim.rs:85, core/dr-pipeline/src/ops/film_sim.rs:90, core/dr-pipeline/src/sidecar.rs:111, core/dr-pipeline/src/sidecar.rs:167, core/dr-pipeline/src/sidecar.rs:1948, core/dr-pipeline/src/sidecar.rs:2024, core/dr-pipeline/src/sidecar.rs:533, core/dr-pipeline/src/sidecar.rs:660, core/dr-pipeline/src/sidecar.rs:792, core/dr-pipeline/src/state.rs:100, core/dr-pipeline/src/state.rs:115, core/dr-pipeline/src/state.rs:60, ui/dr-ui/src/develop.rs:2727, ui/dr-ui/src/develop.rs:2744, ui/dr-ui/src/develop.rs:2756, ui/dr-ui/src/develop.rs:2794, ui/dr-ui/src/develop.rs:2803, ui/dr-ui/src/develop.rs:2906, ui/dr-ui/src/develop.rs:3224, ui/dr-ui/src/develop.rs:3239, ui/dr-ui/src/lib.rs:1987, ui/dr-ui/src/lib.rs:518, ui/dr-ui/src/lib.rs:576, ui/dr-ui/src/library.rs:402, ui/dr-ui/src/library.rs:651, ui/dr-ui/src/presets.rs:275, ui/dr-ui/ui/adjust.slint:889, ui/dr-ui/ui/adjust.slint:959, ui/dr-ui/ui/app.slint:2609, ui/dr-ui/ui/app.slint:720
FR-DEV-3h core/dr-decode/src/lib.rs:404, core/dr-decode/src/preview.rs:29, core/dr-pipeline/src/framing.rs:202, core/dr-pipeline/src/framing.rs:362, core/dr-pipeline/src/framing.rs:924, core/dr-types/src/lib.rs:336, core/dr-types/src/lib.rs:444, core/dr-types/src/lib.rs:456, core/dr-types/src/lib.rs:472, ui/dr-ui/src/develop.rs:119, ui/dr-ui/src/develop.rs:1875, ui/dr-ui/src/segmentation.rs:322
FR-DEV-4 core/dr-gpu/src/adjust.rs:770, core/dr-gpu/src/lib.rs:217
FR-DEV-5 core/dr-pipeline/src/graph.rs:345, core/dr-pipeline/src/graph.rs:384, core/dr-pipeline/src/history.rs:102, core/dr-pipeline/src/history.rs:110, core/dr-pipeline/src/history.rs:127, core/dr-pipeline/src/history.rs:184, core/dr-pipeline/src/history.rs:1, core/dr-pipeline/src/history.rs:214, core/dr-pipeline/src/history.rs:234, core/dr-pipeline/src/history.rs:293, core/dr-pipeline/src/history.rs:479, core/dr-pipeline/src/history.rs:489, core/dr-pipeline/src/history.rs:499, core/dr-pipeline/src/history.rs:526, core/dr-pipeline/src/history.rs:86, core/dr-pipeline/src/state.rs:1, core/dr-pipeline/src/state.rs:75, ui/dr-ui/src/develop.rs:2756, ui/dr-ui/src/develop.rs:3239, ui/dr-ui/src/develop.rs:3269, ui/dr-ui/src/develop.rs:3282, ui/dr-ui/src/develop.rs:3294, ui/dr-ui/src/develop.rs:3310, ui/dr-ui/src/develop.rs:3342, ui/dr-ui/src/develop.rs:3346, ui/dr-ui/src/develop.rs:3365, ui/dr-ui/src/develop.rs:3381, ui/dr-ui/src/develop.rs:528, ui/dr-ui/src/labels.rs:12, ui/dr-ui/src/labels.rs:215, ui/dr-ui/src/lib.rs:1306, ui/dr-ui/src/lib.rs:1320, ui/dr-ui/src/lib.rs:1328, ui/dr-ui/src/lib.rs:2173, ui/dr-ui/ui/history.slint:1
FR-DEV-6 core/dr-pipeline/src/preset.rs:1, core/dr-types/src/settings.rs:182, ui/dr-ui/src/develop.rs:3181, ui/dr-ui/src/develop.rs:3202, ui/dr-ui/src/lib.rs:1285, ui/dr-ui/src/library.rs:1545, ui/dr-ui/src/library.rs:364, ui/dr-ui/src/library.rs:392, ui/dr-ui/src/library_ui.rs:2576, ui/dr-ui/src/library_ui.rs:2976, ui/dr-ui/src/library_ui.rs:466, ui/dr-ui/src/presets.rs:1, ui/dr-ui/src/settings_ui.rs:535, ui/dr-ui/ui/adjust.slint:598, ui/dr-ui/ui/library.slint:1305, ui/dr-ui/ui/library.slint:831, ui/dr-ui/ui/library.slint:912, ui/dr-ui/ui/settings.slint:87
FR-DEV-7 core/dr-pipeline/src/history.rs:214, core/dr-pipeline/src/history.rs:499, core/dr-pipeline/src/history.rs:526, ui/dr-ui/src/develop.rs:3310, ui/dr-ui/src/develop.rs:3342, ui/dr-ui/src/lib.rs:1328, ui/dr-ui/src/lib.rs:2173, ui/dr-ui/ui/history.slint:1
FR-DEV-8 core/dr-gpu/src/detail.rs:252, core/dr-gpu/src/detail.rs:434, core/dr-gpu/tests/detail_instances.rs:1, core/dr-gpu/tests/spot_removal.rs:1, core/dr-pipeline/src/detail.rs:363, core/dr-pipeline/src/detail.rs:387, core/dr-pipeline/src/detail.rs:422, core/dr-pipeline/src/detail.rs:496, core/dr-pipeline/src/graph.rs:113, core/dr-pipeline/src/graph.rs:191, core/dr-pipeline/src/graph.rs:681, core/dr-pipeline/src/operation.rs:299, core/dr-pipeline/src/operation.rs:517, core/dr-pipeline/src/sidecar.rs:183, core/dr-pipeline/src/sidecar.rs:352, core/dr-pipeline/src/sidecar.rs:672, core/dr-pipeline/src/sidecar.rs:808, core/dr-pipeline/src/sidecar.rs:862, core/dr-pipeline/src/sidecar.rs:892, core/dr-pipeline/src/spot.rs:115, core/dr-pipeline/src/spot.rs:151, core/dr-pipeline/src/spot.rs:1, core/dr-pipeline/src/spot.rs:207, core/dr-pipeline/src/spot.rs:387, core/dr-pipeline/src/spot.rs:472, core/dr-pipeline/src/spot.rs:582, core/dr-pipeline/src/spot.rs:673, core/dr-pipeline/src/state.rs:103, core/dr-pipeline/tests/spot_sidecar.rs:1, core/dr-pipeline/tests/spots.rs:1, ui/dr-ui/src/develop.rs:2027, ui/dr-ui/src/develop.rs:2065, ui/dr-ui/src/develop.rs:2130, ui/dr-ui/src/develop.rs:2213, ui/dr-ui/src/develop.rs:2227, ui/dr-ui/src/develop.rs:576, ui/dr-ui/src/labels.rs:52, ui/dr-ui/src/lib.rs:1349, ui/dr-ui/src/lib.rs:2270, ui/dr-ui/src/lib.rs:296, ui/dr-ui/src/spots_ui.rs:19, ui/dr-ui/src/spots_ui.rs:1, ui/dr-ui/src/spots_ui.rs:265, ui/dr-ui/ui/adjust.slint:676, ui/dr-ui/ui/app.slint:1732, ui/dr-ui/ui/app.slint:2249, ui/dr-ui/ui/app.slint:2515, ui/dr-ui/ui/app.slint:318, ui/dr-ui/ui/spots.slint:48, ui/dr-ui/ui/spots.slint:5
FR-DSP-1 core/dr-gpu/src/adjust.rs:2088, core/dr-gpu/src/adjust.rs:2165, core/dr-gpu/src/adjust.rs:2250, core/dr-gpu/src/adjust.rs:54, core/dr-gpu/src/adjust.rs:770, core/dr-gpu/src/lib.rs:54, core/dr-gpu/src/lib.rs:94, core/dr-gpu/tests/capture_sharpen.rs:200, core/dr-gpu/tests/detail_stage.rs:328, core/dr-gpu/tests/local_contrast.rs:263, core/dr-gpu/tests/noise_reduction.rs:378, core/dr-pipeline/src/detail.rs:136, core/dr-pipeline/src/detail.rs:465, core/dr-pipeline/src/graph.rs:543, core/dr-pipeline/src/graph.rs:573, core/dr-pipeline/src/ops/capture_sharpen.rs:1, core/dr-pipeline/src/ops/capture_sharpen.rs:654, core/dr-pipeline/src/ops/local_contrast.rs:1, core/dr-pipeline/src/ops/local_contrast.rs:662, core/dr-pipeline/src/ops/noise_reduction.rs:695, core/dr-pipeline/src/spot.rs:673, ui/dr-ui/src/develop.rs:2527, ui/dr-ui/src/develop.rs:3540, ui/dr-ui/src/develop.rs:4023, ui/dr-ui/src/develop.rs:4057, ui/dr-ui/src/lib.rs:60, ui/dr-ui/src/lib.rs:726, ui/dr-ui/src/lib.rs:785
FR-DSP-6 core/dr-pipeline/src/operation.rs:446, core/dr-types/src/colour.rs:1
FR-DSP-7 core/dr-gpu/src/histogram.rs:147, core/dr-gpu/src/histogram.rs:1, core/dr-gpu/src/histogram.rs:281, core/dr-gpu/src/histogram.rs:50, core/dr-gpu/src/shaders/histogram.wgsl:1, ui/dr-ui/src/develop.rs:2593, ui/dr-ui/src/develop.rs:5125, ui/dr-ui/src/develop.rs:5157, ui/dr-ui/src/develop.rs:539, ui/dr-ui/src/histogram.rs:1, ui/dr-ui/src/lib.rs:1405, ui/dr-ui/src/lib.rs:286, ui/dr-ui/ui/app.slint:278, ui/dr-ui/ui/histogram.slint:122, ui/dr-ui/ui/histogram.slint:1
FR-EXP-1 core/dr-export/src/encode.rs:1, core/dr-export/src/lib.rs:1, core/dr-types/src/settings.rs:1, ui/dr-ui/src/settings_ui.rs:1
FR-EXP-2 core/dr-export/src/encode.rs:1, core/dr-export/src/error.rs:26, core/dr-export/src/icc.rs:1, core/dr-export/src/lib.rs:153, core/dr-export/src/lib.rs:1, core/dr-export/src/lib.rs:53, core/dr-gpu/src/adjust.rs:2398, core/dr-pipeline/src/graph.rs:533, core/dr-pipeline/src/graph.rs:587, core/dr-pipeline/src/operation.rs:446, core/dr-types/src/colour.rs:1, core/dr-types/src/settings.rs:1, core/dr-types/src/settings.rs:595, ui/dr-ui/src/settings_ui.rs:1
FR-EXP-3 core/dr-export/src/lib.rs:1, core/dr-export/src/size.rs:1, core/dr-export/src/size.rs:25, core/dr-types/src/settings.rs:1, ui/dr-ui/src/settings_ui.rs:1
FR-EXP-4 core/dr-export/src/lib.rs:1, core/dr-export/src/sharpen.rs:1, core/dr-export/src/size.rs:1, ui/dr-ui/src/settings_ui.rs:1
FR-EXP-5 ui/dr-ui/src/settings_store.rs:1
FR-EXP-6 core/dr-export/src/lib.rs:1, core/dr-export/src/name.rs:1, core/dr-types/src/settings.rs:1, ui/dr-ui/src/export.rs:1, ui/dr-ui/src/lib.rs:334, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/src/settings_ui.rs:48, ui/dr-ui/src/settings_ui.rs:590
FR-EXP-7 ui/dr-ui/src/activity.rs:83, ui/dr-ui/src/export.rs:1, ui/dr-ui/src/export.rs:944, ui/dr-ui/src/lib.rs:176, ui/dr-ui/src/lib.rs:1929, ui/dr-ui/src/lib.rs:334, ui/dr-ui/src/lib.rs:369, ui/dr-ui/src/lib.rs:396, ui/dr-ui/src/library_ui.rs:3346, ui/dr-ui/src/library_ui.rs:557, ui/dr-ui/src/library_ui.rs:6237, ui/dr-ui/src/library_ui.rs:6314, ui/dr-ui/src/library_ui.rs:6326, ui/dr-ui/src/library_ui.rs:660, ui/dr-ui/src/library_ui.rs:717, ui/dr-ui/ui/app.slint:1062, ui/dr-ui/ui/app.slint:1442, ui/dr-ui/ui/library.slint:1313, ui/dr-ui/ui/library.slint:835, ui/dr-ui/ui/library.slint:927
FR-EXP-8 core/dr-decode/src/lib.rs:326, core/dr-decode/src/lib.rs:350, core/dr-decode/src/lib.rs:364, core/dr-decode/src/lib.rs:71, core/dr-decode/src/lib.rs:79, core/dr-decode/src/lib.rs:82, core/dr-decode/src/locate.rs:1164, core/dr-decode/src/locate.rs:1223, core/dr-decode/src/locate.rs:316, core/dr-decode/src/locate.rs:487, core/dr-decode/src/locate.rs:571, core/dr-decode/src/locate.rs:584, core/dr-decode/src/locate.rs:667, core/dr-export/examples/export.rs:99, core/dr-export/src/encode.rs:117, core/dr-export/src/encode.rs:161, core/dr-export/src/encode.rs:1, core/dr-export/src/encode.rs:206, core/dr-export/src/encode.rs:235, core/dr-export/src/encode.rs:311, core/dr-export/src/encode.rs:325, core/dr-export/src/encode.rs:408, core/dr-export/src/encode.rs:456, core/dr-export/src/encode.rs:70, core/dr-export/src/encode.rs:795, core/dr-export/src/encode.rs:809, core/dr-export/src/encode.rs:850, core/dr-export/src/encode.rs:898, core/dr-export/src/exif.rs:1, core/dr-export/src/lib.rs:136, core/dr-export/src/metadata.rs:1, core/dr-export/src/metadata.rs:41, core/dr-export/src/metadata.rs:74, core/dr-types/src/lib.rs:652, core/dr-types/src/settings.rs:313, ui/dr-ui/src/export.rs:620, ui/dr-ui/src/export.rs:648, ui/dr-ui/src/export.rs:779, ui/dr-ui/src/export.rs:796, ui/dr-ui/src/settings_ui.rs:1
FR-EXP-9 core/dr-decode/src/lib.rs:506, core/dr-export/src/lib.rs:128, core/dr-export/src/lib.rs:1, core/dr-gpu/src/adjust.rs:1068, ui/dr-ui/src/develop.rs:2671, ui/dr-ui/src/lib.rs:334
FR-NC-1 core/dr-sync-nextcloud/src/auth.rs:132, core/dr-sync-nextcloud/src/auth.rs:44, core/dr-sync-nextcloud/src/session.rs:128, ui/dr-ui/src/launch.rs:256, ui/dr-ui/src/launch.rs:49, ui/dr-ui/src/launch_ui.rs:344
FR-NC-10 ui/dr-ui/src/export.rs:1, ui/dr-ui/src/lib.rs:396, ui/dr-ui/src/library.rs:1582, ui/dr-ui/src/library.rs:448, ui/dr-ui/src/library.rs:750, ui/dr-ui/src/library.rs:947, ui/dr-ui/src/library_ui.rs:1606, ui/dr-ui/src/library_ui.rs:3346, ui/dr-ui/src/library_ui.rs:498, ui/dr-ui/src/sidecar_cache.rs:1
FR-NC-12 core/dr-sync-nextcloud/src/lib.rs:34, core/dr-sync-nextcloud/src/lib.rs:892, core/dr-sync/src/lib.rs:157, core/dr-sync/src/lib.rs:40, core/dr-sync/src/reachability.rs:1
FR-NC-2 core/dr-sync-nextcloud/src/session.rs:128, core/dr-sync-nextcloud/src/session.rs:34
FR-NC-3 core/dr-decode/src/locate.rs:1, core/dr-decode/src/preview.rs:148, core/dr-sync/src/capability.rs:41, core/dr-thumbs/src/lib.rs:1, ui/dr-ui/src/library.rs:1, ui/dr-ui/src/library.rs:2598, ui/dr-ui/src/library.rs:2624, ui/dr-ui/src/library_ui.rs:1, ui/dr-ui/src/library_ui.rs:3608, ui/dr-ui/src/library_ui.rs:4574, ui/dr-ui/ui/app.slint:526, ui/dr-ui/ui/settings.slint:340, ui/dr-ui/ui/settings.slint:72
FR-NC-4 core/dr-sync-nextcloud/src/propfind.rs:100, core/dr-sync-nextcloud/src/propfind.rs:51, core/dr-sync/src/capability.rs:6, core/dr-sync/src/lib.rs:157, core/dr-sync/src/scan.rs:93, ui/dr-ui/src/launch.rs:49
FR-NC-5 core/dr-sync-nextcloud/src/propfind.rs:51, ui/dr-ui/src/import.rs:489
FR-NC-6 ui/dr-ui/src/activity.rs:1
FR-NC-6a core/dr-catalog/src/cache.rs:1, core/dr-catalog/src/schema.rs:394, core/dr-catalog/src/schema.rs:795, core/dr-types/src/selector.rs:1, core/dr-types/src/settings.rs:1, ui/dr-ui/src/collections_ui.rs:3195, ui/dr-ui/src/collections_ui.rs:621, ui/dr-ui/src/collections_ui.rs:683, ui/dr-ui/src/lib.rs:1689, ui/dr-ui/src/lib.rs:2526, ui/dr-ui/src/library.rs:1324, ui/dr-ui/src/library.rs:1347, ui/dr-ui/src/library.rs:1505, ui/dr-ui/src/library_ui.rs:1065, ui/dr-ui/src/library_ui.rs:1138, ui/dr-ui/src/library_ui.rs:1239, ui/dr-ui/src/library_ui.rs:1294, ui/dr-ui/src/library_ui.rs:1412, ui/dr-ui/src/library_ui.rs:1531, ui/dr-ui/src/library_ui.rs:2058, ui/dr-ui/src/library_ui.rs:267, ui/dr-ui/src/library_ui.rs:278, ui/dr-ui/src/library_ui.rs:286, ui/dr-ui/src/library_ui.rs:298, ui/dr-ui/src/library_ui.rs:307, ui/dr-ui/src/library_ui.rs:399, ui/dr-ui/src/library_ui.rs:409, ui/dr-ui/src/library_ui.rs:451, ui/dr-ui/src/library_ui.rs:514, ui/dr-ui/src/library_ui.rs:5239, ui/dr-ui/src/library_ui.rs:5257, ui/dr-ui/src/library_ui.rs:5269, ui/dr-ui/src/library_ui.rs:545, ui/dr-ui/src/library_ui.rs:557, ui/dr-ui/src/settings_store.rs:1, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/ui/app.slint:2688, ui/dr-ui/ui/app.slint:589, ui/dr-ui/ui/collections.slint:249, ui/dr-ui/ui/collections.slint:369, ui/dr-ui/ui/collections.slint:52, ui/dr-ui/ui/collections.slint:682, ui/dr-ui/ui/collections.slint:84, ui/dr-ui/ui/icons.slint:260, ui/dr-ui/ui/library.slint:973
FR-NC-6b ui/dr-ui/src/library_ui.rs:1294
FR-NC-6c core/dr-sync-nextcloud/src/desktop_client.rs:30, core/dr-types/src/lib.rs:119, core/dr-types/src/lib.rs:201, ui/dr-ui/src/activity.rs:1, ui/dr-ui/src/collections_ui.rs:3195, ui/dr-ui/src/collections_ui.rs:621, ui/dr-ui/src/collections_ui.rs:683, ui/dr-ui/src/library_ui.rs:1065, ui/dr-ui/src/library_ui.rs:1138, ui/dr-ui/ui/collections.slint:249, ui/dr-ui/ui/collections.slint:682, ui/dr-ui/ui/icons.slint:260
FR-NC-7 core/dr-sync-nextcloud/src/lib.rs:95, ui/dr-ui/src/derived_sync.rs:1, ui/dr-ui/src/library.rs:2624, ui/dr-ui/src/library_ui.rs:3608, ui/dr-ui/ui/settings.slint:340
FR-NC-7a core/dr-ingest/src/layout.rs:1, core/dr-sync/src/upload.rs:1, core/dr-sync/src/upload.rs:40, core/dr-types/src/settings.rs:116, ui/dr-ui/src/import.rs:1, ui/dr-ui/src/import.rs:97, ui/dr-ui/src/import_ui.rs:1, ui/dr-ui/src/lib.rs:1048, ui/dr-ui/ui/import.slint:5
FR-NC-7b core/dr-ingest/src/lib.rs:733, core/dr-sync/src/upload.rs:1, ui/dr-ui/src/import.rs:123, ui/dr-ui/src/import.rs:337, ui/dr-ui/src/import.rs:585, ui/dr-ui/src/import.rs:97, ui/dr-ui/src/import_ui.rs:1, ui/dr-ui/src/lib.rs:1048
FR-NC-8 core/dr-pipeline/src/sidecar.rs:118, core/dr-pipeline/src/sidecar.rs:92, ui/dr-ui/src/lib.rs:1658, ui/dr-ui/src/library.rs:364, ui/dr-ui/src/library_ui.rs:466
FR-NC-9 core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/schema.rs:337, core/dr-catalog/src/sync.rs:1, core/dr-pipeline/src/sidecar.rs:156, core/dr-pipeline/src/sidecar.rs:183, core/dr-pipeline/src/sidecar.rs:2024, core/dr-pipeline/src/sidecar.rs:352, core/dr-pipeline/src/sidecar.rs:450, core/dr-pipeline/src/spot.rs:245, core/dr-pipeline/tests/spot_sidecar.rs:1, ui/dr-ui/src/library.rs:750, ui/dr-ui/src/library.rs:880
FR-PLAT-AND-1 core/dr-types/src/lib.rs:53
FR-PLAT-AND-3 core/dr-catalog/src/jobs.rs:1
FR-PLAT-LIN-1 core/dr-types/src/settings.rs:1, ui/dr-ui/src/lib.rs:835, ui/dr-ui/src/settings_store.rs:1
FR-RAW-1 core/dr-decode/src/lib.rs:243, core/dr-types/src/lib.rs:129, core/dr-types/src/lib.rs:200
FR-RAW-3 core/dr-decode/src/lib.rs:139, core/dr-decode/src/lib.rs:506, core/dr-decode/src/locate.rs:1366
FR-RAW-4 core/dr-decode/src/error.rs:1, ui/dr-ui/src/lib.rs:176
FR-RAW-5 core/dr-decode/src/lib.rs:167, core/dr-gpu/src/demosaic.rs:34, core/dr-gpu/src/demosaic.rs:602, core/dr-gpu/src/demosaic.rs:681, core/dr-gpu/src/demosaic.rs:805
FR-UI-1 ui/dr-ui/src/lib.rs:2608, ui/dr-ui/src/lib.rs:68, ui/dr-ui/src/masks_ui.rs:816, ui/dr-ui/ui/library.slint:1031
FR-UI-2 ui/dr-ui/src/collections_ui.rs:1005, ui/dr-ui/src/collections_ui.rs:118, ui/dr-ui/src/collections_ui.rs:1508, ui/dr-ui/src/collections_ui.rs:1522, ui/dr-ui/src/collections_ui.rs:1568, ui/dr-ui/src/collections_ui.rs:159, ui/dr-ui/src/collections_ui.rs:1666, ui/dr-ui/src/collections_ui.rs:485, ui/dr-ui/src/collections_ui.rs:514, ui/dr-ui/src/collections_ui.rs:995, ui/dr-ui/src/lib.rs:68, ui/dr-ui/src/library_ui.rs:286, ui/dr-ui/src/library_ui.rs:5124, ui/dr-ui/src/library_ui.rs:5269, ui/dr-ui/src/library_ui.rs:6345, ui/dr-ui/ui/app.slint:2355, ui/dr-ui/ui/app.slint:264, ui/dr-ui/ui/app.slint:619, ui/dr-ui/ui/app.slint:626, ui/dr-ui/ui/library.slint:1186, ui/dr-ui/ui/library.slint:1193, ui/dr-ui/ui/library.slint:1199, ui/dr-ui/ui/library.slint:2266, ui/dr-ui/ui/library.slint:823, ui/dr-ui/ui/library.slint:872, ui/dr-ui/ui/settings.slint:93
FR-UI-3 ui/dr-ui/src/develop.rs:1956, ui/dr-ui/src/develop.rs:2065, ui/dr-ui/src/library_ui.rs:4369, ui/dr-ui/src/masks_ui.rs:218, ui/dr-ui/src/masks_ui.rs:908, ui/dr-ui/src/masks_ui.rs:930, ui/dr-ui/src/spots_ui.rs:19, ui/dr-ui/ui/app.slint:1997, ui/dr-ui/ui/collections.slint:4, ui/dr-ui/ui/collections.slint:682
FR-UI-4 ui/dr-ui/src/collections_ui.rs:1005, ui/dr-ui/src/collections_ui.rs:118, ui/dr-ui/src/collections_ui.rs:131, ui/dr-ui/src/collections_ui.rs:1508, ui/dr-ui/src/collections_ui.rs:1522, ui/dr-ui/src/collections_ui.rs:1568, ui/dr-ui/src/collections_ui.rs:159, ui/dr-ui/src/collections_ui.rs:1666, ui/dr-ui/src/collections_ui.rs:1693, ui/dr-ui/src/collections_ui.rs:485, ui/dr-ui/src/collections_ui.rs:514, ui/dr-ui/src/collections_ui.rs:582, ui/dr-ui/src/collections_ui.rs:995, ui/dr-ui/src/library_ui.rs:4369, ui/dr-ui/src/library_ui.rs:4414, ui/dr-ui/src/library_ui.rs:4517, ui/dr-ui/src/library_ui.rs:4545, ui/dr-ui/src/library_ui.rs:5257, ui/dr-ui/src/library_ui.rs:5269, ui/dr-ui/ui/app.slint:1669, ui/dr-ui/ui/app.slint:595, ui/dr-ui/ui/app.slint:626, ui/dr-ui/ui/library.slint:1186, ui/dr-ui/ui/library.slint:1193, ui/dr-ui/ui/library.slint:1199, ui/dr-ui/ui/library.slint:2266, ui/dr-ui/ui/library.slint:823, ui/dr-ui/ui/library.slint:872, ui/dr-ui/ui/library.slint:891
FR-UI-5 ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/lib.rs:2235, ui/dr-ui/src/lib.rs:2642, ui/dr-ui/src/lib.rs:2827, ui/dr-ui/src/masks_ui.rs:863, ui/dr-ui/ui/app.slint:299, ui/dr-ui/ui/collections.slint:4
FR-UI-7 core/dr-pipeline/src/descriptor.rs:100, core/dr-pipeline/src/framing.rs:259
NFR-ARCH-2 core/dr-catalog/src/jobs.rs:1
NFR-ARCH-3 ui/dr-ui/src/export.rs:1555, ui/dr-ui/src/export.rs:1581, ui/dr-ui/src/export.rs:410, ui/dr-ui/src/export.rs:436, ui/dr-ui/src/lib.rs:1963, ui/dr-ui/ui/app.slint:1073, ui/dr-ui/ui/library.slint:927
NFR-ARCH-4 core/dr-catalog/src/error.rs:1, core/dr-export/src/error.rs:1, core/dr-thumbs/src/error.rs:1, ui/dr-ui/src/export.rs:500
NFR-OPS-1 tools/traceability/src/lib.rs:266
NFR-P1 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/scan.rs:1, core/dr-catalog/src/walk.rs:162, core/dr-catalog/src/walk.rs:1, tools/traceability/src/lib.rs:479
NFR-P13 core/dr-decode/src/preview.rs:121
NFR-P5 core/dr-catalog/src/schema.rs:292, ui/dr-ui/src/library.rs:3141, ui/dr-ui/src/library.rs:3914, ui/dr-ui/src/library_ui.rs:4054, ui/dr-ui/src/library_ui.rs:64
NFR-P9 ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/export.rs:944, ui/dr-ui/src/library.rs:1, ui/dr-ui/src/library_ui.rs:1, ui/dr-ui/src/trash.rs:1
NFR-PORT-1 core/dr-catalog/src/walk.rs:1, core/dr-types/src/lib.rs:269, core/dr-types/src/lib.rs:302
NFR-R1 core/dr-catalog/src/sync.rs:1, ui/dr-ui/src/library.rs:947
NFR-R2 core/dr-catalog/src/trash.rs:1
NFR-R5 core/dr-catalog/src/collections.rs:1, core/dr-catalog/src/error.rs:1, core/dr-catalog/src/keywords.rs:1, core/dr-catalog/src/schema.rs:1
NFR-R7 core/dr-gpu/src/error.rs:1
NFR-R8 core/dr-gpu/src/error.rs:1
NFR-RES-1 core/dr-pipeline/src/history.rs:86, ui/dr-ui/src/lib.rs:60
NFR-RES-4 core/dr-catalog/src/cache.rs:1, core/dr-catalog/src/schema.rs:394, core/dr-thumbs/src/codec.rs:1, core/dr-thumbs/src/lib.rs:1, core/dr-thumbs/src/lib.rs:376, ui/dr-ui/src/library.rs:2598
NFR-SEC-1 core/dr-decode/src/error.rs:1
R1 tools/traceability/src/lib.rs:495, tools/traceability/src/lib.rs:499
R4 core/dr-gpu/src/lib.rs:217

Not yet tagged

85 of 177 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-10
  • FR-CULL-11
  • FR-CULL-12
  • FR-CULL-3
  • FR-CULL-5
  • FR-CULL-6
  • FR-CULL-7
  • FR-CULL-8
  • FR-CULL-9
  • FR-DEV-1
  • FR-DEV-3g
  • FR-DSP-2
  • FR-DSP-3
  • FR-DSP-4
  • FR-DSP-5
  • FR-DSP-8
  • FR-NC-11
  • FR-PLAT-AND-2
  • FR-PLAT-AND-4
  • FR-PLAT-AND-5
  • FR-PLAT-AND-6
  • FR-PLAT-LIN-2
  • FR-PLAT-LIN-3
  • FR-PLG-1
  • FR-PLG-10
  • FR-PLG-11
  • FR-PLG-12
  • FR-PLG-1a
  • FR-PLG-2
  • FR-PLG-2a
  • FR-PLG-2b
  • FR-PLG-2c
  • FR-PLG-2d
  • 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
  • FR-PLG-9
  • FR-RAW-2
  • FR-UI-6
  • NFR-A11Y-1
  • NFR-A11Y-2
  • NFR-A11Y-3
  • NFR-ARCH-1
  • NFR-COMPAT-1
  • NFR-COMPAT-2
  • NFR-OPS-2
  • NFR-OPS-3
  • NFR-OPS-4
  • NFR-P10
  • NFR-P11
  • NFR-P12
  • NFR-P14
  • NFR-P15
  • NFR-P2
  • NFR-P3
  • NFR-P4
  • NFR-P6
  • NFR-P7
  • NFR-P8
  • NFR-PORT-2
  • NFR-PORT-3
  • NFR-R3
  • NFR-R4
  • NFR-R6
  • NFR-RES-2
  • NFR-RES-3
  • NFR-SEC-2
  • NFR-SEC-3
  • NFR-SEC-4
  • NFR-SEC-5
  • NFR-SEC-6
  • R2
  • R3
  • R5
  • R6