Files
DarkRoom/docs/traceability.md
T
dtourolleandClaude Opus 5 7407a82aa7 Let an operation read the pixel next to it, and settle where sharpening belongs
The fused pass hands a fragment a colour and no coordinate. That is what buys
one dispatch for a whole edit, and it is also a wall: sharpening, noise
reduction, clarity, texture, dehaze and spot removal are each defined by what
the neighbours are doing, and FR-DEV-3 and FR-DEV-8 ask for all six. None of
them could be written at any price.

So there is now a detail stage. An operation implements `Operation` for its
parameters exactly as before — the panel, the sidecar, the history and the
presets all work unchanged — and additionally returns `Affects::Detail` and a
`DetailStage` yielding one pass per dispatch. `Affects` grows the third variant
`docs/requirements.md:250` designed and nothing had cut.

Where the stage sits is a colour-science decision, not an arrangement of
convenience. It runs after every point operation and every mask layer, so an
amount chosen against a tone curve survives the curve moving; in linear sRGB
after the camera matrix, because camera RGB has no luminance to sharpen
against; and before the output transform and the clip, because FR-DEV-2 allows
one quantisation and a highlight clipped before a convolution grows a dark
ring. The fused pass therefore ends one of two ways, and when a detail stage
follows it hands on unclipped f16 and the last detail pass encodes.

At render resolution rather than on the source, which is the whole of FR-DSP-1:
a pass before the framing prologue would cost 24 MP to draw a 2 MP preview.
`RenderScale` is what makes that survivable — a radius is stored as a fraction
of the frame's shorter edge, exactly as a mask feather already is, or as a
count of source pixels, and converted per render. It also reports when a radius
is smaller than a proxy pixel rather than drawing a plausible lie; zooming to
1:1 makes the preview exact with no second path.

`Invalidation` gives FR-DEV-3d something to mean. Moving a detail parameter
leaves the colour key alone, so `AdjustPass` keeps the linear intermediate and
skips the fused dispatch: dragging a sharpening slider costs a convolution.
Moving exposure does re-run the detail passes, because they read what the
colour pass wrote, and there is no arrangement of keys that avoids it while
keeping sharpening after tone.

Validated by a separable box blur that is not a develop operation, behind the
`detail-probe` feature and absent from a shipping build. An abstraction with no
consumer is a guess; a box blur's answer is known in closed form, so the tests
assert every byte of the ramp rather than that the edge got softer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:39:35 +02:00

42 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 152
TRACES tags found 364
Requirements defined 151
Requirements covered 85
Coverage 56.3% (85/151)

By type

Type Covered Defined
FR 67 97
NFR 16 48
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:196, core/dr-types/src/lib.rs:265, core/dr-types/src/lib.rs:298, 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-11 ui/dr-ui/src/library.rs:152
FR-CAT-12 core/dr-pipeline/src/sidecar.rs:109
FR-CAT-15 core/dr-catalog/src/schema.rs:258, core/dr-catalog/src/trash.rs:1, core/dr-sync-nextcloud/src/lib.rs:447, core/dr-sync/src/lib.rs:122, 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:1171, ui/dr-ui/src/collections_ui.rs:1846, ui/dr-ui/src/library.rs:152, ui/dr-ui/src/library.rs:169, ui/dr-ui/src/library.rs:2576, ui/dr-ui/src/library.rs:2608, ui/dr-ui/src/library_ui.rs:123, ui/dr-ui/src/library_ui.rs:637, 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:49
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
FR-CAT-4 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/query.rs:1, ui/dr-ui/src/library.rs:1, ui/dr-ui/src/library_ui.rs:1
FR-CAT-5 core/dr-catalog/src/rating.rs:1, core/dr-decode/src/lib.rs:243, core/dr-decode/src/lib.rs:310, core/dr-pipeline/src/sidecar.rs:126
FR-CAT-6 core/dr-catalog/src/collections.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-types/src/selector.rs:1, ui/dr-ui/src/library.rs:179
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:1544, ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/derived_sync.rs:1, ui/dr-ui/ui/app.slint:570, ui/dr-ui/ui/collections.slint:4, ui/dr-ui/ui/library.slint:668, ui/dr-ui/ui/library.slint:687
FR-CAT-8 core/dr-pipeline/src/sidecar.rs:90, ui/dr-ui/src/develop.rs:1770, ui/dr-ui/src/export.rs:697, ui/dr-ui/src/lib.rs:1065, ui/dr-ui/src/lib.rs:1405, ui/dr-ui/src/lib.rs:1510, ui/dr-ui/src/lib.rs:460, ui/dr-ui/src/lib.rs:748, ui/dr-ui/src/library.rs:1475, ui/dr-ui/src/library.rs:340, ui/dr-ui/src/library.rs:398, ui/dr-ui/src/library.rs:626, ui/dr-ui/src/library_ui.rs:4071, 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:230, 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:115, ui/dr-ui/src/develop.rs:1478, ui/dr-ui/src/library.rs:138, ui/dr-ui/src/library.rs:1435, ui/dr-ui/src/library.rs:1512, ui/dr-ui/src/library.rs:196, ui/dr-ui/src/library.rs:2791, ui/dr-ui/src/library.rs:398, ui/dr-ui/src/library.rs:610, ui/dr-ui/src/library.rs:626, ui/dr-ui/src/library.rs:680, ui/dr-ui/src/library_ui.rs:1443, ui/dr-ui/src/library_ui.rs:1469, ui/dr-ui/src/library_ui.rs:1485, ui/dr-ui/src/library_ui.rs:1579, ui/dr-ui/src/library_ui.rs:165, ui/dr-ui/src/library_ui.rs:198, ui/dr-ui/src/library_ui.rs:2112, ui/dr-ui/src/library_ui.rs:2377, ui/dr-ui/src/library_ui.rs:2559, ui/dr-ui/src/library_ui.rs:2840, ui/dr-ui/src/library_ui.rs:2912, ui/dr-ui/src/library_ui.rs:3077, ui/dr-ui/src/library_ui.rs:352, ui/dr-ui/src/library_ui.rs:410, ui/dr-ui/src/library_ui.rs:4267, ui/dr-ui/src/library_ui.rs:4382, ui/dr-ui/src/presets.rs:284, ui/dr-ui/src/presets.rs:296, ui/dr-ui/src/sidecar_cache.rs:1
FR-CULL-1 core/dr-decode/src/preview.rs:134
FR-CULL-2 core/dr-decode/src/locate.rs:1, core/dr-decode/src/preview.rs:161
FR-CULL-4 core/dr-catalog/src/rating.rs:1, core/dr-pipeline/src/sidecar.rs:126, ui/dr-ui/src/library.rs:179, ui/dr-ui/src/library.rs:340
FR-DEV-2 core/dr-pipeline/src/operation.rs:318
FR-DEV-3 core/dr-gpu/src/adjust.rs:1738, core/dr-gpu/src/adjust.rs:385, core/dr-gpu/src/adjust.rs:496, core/dr-gpu/src/adjust.rs:67, core/dr-pipeline/src/detail.rs:333, core/dr-pipeline/src/detail.rs:408, core/dr-pipeline/src/framing.rs:186, core/dr-pipeline/src/graph.rs:121, core/dr-pipeline/src/graph.rs:394, core/dr-pipeline/src/operation.rs:265, core/dr-pipeline/src/operation.rs:411, core/dr-pipeline/src/sidecar.rs:147, ui/dr-ui/src/develop.rs:1016, ui/dr-ui/src/develop.rs:62, ui/dr-ui/src/develop.rs:867, ui/dr-ui/src/lib.rs:1101, ui/dr-ui/src/lib.rs:1753, ui/dr-ui/src/lib.rs:286
FR-DEV-3a core/dr-pipeline/build.rs:1804, 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:257, core/dr-pipeline/src/graph.rs:185, core/dr-pipeline/src/graph.rs:19, core/dr-pipeline/src/graph.rs:41, core/dr-pipeline/src/graph.rs:54, core/dr-pipeline/src/mask.rs:504, core/dr-pipeline/src/operation.rs:294, ui/dr-ui/src/lib.rs:522
FR-DEV-3b core/dr-pipeline/src/descriptor.rs:177, core/dr-pipeline/src/framing.rs:257, core/dr-pipeline/src/graph.rs:54, core/dr-pipeline/src/operation.rs:294
FR-DEV-3c core/dr-pipeline/build.rs:1804, core/dr-pipeline/ops/exposure.yaml:1, core/dr-pipeline/src/graph.rs:185, core/dr-pipeline/src/graph.rs:41, core/dr-pipeline/src/mask.rs:504, ui/dr-ui/src/develop.rs:2579
FR-DEV-3d core/dr-gpu/src/adjust.rs:496, core/dr-gpu/src/adjust.rs:67, core/dr-gpu/src/adjust.rs:683, core/dr-gpu/src/adjust.rs:738, core/dr-gpu/src/adjust.rs:87, core/dr-gpu/tests/detail_stage.rs:240, core/dr-pipeline/src/framing.rs:186, core/dr-pipeline/src/graph.rs:420, core/dr-pipeline/src/operation.rs:318, core/dr-pipeline/src/operation.rs:31, core/dr-pipeline/src/operation.rs:52, core/dr-pipeline/src/operation.rs:70
FR-DEV-3e core/dr-decode/src/lib.rs:504, core/dr-decode/src/lib.rs:646, core/dr-decode/src/lib.rs:686
FR-DEV-3h core/dr-decode/src/lib.rs:310, core/dr-decode/src/preview.rs:29, core/dr-pipeline/src/framing.rs:200, core/dr-types/src/lib.rs:332
FR-DEV-4 core/dr-gpu/src/adjust.rs:496, core/dr-gpu/src/lib.rs:217
FR-DEV-5 core/dr-pipeline/src/history.rs:124, core/dr-pipeline/src/history.rs:1, core/dr-pipeline/src/history.rs:55, core/dr-pipeline/src/history.rs:71, core/dr-pipeline/src/history.rs:79, ui/dr-ui/src/develop.rs:1786, ui/dr-ui/src/develop.rs:1796, ui/dr-ui/src/develop.rs:44, ui/dr-ui/src/lib.rs:1093
FR-DEV-6 core/dr-pipeline/src/preset.rs:1, core/dr-types/src/settings.rs:61, ui/dr-ui/src/develop.rs:1747, ui/dr-ui/src/develop.rs:1757, ui/dr-ui/src/lib.rs:1065, ui/dr-ui/src/library.rs:1475, ui/dr-ui/src/library.rs:340, ui/dr-ui/src/library.rs:368, ui/dr-ui/src/library_ui.rs:2208, ui/dr-ui/src/library_ui.rs:2559, ui/dr-ui/src/library_ui.rs:378, ui/dr-ui/src/presets.rs:1, ui/dr-ui/src/settings_ui.rs:506, ui/dr-ui/ui/adjust.slint:569, ui/dr-ui/ui/library.slint:1037, ui/dr-ui/ui/library.slint:640, ui/dr-ui/ui/library.slint:697, ui/dr-ui/ui/settings.slint:79
FR-DEV-8 core/dr-pipeline/src/detail.rs:333, core/dr-pipeline/src/operation.rs:265
FR-DSP-1 core/dr-gpu/src/adjust.rs:1661, core/dr-gpu/src/adjust.rs:1738, core/dr-gpu/src/adjust.rs:1823, core/dr-gpu/src/adjust.rs:44, core/dr-gpu/src/adjust.rs:496, core/dr-gpu/src/lib.rs:54, core/dr-gpu/src/lib.rs:94, core/dr-gpu/tests/detail_stage.rs:322, core/dr-pipeline/src/detail.rs:136, core/dr-pipeline/src/detail.rs:408, core/dr-pipeline/src/graph.rs:368, core/dr-pipeline/src/graph.rs:394, ui/dr-ui/src/develop.rs:1314, ui/dr-ui/src/develop.rs:1934, ui/dr-ui/src/develop.rs:2124, ui/dr-ui/src/develop.rs:2158, ui/dr-ui/src/lib.rs:56, ui/dr-ui/src/lib.rs:647
FR-DSP-6 core/dr-pipeline/src/operation.rs:384, 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:1359, ui/dr-ui/src/develop.rs:3084, ui/dr-ui/src/develop.rs:3116, ui/dr-ui/src/develop.rs:55, ui/dr-ui/src/histogram.rs:1, ui/dr-ui/src/lib.rs:1152, ui/dr-ui/src/lib.rs:281, ui/dr-ui/ui/app.slint:303, 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:137, core/dr-export/src/lib.rs:1, core/dr-export/src/lib.rs:50, core/dr-gpu/src/adjust.rs:1971, core/dr-pipeline/src/graph.rs:358, core/dr-pipeline/src/graph.rs:404, core/dr-pipeline/src/operation.rs:384, core/dr-types/src/colour.rs:1, core/dr-types/src/settings.rs:1, core/dr-types/src/settings.rs:454, 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:324, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/src/settings_ui.rs:48, ui/dr-ui/src/settings_ui.rs:561
FR-EXP-7 ui/dr-ui/src/activity.rs:83, ui/dr-ui/src/export.rs:1, ui/dr-ui/src/export.rs:879, ui/dr-ui/src/lib.rs:1676, ui/dr-ui/src/lib.rs:172, ui/dr-ui/src/lib.rs:324, ui/dr-ui/src/lib.rs:359, ui/dr-ui/src/lib.rs:386, ui/dr-ui/src/library_ui.rs:2929, ui/dr-ui/src/library_ui.rs:469, ui/dr-ui/src/library_ui.rs:5008, ui/dr-ui/src/library_ui.rs:5020, ui/dr-ui/src/library_ui.rs:5032, ui/dr-ui/src/library_ui.rs:540, ui/dr-ui/src/library_ui.rs:597, ui/dr-ui/ui/app.slint:1180, ui/dr-ui/ui/app.slint:869, ui/dr-ui/ui/library.slint:1045, ui/dr-ui/ui/library.slint:644, ui/dr-ui/ui/library.slint:712
FR-EXP-8 core/dr-export/src/encode.rs:1, ui/dr-ui/src/settings_ui.rs:1
FR-EXP-9 core/dr-decode/src/lib.rs:412, core/dr-export/src/lib.rs:125, core/dr-export/src/lib.rs:1, core/dr-gpu/src/adjust.rs:765, ui/dr-ui/src/develop.rs:1437, ui/dr-ui/src/lib.rs:324
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:386, ui/dr-ui/src/library.rs:1512, ui/dr-ui/src/library.rs:398, ui/dr-ui/src/library.rs:680, ui/dr-ui/src/library.rs:877, ui/dr-ui/src/library_ui.rs:1485, ui/dr-ui/src/library_ui.rs:2929, ui/dr-ui/src/library_ui.rs:410, 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:155, core/dr-sync/src/lib.rs:38, 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:161, 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_ui.rs:1
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:155, 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
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:230, core/dr-catalog/src/schema.rs:631, core/dr-types/src/selector.rs:1, core/dr-types/src/settings.rs:1, ui/dr-ui/src/collections_ui.rs:2963, ui/dr-ui/src/collections_ui.rs:574, ui/dr-ui/src/collections_ui.rs:636, ui/dr-ui/src/lib.rs:1436, ui/dr-ui/src/lib.rs:2131, ui/dr-ui/src/library.rs:1254, ui/dr-ui/src/library.rs:1277, ui/dr-ui/src/library.rs:1435, ui/dr-ui/src/library_ui.rs:1017, ui/dr-ui/src/library_ui.rs:1118, ui/dr-ui/src/library_ui.rs:1173, ui/dr-ui/src/library_ui.rs:1291, ui/dr-ui/src/library_ui.rs:1410, ui/dr-ui/src/library_ui.rs:1888, ui/dr-ui/src/library_ui.rs:206, ui/dr-ui/src/library_ui.rs:217, ui/dr-ui/src/library_ui.rs:225, ui/dr-ui/src/library_ui.rs:237, ui/dr-ui/src/library_ui.rs:246, ui/dr-ui/src/library_ui.rs:311, ui/dr-ui/src/library_ui.rs:321, ui/dr-ui/src/library_ui.rs:363, ui/dr-ui/src/library_ui.rs:426, ui/dr-ui/src/library_ui.rs:4284, ui/dr-ui/src/library_ui.rs:4302, ui/dr-ui/src/library_ui.rs:4314, ui/dr-ui/src/library_ui.rs:457, ui/dr-ui/src/library_ui.rs:469, ui/dr-ui/src/library_ui.rs:944, ui/dr-ui/src/settings_store.rs:1, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/ui/app.slint:2026, ui/dr-ui/ui/app.slint:564, 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:758
FR-NC-6b ui/dr-ui/src/library_ui.rs:1173
FR-NC-6c core/dr-sync-nextcloud/src/desktop_client.rs:30, core/dr-types/src/lib.rs:115, core/dr-types/src/lib.rs:197, ui/dr-ui/src/activity.rs:1, ui/dr-ui/src/collections_ui.rs:2963, ui/dr-ui/src/collections_ui.rs:574, ui/dr-ui/src/collections_ui.rs:636, ui/dr-ui/src/library_ui.rs:1017, ui/dr-ui/src/library_ui.rs:944, 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
FR-NC-8 core/dr-pipeline/src/sidecar.rs:109, core/dr-pipeline/src/sidecar.rs:90, ui/dr-ui/src/lib.rs:1405, ui/dr-ui/src/library.rs:340, ui/dr-ui/src/library_ui.rs:378
FR-NC-9 core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/sync.rs:1, core/dr-pipeline/src/sidecar.rs:147, core/dr-pipeline/src/sidecar.rs:301, ui/dr-ui/src/library.rs:680, ui/dr-ui/src/library.rs:810
FR-PLAT-AND-1 core/dr-types/src/lib.rs:49
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/settings_store.rs:1
FR-RAW-1 core/dr-decode/src/lib.rs:201, core/dr-types/src/lib.rs:125, core/dr-types/src/lib.rs:196
FR-RAW-3 core/dr-decode/src/lib.rs:412, core/dr-decode/src/lib.rs:97, core/dr-decode/src/locate.rs:1045
FR-RAW-4 core/dr-decode/src/error.rs:1, ui/dr-ui/src/lib.rs:172
FR-RAW-5 core/dr-decode/src/lib.rs:125, core/dr-gpu/src/demosaic.rs:34, core/dr-gpu/src/demosaic.rs:573, core/dr-gpu/src/demosaic.rs:652, core/dr-gpu/src/demosaic.rs:776
FR-UI-1 ui/dr-ui/src/lib.rs:2213, ui/dr-ui/src/lib.rs:64, ui/dr-ui/ui/library.slint:804
FR-UI-2 ui/dr-ui/src/collections_ui.rs:111, ui/dr-ui/src/collections_ui.rs:1448, ui/dr-ui/src/collections_ui.rs:1462, ui/dr-ui/src/collections_ui.rs:1507, ui/dr-ui/src/collections_ui.rs:1517, ui/dr-ui/src/collections_ui.rs:152, ui/dr-ui/src/collections_ui.rs:444, ui/dr-ui/src/collections_ui.rs:472, ui/dr-ui/src/collections_ui.rs:941, ui/dr-ui/src/collections_ui.rs:951, ui/dr-ui/src/lib.rs:64, ui/dr-ui/src/library_ui.rs:225, ui/dr-ui/src/library_ui.rs:4314, ui/dr-ui/ui/app.slint:575, ui/dr-ui/ui/app.slint:582, ui/dr-ui/ui/library.slint:1784, ui/dr-ui/ui/library.slint:632, ui/dr-ui/ui/library.slint:668, ui/dr-ui/ui/library.slint:947, ui/dr-ui/ui/library.slint:954, ui/dr-ui/ui/library.slint:960
FR-UI-3 ui/dr-ui/src/library_ui.rs:3590, ui/dr-ui/ui/collections.slint:4, ui/dr-ui/ui/collections.slint:682
FR-UI-4 ui/dr-ui/src/collections_ui.rs:111, ui/dr-ui/src/collections_ui.rs:124, ui/dr-ui/src/collections_ui.rs:1448, ui/dr-ui/src/collections_ui.rs:1462, ui/dr-ui/src/collections_ui.rs:1507, ui/dr-ui/src/collections_ui.rs:1517, ui/dr-ui/src/collections_ui.rs:152, ui/dr-ui/src/collections_ui.rs:1544, ui/dr-ui/src/collections_ui.rs:444, ui/dr-ui/src/collections_ui.rs:472, ui/dr-ui/src/collections_ui.rs:537, ui/dr-ui/src/collections_ui.rs:941, ui/dr-ui/src/collections_ui.rs:951, ui/dr-ui/src/library_ui.rs:3590, ui/dr-ui/src/library_ui.rs:3635, ui/dr-ui/src/library_ui.rs:3738, ui/dr-ui/src/library_ui.rs:3766, ui/dr-ui/src/library_ui.rs:4302, ui/dr-ui/src/library_ui.rs:4314, ui/dr-ui/ui/app.slint:1401, ui/dr-ui/ui/app.slint:570, ui/dr-ui/ui/app.slint:582, ui/dr-ui/ui/library.slint:1784, ui/dr-ui/ui/library.slint:632, ui/dr-ui/ui/library.slint:668, ui/dr-ui/ui/library.slint:687, ui/dr-ui/ui/library.slint:947, ui/dr-ui/ui/library.slint:954, ui/dr-ui/ui/library.slint:960
FR-UI-5 ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/lib.rs:2247, ui/dr-ui/ui/collections.slint:4
FR-UI-7 core/dr-pipeline/src/descriptor.rs:100, core/dr-pipeline/src/framing.rs:257
NFR-ARCH-2 core/dr-catalog/src/jobs.rs:1
NFR-ARCH-3 ui/dr-ui/src/export.rs:1490, ui/dr-ui/src/export.rs:1516, ui/dr-ui/src/export.rs:410, ui/dr-ui/src/export.rs:436, ui/dr-ui/src/lib.rs:1710, ui/dr-ui/ui/app.slint:880, ui/dr-ui/ui/library.slint:712
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:134
NFR-P9 ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/export.rs:879, 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:265, core/dr-types/src/lib.rs:298
NFR-R1 core/dr-catalog/src/sync.rs:1, ui/dr-ui/src/library.rs:877
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/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:55, ui/dr-ui/src/lib.rs:56
NFR-RES-4 core/dr-catalog/src/cache.rs:1, core/dr-catalog/src/schema.rs:230, core/dr-thumbs/src/codec.rs:1, core/dr-thumbs/src/lib.rs:1, core/dr-thumbs/src/lib.rs:376
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

66 of 151 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built.

Show untagged requirements
  • FR-CAT-10
  • FR-CAT-13
  • 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-3f
  • FR-DEV-3g
  • FR-DEV-7
  • 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-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-P5
  • 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
  • R2
  • R3
  • R5
  • R6