Files
DarkRoom/docs/traceability.md
T
dtourolleandClaude Opus 5 a8b28136a6 Merge the batch export, and settle the seven-branch merge
Resolves the last of the parallel work. Two conflicts worth recording,
because both were semantic rather than textual:

`render_for_export` gained a colour space on master while the batch branch
was rewriting the single-image export path around it. Kept both: the batch
request supersedes the synchronous path, and the space still has to be chosen
at render time because the conversion happens in the shader before the clip to
0..1. `render_open_frame` takes it as an argument rather than reaching for a
controller it does not hold.

The map-wait moved into `readback::await_mapping` on one branch while another
was editing the constant it used, so `READBACK_POLL_LIMIT` survived the merge
with no callers. Removed rather than left for clippy to find later.

1164 tests pass, clippy clean, fmt clean. Traceability 53.0% -> 54.3%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 10:11:44 +02:00

32 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 129
TRACES tags found 278
Requirements defined 151
Requirements covered 82
Coverage 54.3% (82/151)

By type

Type Covered Defined
FR 64 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:108
FR-CAT-15 core/dr-catalog/src/schema.rs:258, core/dr-catalog/src/trash.rs:1, core/dr-sync-nextcloud/src/lib.rs:366, 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:1299, ui/dr-ui/src/collections_ui.rs:817, ui/dr-ui/src/library.rs:152, ui/dr-ui/src/library.rs:169, ui/dr-ui/src/library.rs:2428, ui/dr-ui/src/library.rs:2460, ui/dr-ui/src/library_ui.rs:112, ui/dr-ui/src/library_ui.rs:592, ui/dr-ui/src/trash.rs:1, ui/dr-ui/ui/collections.slint:458
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:240, core/dr-decode/src/lib.rs:307, core/dr-pipeline/src/sidecar.rs:125
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:1, ui/dr-ui/src/derived_sync.rs:1, ui/dr-ui/ui/collections.slint:4
FR-CAT-8 core/dr-pipeline/src/sidecar.rs:89, ui/dr-ui/src/develop.rs:962, ui/dr-ui/src/export.rs:697, ui/dr-ui/src/lib.rs:1332, ui/dr-ui/src/lib.rs:1437, ui/dr-ui/src/lib.rs:412, ui/dr-ui/src/lib.rs:686, ui/dr-ui/src/lib.rs:999, ui/dr-ui/src/library.rs:1327, ui/dr-ui/src/library.rs:291, ui/dr-ui/src/library.rs:349, ui/dr-ui/src/library.rs:565, ui/dr-ui/src/library_ui.rs:3225, 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/library.rs:1287, ui/dr-ui/src/library.rs:1364, ui/dr-ui/src/library.rs:138, ui/dr-ui/src/library.rs:196, ui/dr-ui/src/library.rs:2548, ui/dr-ui/src/library.rs:349, ui/dr-ui/src/library.rs:549, ui/dr-ui/src/library.rs:565, ui/dr-ui/src/library.rs:619, ui/dr-ui/src/library_ui.rs:1130, ui/dr-ui/src/library_ui.rs:1156, ui/dr-ui/src/library_ui.rs:1172, ui/dr-ui/src/library_ui.rs:1266, ui/dr-ui/src/library_ui.rs:146, ui/dr-ui/src/library_ui.rs:1528, ui/dr-ui/src/library_ui.rs:1793, ui/dr-ui/src/library_ui.rs:179, ui/dr-ui/src/library_ui.rs:2127, ui/dr-ui/src/library_ui.rs:2199, ui/dr-ui/src/library_ui.rs:2364, ui/dr-ui/src/library_ui.rs:307, ui/dr-ui/src/library_ui.rs:3377, ui/dr-ui/src/library_ui.rs:3405, ui/dr-ui/src/library_ui.rs:365, 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:125, ui/dr-ui/src/library.rs:179, ui/dr-ui/src/library.rs:291
FR-DEV-3 core/dr-pipeline/src/framing.rs:185
FR-DEV-3a core/dr-pipeline/build.rs:1734, 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:256, core/dr-pipeline/src/graph.rs:133, core/dr-pipeline/src/graph.rs:17, core/dr-pipeline/src/graph.rs:41, core/dr-pipeline/src/operation.rs:106
FR-DEV-3b core/dr-pipeline/src/descriptor.rs:177, core/dr-pipeline/src/framing.rs:256, core/dr-pipeline/src/graph.rs:41, core/dr-pipeline/src/operation.rs:106
FR-DEV-3c core/dr-pipeline/build.rs:1734, core/dr-pipeline/ops/exposure.yaml:1, core/dr-pipeline/src/graph.rs:133, ui/dr-ui/src/develop.rs:1654
FR-DEV-3d core/dr-pipeline/src/framing.rs:185
FR-DEV-3e core/dr-decode/src/lib.rs:492, core/dr-decode/src/lib.rs:612
FR-DEV-3h core/dr-decode/src/lib.rs:307, core/dr-decode/src/preview.rs:29, core/dr-pipeline/src/framing.rs:199, core/dr-types/src/lib.rs:332
FR-DEV-4 core/dr-gpu/src/lib.rs:210
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:26, ui/dr-ui/src/develop.rs:978, ui/dr-ui/src/develop.rs:988, ui/dr-ui/src/lib.rs:1027
FR-DEV-6 core/dr-pipeline/src/preset.rs:1, core/dr-types/src/settings.rs:61, ui/dr-ui/src/develop.rs:939, ui/dr-ui/src/develop.rs:949, ui/dr-ui/src/lib.rs:999, ui/dr-ui/src/library.rs:1327, ui/dr-ui/src/library.rs:291, ui/dr-ui/src/library.rs:319, ui/dr-ui/src/library_ui.rs:1624, ui/dr-ui/src/library_ui.rs:333, ui/dr-ui/src/presets.rs:1, ui/dr-ui/src/settings_ui.rs:503, ui/dr-ui/ui/adjust.slint:569, ui/dr-ui/ui/library.slint:455, ui/dr-ui/ui/library.slint:480, ui/dr-ui/ui/library.slint:785, ui/dr-ui/ui/settings.slint:79
FR-DSP-1 core/dr-gpu/src/adjust.rs:1147, core/dr-gpu/src/adjust.rs:1180, core/dr-gpu/src/adjust.rs:54, core/dr-gpu/src/lib.rs:47, core/dr-gpu/src/lib.rs:87, ui/dr-ui/src/develop.rs:1126, ui/dr-ui/src/develop.rs:1200, ui/dr-ui/src/develop.rs:1234, ui/dr-ui/src/develop.rs:532, ui/dr-ui/src/lib.rs:54, ui/dr-ui/src/lib.rs:585
FR-DSP-6 core/dr-pipeline/src/operation.rs:168, 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:2157, ui/dr-ui/src/develop.rs:2189, ui/dr-ui/src/develop.rs:37, ui/dr-ui/src/develop.rs:576, ui/dr-ui/src/histogram.rs:1, ui/dr-ui/src/lib.rs:1079, ui/dr-ui/src/lib.rs:279, ui/dr-ui/ui/app.slint:227, 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:1328, core/dr-pipeline/src/graph.rs:298, core/dr-pipeline/src/operation.rs:168, 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:317, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/src/settings_ui.rs:48, ui/dr-ui/src/settings_ui.rs:558
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:1587, ui/dr-ui/src/lib.rs:170, ui/dr-ui/src/lib.rs:317, ui/dr-ui/src/lib.rs:352, ui/dr-ui/src/library_ui.rs:2216, ui/dr-ui/src/library_ui.rs:3843, ui/dr-ui/src/library_ui.rs:3855, ui/dr-ui/src/library_ui.rs:3867, ui/dr-ui/src/library_ui.rs:424, ui/dr-ui/src/library_ui.rs:495, ui/dr-ui/src/library_ui.rs:552, ui/dr-ui/ui/app.slint:677, ui/dr-ui/ui/app.slint:973, ui/dr-ui/ui/library.slint:459, ui/dr-ui/ui/library.slint:495, ui/dr-ui/ui/library.slint:793
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:409, core/dr-export/src/lib.rs:125, core/dr-export/src/lib.rs:1, core/dr-gpu/src/adjust.rs:362, ui/dr-ui/src/develop.rs:654, ui/dr-ui/src/lib.rs:317
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/library.rs:1364, ui/dr-ui/src/library.rs:349, ui/dr-ui/src/library.rs:619, ui/dr-ui/src/library_ui.rs:1172, ui/dr-ui/src/library_ui.rs:2216, ui/dr-ui/src/library_ui.rs:365, 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:811, 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/lib.rs:1363, ui/dr-ui/src/lib.rs:2021, ui/dr-ui/src/library.rs:1106, ui/dr-ui/src/library.rs:1129, ui/dr-ui/src/library.rs:1287, ui/dr-ui/src/library_ui.rs:1097, ui/dr-ui/src/library_ui.rs:1329, ui/dr-ui/src/library_ui.rs:187, ui/dr-ui/src/library_ui.rs:198, ui/dr-ui/src/library_ui.rs:207, ui/dr-ui/src/library_ui.rs:266, ui/dr-ui/src/library_ui.rs:276, ui/dr-ui/src/library_ui.rs:318, ui/dr-ui/src/library_ui.rs:3394, ui/dr-ui/src/library_ui.rs:381, ui/dr-ui/src/library_ui.rs:412, ui/dr-ui/src/library_ui.rs:424, ui/dr-ui/src/library_ui.rs:877, ui/dr-ui/src/library_ui.rs:978, ui/dr-ui/src/settings_store.rs:1, ui/dr-ui/src/settings_ui.rs:1, ui/dr-ui/ui/library.slint:541
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
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:108, core/dr-pipeline/src/sidecar.rs:89, ui/dr-ui/src/lib.rs:1332, ui/dr-ui/src/library.rs:291, ui/dr-ui/src/library_ui.rs:333
FR-NC-9 core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/sync.rs:1, core/dr-pipeline/src/sidecar.rs:212, ui/dr-ui/src/library.rs:619, ui/dr-ui/src/library.rs:746
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:198, core/dr-types/src/lib.rs:125, core/dr-types/src/lib.rs:196
FR-RAW-3 core/dr-decode/src/lib.rs:409, core/dr-decode/src/lib.rs:94
FR-RAW-4 core/dr-decode/src/error.rs:1, ui/dr-ui/src/lib.rs:170
FR-RAW-5 core/dr-decode/src/lib.rs:122, 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:2103, ui/dr-ui/src/lib.rs:62, ui/dr-ui/ui/library.slint:583
FR-UI-2 ui/dr-ui/src/lib.rs:62
FR-UI-3 ui/dr-ui/ui/collections.slint:4
FR-UI-4 ui/dr-ui/ui/app.slint:1147
FR-UI-5 ui/dr-ui/src/collections_ui.rs:1, ui/dr-ui/src/lib.rs:2137, ui/dr-ui/ui/collections.slint:4
FR-UI-7 core/dr-pipeline/src/descriptor.rs:100, core/dr-pipeline/src/framing.rs:256
NFR-ARCH-2 core/dr-catalog/src/jobs.rs:1
NFR-ARCH-3 ui/dr-ui/src/export.rs:1482, ui/dr-ui/src/export.rs:1508, ui/dr-ui/src/export.rs:410, ui/dr-ui/src/export.rs:436, ui/dr-ui/src/lib.rs:1621, ui/dr-ui/ui/app.slint:688, ui/dr-ui/ui/library.slint:495
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
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:54
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:210

Not yet tagged

69 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-NC-6b
  • 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