Files
DarkRoom/docs/traceability.md
T
dtourolleandClaude Opus 5 b6a95e1965 Simulate a film stock from its measurements, not from someone's grade
FR-DEV-3f asks for look emulation and proposes HaldCLUT import to inherit
the free film-simulation ecosystem. This takes the other road for the
stocks where the measurements exist: run the physics.

A stock here is its manufacturer's own datasheet -- spectral sensitivity,
characteristic curves, dye densities. Light exposes three emulsion layers,
the layers develop to densities, the densities are dyes that absorb, and
what is left is what reaches the eye. A colour negative comes out orange
and upside down because that is what a colour negative is; it becomes a
photograph when a paper profile prints it, with the enlarger's filtration
solved rather than dialled.

What that buys over a LUT is that the parameters stay physical. Opening up
a stop moves the picture along the film's real characteristic curve,
shoulder and all, instead of scaling a number baked at one exposure. The
data cost runs the other way too: a stock is 17 kB of published
measurements where one HaldCLUT is 800 kB of one person's grade.

It looks like it needs a spectral integration per pixel. It does not, and
that is the whole design:

  - Exposure is a 3x3 matrix. The reconstructed scene spectrum is linear
    in the sRGB triple, so the integral collapses into nine numbers,
    exactly -- no approximation.
  - The characteristic curve is three 1D functions, sampled exactly.
  - Everything after that -- dye absorption, the print through the
    negative, the paper, the viewing illuminant, the adaptation -- takes
    exactly three numbers in, so it bakes into one 32^3 lookup.

Per pixel: a matrix multiply, three curve taps, one fetch. Splitting the
curve out of the 3D lookup rather than baking one LUT over exposure is
measured, not assumed: the curve carries the sharp shape and the dye
mixing is smooth, so folding them together would need three times the
resolution for the same error. At 32^3 the worst error is 0.003 in linear
sRGB, under one 8-bit code value, and a test says so.

No wgpu dependency, deliberately, and the same isolation argument dr-lens
makes: the model is plain f32 with a documented layout, so every property
worth asserting is asserted on the CPU. Binding it to a texture is dr-gpu's
job and is not done here yet.

The expected values in tests/ came from a Python prototype running against
a different colour-science stack. Agreement to three decimals is evidence
about the model rather than about one implementation of it -- a transposed
matrix or a mispasted observer row would pass every unit test and fail
that one.

Profiles are converted from spektrafilm by Andrea Volpato, CC BY-SA 4.0.
The converter is in the tree and runnable, so what was changed from
upstream is auditable rather than taken on trust; profiles/CHANGELOG.txt
records it, including the one deliberate deviation -- Mallett & Yuksel's
1 kB basis instead of Hanatos's 4 MB table, which costs accuracy at the
gamut edge and saves four megabytes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 14:44:54 +02:00

60 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 189
TRACES tags found 564
Requirements defined 177
Requirements covered 90
Coverage 50.8% (90/177)

By type

Type Covered Defined
FR 72 122
NFR 16 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:949, 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:949, ui/dr-ui/src/library.rs:152, ui/dr-ui/src/library.rs:2105, ui/dr-ui/ui/import.slint:5
FR-CAT-12 core/dr-pipeline/src/sidecar.rs:109
FR-CAT-13 core/dr-catalog/src/keywords.rs:1
FR-CAT-15 core/dr-catalog/src/schema.rs:365, 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:2986, ui/dr-ui/src/library.rs:3018, ui/dr-ui/src/library_ui.rs:151, ui/dr-ui/src/library_ui.rs:722, 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:2581, ui/dr-ui/src/library.rs:2607, ui/dr-ui/src/library_ui.rs:138, ui/dr-ui/src/library_ui.rs:3539, ui/dr-ui/src/library_ui.rs:4470, ui/dr-ui/ui/app.slint:513, 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, 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:280, core/dr-catalog/src/schema.rs:783, core/dr-decode/src/lib.rs:285, core/dr-decode/src/lib.rs:404, core/dr-pipeline/src/sidecar.rs:126, 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:3032, ui/dr-ui/src/library_ui.rs:593, ui/dr-ui/src/library_ui.rs:6151, ui/dr-ui/src/library_ui.rs:6162, ui/dr-ui/src/library_ui.rs:6175, ui/dr-ui/src/library_ui.rs:6190, ui/dr-ui/src/library_ui.rs:6199, ui/dr-ui/ui/app.slint:458, ui/dr-ui/ui/app.slint:587, 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:280, 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:3209, ui/dr-ui/src/library_ui.rs:282, ui/dr-ui/src/library_ui.rs:352, ui/dr-ui/src/library_ui.rs:5020, ui/dr-ui/src/library_ui.rs:5073, ui/dr-ui/src/library_ui.rs:6291, ui/dr-ui/ui/app.slint:461, ui/dr-ui/ui/app.slint:587, ui/dr-ui/ui/app.slint:816, 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:3397, ui/dr-ui/src/library_ui.rs:4060, ui/dr-ui/ui/app.slint:582, 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/ops/curve.rs:136, core/dr-pipeline/src/ops/curve.rs:652, core/dr-pipeline/src/sidecar.rs:1273, core/dr-pipeline/src/sidecar.rs:90, core/dr-pipeline/tests/tone_curve.rs:33, ui/dr-ui/src/develop.rs:2600, ui/dr-ui/src/develop.rs:2628, ui/dr-ui/src/export.rs:749, ui/dr-ui/src/lib.rs:1186, ui/dr-ui/src/lib.rs:1526, ui/dr-ui/src/lib.rs:1631, ui/dr-ui/src/lib.rs:464, ui/dr-ui/src/lib.rs:796, ui/dr-ui/src/library.rs:1528, ui/dr-ui/src/library.rs:364, ui/dr-ui/src/library.rs:402, ui/dr-ui/src/library.rs:439, ui/dr-ui/src/library.rs:679, ui/dr-ui/src/library_ui.rs:4762, 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:337, 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:2325, ui/dr-ui/src/library.rs:138, ui/dr-ui/src/library.rs:1488, ui/dr-ui/src/library.rs:1565, ui/dr-ui/src/library.rs:220, ui/dr-ui/src/library.rs:3316, ui/dr-ui/src/library.rs:439, ui/dr-ui/src/library.rs:663, ui/dr-ui/src/library.rs:679, ui/dr-ui/src/library.rs:733, ui/dr-ui/src/library_ui.rs:1529, ui/dr-ui/src/library_ui.rs:1555, ui/dr-ui/src/library_ui.rs:1571, ui/dr-ui/src/library_ui.rs:1665, ui/dr-ui/src/library_ui.rs:193, ui/dr-ui/src/library_ui.rs:2252, ui/dr-ui/src/library_ui.rs:226, ui/dr-ui/src/library_ui.rs:2685, ui/dr-ui/src/library_ui.rs:2907, ui/dr-ui/src/library_ui.rs:3188, ui/dr-ui/src/library_ui.rs:3260, ui/dr-ui/src/library_ui.rs:3448, ui/dr-ui/src/library_ui.rs:3566, ui/dr-ui/src/library_ui.rs:405, ui/dr-ui/src/library_ui.rs:463, ui/dr-ui/src/library_ui.rs:5118, ui/dr-ui/src/library_ui.rs:5233, ui/dr-ui/src/presets.rs:309, ui/dr-ui/src/presets.rs:321, 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, ui/dr-ui/src/import.rs:464
FR-CULL-4 core/dr-catalog/src/rating.rs:1, core/dr-pipeline/src/sidecar.rs:126, ui/dr-ui/src/library.rs:203, ui/dr-ui/src/library.rs:364
FR-DEV-2 core/dr-pipeline/src/operation.rs:318
FR-DEV-3 core/dr-gpu/src/adjust.rs:1860, core/dr-gpu/src/adjust.rs:395, core/dr-gpu/src/adjust.rs:506, core/dr-gpu/src/adjust.rs:77, core/dr-gpu/tests/tone_curve.rs:1, core/dr-pipeline/src/detail.rs:364, core/dr-pipeline/src/detail.rs:439, core/dr-pipeline/src/framing.rs:188, core/dr-pipeline/src/framing.rs:602, core/dr-pipeline/src/graph.rs:120, core/dr-pipeline/src/graph.rs:397, core/dr-pipeline/src/mask.rs:120, core/dr-pipeline/src/operation.rs:265, core/dr-pipeline/src/operation.rs:439, 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:1273, core/dr-pipeline/src/sidecar.rs:1329, core/dr-pipeline/src/sidecar.rs:147, core/dr-pipeline/tests/tone_curve.rs:1, ui/dr-ui/src/develop.rs:101, ui/dr-ui/src/develop.rs:1111, ui/dr-ui/src/develop.rs:132, ui/dr-ui/src/develop.rs:1584, ui/dr-ui/src/develop.rs:1599, ui/dr-ui/src/develop.rs:1621, ui/dr-ui/src/develop.rs:1753, ui/dr-ui/src/develop.rs:1831, ui/dr-ui/src/develop.rs:238, ui/dr-ui/src/develop.rs:2600, ui/dr-ui/src/develop.rs:270, ui/dr-ui/src/develop.rs:3003, ui/dr-ui/src/develop.rs:3057, ui/dr-ui/src/develop.rs:3101, ui/dr-ui/src/develop.rs:3151, ui/dr-ui/src/develop.rs:506, ui/dr-ui/src/develop.rs:544, ui/dr-ui/src/lib.rs:1222, ui/dr-ui/src/lib.rs:1874, ui/dr-ui/src/lib.rs:290, ui/dr-ui/src/library.rs:402, 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:218, ui/dr-ui/ui/app.slint:1905, ui/dr-ui/ui/app.slint:903
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:184, core/dr-pipeline/src/graph.rs:18, core/dr-pipeline/src/graph.rs:40, core/dr-pipeline/src/graph.rs:53, core/dr-pipeline/src/mask.rs:954, core/dr-pipeline/src/operation.rs:294, core/dr-pipeline/src/ops/curve.rs:318, ui/dr-ui/src/develop.rs:1008, ui/dr-ui/src/lib.rs:526
FR-DEV-3b core/dr-pipeline/src/descriptor.rs:177, core/dr-pipeline/src/framing.rs:259, core/dr-pipeline/src/graph.rs:53, core/dr-pipeline/src/operation.rs:294
FR-DEV-3c core/dr-pipeline/build.rs:1807, core/dr-pipeline/ops/exposure.yaml:1, core/dr-pipeline/src/graph.rs:184, core/dr-pipeline/src/graph.rs:40, core/dr-pipeline/src/mask.rs:954, ui/dr-ui/src/develop.rs:3730
FR-DEV-3d core/dr-gpu/src/adjust.rs:506, core/dr-gpu/src/adjust.rs:709, core/dr-gpu/src/adjust.rs:764, core/dr-gpu/src/adjust.rs:77, core/dr-gpu/src/adjust.rs:97, core/dr-gpu/tests/capture_sharpen.rs:429, core/dr-gpu/tests/detail_stage.rs:241, core/dr-gpu/tests/local_contrast.rs:475, core/dr-gpu/tests/noise_reduction.rs:555, core/dr-pipeline/src/framing.rs:188, core/dr-pipeline/src/graph.rs:426, 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/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:690, 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:1341, core/dr-pipeline/src/operation.rs:1366, core/dr-pipeline/src/operation.rs:1381, core/dr-pipeline/src/operation.rs:1405, core/dr-pipeline/src/operation.rs:369, core/dr-pipeline/src/operation.rs:379, core/dr-pipeline/src/operation.rs:510
FR-DEV-3f core/dr-film/src/lib.rs:1, core/dr-film/src/profile.rs:57
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-types/src/lib.rs:336
FR-DEV-4 core/dr-gpu/src/adjust.rs:506, 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:2644, ui/dr-ui/src/develop.rs:2654, ui/dr-ui/src/develop.rs:488, ui/dr-ui/src/lib.rs:1214
FR-DEV-6 core/dr-pipeline/src/preset.rs:1, core/dr-types/src/settings.rs:182, ui/dr-ui/src/develop.rs:2594, ui/dr-ui/src/develop.rs:2615, ui/dr-ui/src/lib.rs:1186, ui/dr-ui/src/library.rs:1528, ui/dr-ui/src/library.rs:364, ui/dr-ui/src/library.rs:392, ui/dr-ui/src/library_ui.rs:2512, ui/dr-ui/src/library_ui.rs:2907, ui/dr-ui/src/library_ui.rs:431, 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-8 core/dr-pipeline/src/detail.rs:364, core/dr-pipeline/src/operation.rs:265
FR-DSP-1 core/dr-gpu/src/adjust.rs:1783, core/dr-gpu/src/adjust.rs:1860, core/dr-gpu/src/adjust.rs:1945, core/dr-gpu/src/adjust.rs:506, core/dr-gpu/src/adjust.rs:54, core/dr-gpu/src/lib.rs:54, core/dr-gpu/src/lib.rs:94, core/dr-gpu/tests/capture_sharpen.rs:199, core/dr-gpu/tests/detail_stage.rs:327, core/dr-gpu/tests/local_contrast.rs:262, core/dr-gpu/tests/noise_reduction.rs:377, core/dr-pipeline/src/detail.rs:136, core/dr-pipeline/src/detail.rs:439, core/dr-pipeline/src/graph.rs:367, core/dr-pipeline/src/graph.rs:397, core/dr-pipeline/src/ops/capture_sharpen.rs:1, core/dr-pipeline/src/ops/capture_sharpen.rs:647, core/dr-pipeline/src/ops/local_contrast.rs:1, core/dr-pipeline/src/ops/local_contrast.rs:658, core/dr-pipeline/src/ops/noise_reduction.rs:691, ui/dr-ui/src/develop.rs:2161, ui/dr-ui/src/develop.rs:2792, ui/dr-ui/src/develop.rs:3275, ui/dr-ui/src/develop.rs:3309, ui/dr-ui/src/lib.rs:59, ui/dr-ui/src/lib.rs:667
FR-DSP-6 core/dr-pipeline/src/operation.rs:412, 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:2206, ui/dr-ui/src/develop.rs:4377, ui/dr-ui/src/develop.rs:4409, ui/dr-ui/src/develop.rs:499, ui/dr-ui/src/histogram.rs:1, ui/dr-ui/src/lib.rs:1273, ui/dr-ui/src/lib.rs:285, ui/dr-ui/ui/app.slint:276, 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:2093, core/dr-pipeline/src/graph.rs:357, core/dr-pipeline/src/graph.rs:410, core/dr-pipeline/src/operation.rs:412, 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:328, 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:941, ui/dr-ui/src/lib.rs:175, ui/dr-ui/src/lib.rs:1797, ui/dr-ui/src/lib.rs:328, ui/dr-ui/src/lib.rs:363, ui/dr-ui/src/lib.rs:390, ui/dr-ui/src/library_ui.rs:3277, ui/dr-ui/src/library_ui.rs:522, ui/dr-ui/src/library_ui.rs:6133, ui/dr-ui/src/library_ui.rs:6210, ui/dr-ui/src/library_ui.rs:6222, ui/dr-ui/src/library_ui.rs:625, ui/dr-ui/src/library_ui.rs:682, ui/dr-ui/ui/app.slint:1374, ui/dr-ui/ui/app.slint:994, 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:1222, 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:444, 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:776, ui/dr-ui/src/export.rs:793, 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:791, ui/dr-ui/src/develop.rs:2284, ui/dr-ui/src/lib.rs:328
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:390, ui/dr-ui/src/library.rs:1565, ui/dr-ui/src/library.rs:439, ui/dr-ui/src/library.rs:733, ui/dr-ui/src/library.rs:930, ui/dr-ui/src/library_ui.rs:1571, ui/dr-ui/src/library_ui.rs:3277, ui/dr-ui/src/library_ui.rs:463, 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: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.rs:2581, ui/dr-ui/src/library.rs:2607, ui/dr-ui/src/library_ui.rs:1, ui/dr-ui/src/library_ui.rs:3539, ui/dr-ui/src/library_ui.rs:4470, ui/dr-ui/ui/app.slint:513, 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:337, core/dr-catalog/src/schema.rs:738, 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:1557, ui/dr-ui/src/lib.rs:2297, ui/dr-ui/src/library.rs:1307, ui/dr-ui/src/library.rs:1330, ui/dr-ui/src/library.rs:1488, ui/dr-ui/src/library_ui.rs:1030, ui/dr-ui/src/library_ui.rs:1103, ui/dr-ui/src/library_ui.rs:1204, ui/dr-ui/src/library_ui.rs:1259, ui/dr-ui/src/library_ui.rs:1377, ui/dr-ui/src/library_ui.rs:1496, ui/dr-ui/src/library_ui.rs:2007, ui/dr-ui/src/library_ui.rs:234, ui/dr-ui/src/library_ui.rs:245, ui/dr-ui/src/library_ui.rs:253, ui/dr-ui/src/library_ui.rs:265, ui/dr-ui/src/library_ui.rs:274, ui/dr-ui/src/library_ui.rs:364, ui/dr-ui/src/library_ui.rs:374, ui/dr-ui/src/library_ui.rs:416, ui/dr-ui/src/library_ui.rs:479, ui/dr-ui/src/library_ui.rs:510, ui/dr-ui/src/library_ui.rs:5135, ui/dr-ui/src/library_ui.rs:5153, ui/dr-ui/src/library_ui.rs:5165, ui/dr-ui/src/library_ui.rs:522, ui/dr-ui/src/settings_store.rs:1, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/ui/app.slint:2403, ui/dr-ui/ui/app.slint:576, 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:1259
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:1030, ui/dr-ui/src/library_ui.rs:1103, 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:2607, ui/dr-ui/src/library_ui.rs:3539, 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:949, 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:949
FR-NC-8 core/dr-pipeline/src/sidecar.rs:109, core/dr-pipeline/src/sidecar.rs:90, ui/dr-ui/src/lib.rs:1526, ui/dr-ui/src/library.rs:364, ui/dr-ui/src/library_ui.rs:431
FR-NC-9 core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/schema.rs:280, 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:733, ui/dr-ui/src/library.rs:863
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:736, 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:1365
FR-RAW-4 core/dr-decode/src/error.rs:1, ui/dr-ui/src/lib.rs:175
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:2379, ui/dr-ui/src/lib.rs:67, 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:67, ui/dr-ui/src/library_ui.rs:253, ui/dr-ui/src/library_ui.rs:5020, ui/dr-ui/src/library_ui.rs:5165, ui/dr-ui/src/library_ui.rs:6241, ui/dr-ui/ui/app.slint:2132, ui/dr-ui/ui/app.slint:262, ui/dr-ui/ui/app.slint:606, ui/dr-ui/ui/app.slint:613, 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:1831, ui/dr-ui/src/library_ui.rs:4265, 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/ui/app.slint:1905, 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:4265, ui/dr-ui/src/library_ui.rs:4310, ui/dr-ui/src/library_ui.rs:4413, ui/dr-ui/src/library_ui.rs:4441, ui/dr-ui/src/library_ui.rs:5153, ui/dr-ui/src/library_ui.rs:5165, ui/dr-ui/ui/app.slint:1601, ui/dr-ui/ui/app.slint:582, ui/dr-ui/ui/app.slint:613, 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:2024, ui/dr-ui/src/lib.rs:2413, ui/dr-ui/src/lib.rs:2598, ui/dr-ui/src/masks_ui.rs:863, ui/dr-ui/ui/app.slint:297, 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:1552, ui/dr-ui/src/export.rs:1578, ui/dr-ui/src/export.rs:410, ui/dr-ui/src/export.rs:436, ui/dr-ui/src/lib.rs:1831, ui/dr-ui/ui/app.slint:1005, 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:134
NFR-P9 ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/export.rs:941, 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:930
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:55, ui/dr-ui/src/lib.rs:59
NFR-RES-4 core/dr-catalog/src/cache.rs:1, core/dr-catalog/src/schema.rs:337, 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:2581
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

87 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-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-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-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
  • NFR-SEC-6
  • R2
  • R3
  • R5
  • R6