Files
DarkRoom/docs/traceability.md
T
dtourolleandClaude Opus 5 743fefe7f1 Render each body through the profile its own files describe
Colour came from whichever matrix rawler happened to key `D65`, the second
one was discarded, and the rendering was left linear. That is the dcraw
default, and FR-DEV-3e names it as the reason people abandon a converter in
the first hour: correct in the abstract, flat and poor on skin in practice.

The decoder now builds a camera profile.

- `ColorMatrix1/2` and `CalibrationIlluminant1/2`. rawler surfaces these as
  an illuminant-keyed map — for DNGs from the tags, and for native formats
  from its own camera database — so a Canon CR2 arrives with a tungsten
  matrix and a daylight matrix exactly as an Adobe DNG of the same frame
  would. Dual-illuminant support is therefore not a DNG feature here.

- `ForwardMatrix1/2`, read straight from the root IFD, because rawler parses
  them and never surfaces them. Where a file carries both, they replace the
  inverted colour matrix: the same relationship measured in the direction
  rendering actually wants, rather than an inversion that amplifies the
  measurement error exactly where skin lives.

- `AsShotNeutral`, used to estimate what the scene was lit by and to
  interpolate between the two calibrations in mireds. The estimate is
  circular — the temperature needs a matrix and the matrix needs the
  temperature — so it is a fixed point, three rounds, as Adobe's SDK does it.

Bodies calibrated at neither D65 nor A stopped rendering uncalibrated as a
side effect: a Phase One IQ3 carries D55 and D75 and used to get no matrix
at all.

And a base curve, applied per channel in camera RGB between the last
adjustment and the conversion out of camera space — a toe, a steep midtone
and a shoulder, which is the difference between a photograph and a scan of
one. It is not an edit: no slider, nothing in the sidecar, because it
belongs to the body rather than to anything anyone decided, and a sidecar is
shared between bodies. It is not a develop node either, and `ops/README.md`
now records why. It evaluates on the tone curve's own spline rather than a
second copy, so a profile author placing a control point and a photographer
dragging one mean the same thing by it.

The curves are data. `core/dr-decode/profiles/base_curves.yaml` ships inside
the binary as a floor and is superseded by any copy on disk carrying a
higher `version:`, so a body can be added and distributed without a release
— and, under the GPL, contributed. The comparison runs both ways: a stale
pack cannot hold an upgraded binary back at last year's rendering.

Canon EOS 6D and R6, Nikon Z 6 and D750, Sony A7 III and Fujifilm X-T3 ship
with their own curves. Every other body gets a conservative default, which
is much closer to right than the identity is for any of them. A JPEG gets
none — it has already been rendered once, by the camera.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 14:37:33 +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 151
TRACES tags found 370
Requirements defined 151
Requirements covered 83
Coverage 55.0% (83/151)

By type

Type Covered Defined
FR 65 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:264, core/dr-decode/src/lib.rs:331, 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-3 core/dr-gpu/src/adjust.rs:1414, core/dr-gpu/src/adjust.rs:307, core/dr-pipeline/src/framing.rs:186, core/dr-pipeline/src/operation.rs:224, 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:163, 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:490, core/dr-pipeline/src/operation.rs:107, 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:107
FR-DEV-3c core/dr-pipeline/build.rs:1804, core/dr-pipeline/ops/exposure.yaml:1, core/dr-pipeline/src/graph.rs:163, core/dr-pipeline/src/graph.rs:41, core/dr-pipeline/src/mask.rs:490, ui/dr-ui/src/develop.rs:2579
FR-DEV-3d core/dr-pipeline/src/framing.rs:186
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:100, core/dr-decode/src/lib.rs:632, core/dr-decode/src/lib.rs:672, 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:345, core/dr-gpu/src/adjust.rs:35, core/dr-gpu/src/demosaic.rs:121, core/dr-gpu/src/demosaic.rs:86, core/dr-pipeline/src/operation.rs:1079, core/dr-pipeline/src/operation.rs:1104, core/dr-pipeline/src/operation.rs:1119, core/dr-pipeline/src/operation.rs:1140, core/dr-pipeline/src/operation.rs:154, core/dr-pipeline/src/operation.rs:164, core/dr-pipeline/src/operation.rs:277
FR-DEV-3h core/dr-decode/src/lib.rs:331, 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/lib.rs:211
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-DSP-1 core/dr-gpu/src/adjust.rs:1337, core/dr-gpu/src/adjust.rs:1414, core/dr-gpu/src/adjust.rs:1499, core/dr-gpu/src/adjust.rs:52, core/dr-gpu/src/lib.rs:48, core/dr-gpu/src/lib.rs:88, 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:197, 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:1647, core/dr-pipeline/src/graph.rs:336, core/dr-pipeline/src/operation.rs:197, 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:433, core/dr-export/src/lib.rs:125, core/dr-export/src/lib.rs:1, core/dr-gpu/src/adjust.rs:437, 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:222, core/dr-types/src/lib.rs:125, core/dr-types/src/lib.rs:196
FR-RAW-3 core/dr-decode/src/lib.rs:118, core/dr-decode/src/lib.rs:433, 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:146, 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: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:211

Not yet tagged

68 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-2
  • FR-DEV-3f
  • FR-DEV-3g
  • FR-DEV-7
  • FR-DEV-8
  • 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