Files
DarkRoom/docs/traceability.md
T
dtourolle 9717e59909 Add RAW decode and a working image viewer
dr-decode exposes four entry points rather than one decode, because
callers differ sharply in what they need (ARCH §3.2): culling wants a
preview, the grid wants metadata, only develop and export touch sensor
data. Fusing them forces a full decode where a header read suffices,
which is why Lightroom stalls ~2s per image while culling.

Smoke-tested against 1,852 real Canon CR2 files (EOS 6D, ~27MB each):

  metadata      0.2ms   from a 256KB header read, no full decode
  preview     ~250ms   5472x3648, downscaled to 2048 for display
  jpeg          3.0ms

Two findings worth recording:

rawler 0.7.2's CR2 decoder implements only full_image; thumbnail_image
and preview_image are unimplemented trait defaults returning None. So
every rung of the preview ladder resolves to a full-resolution decode at
~250ms — 5x over NFR-P13's 50ms budget. CR2 does carry smaller IFDs, so
the fix is our own IFD walk or an upstream contribution. The ladder is
written now so that fixing it is a decoder change, not a change to every
caller. Recorded in milestone-v0.1 risks.

Preview.downscale_to bounds memory: a 5472x3648 RGBA preview is 79.8MB,
which exhausts a phone's budget after a handful of images. Box-filtered
so downscaled thumbnails do not alias.

Also fixed a RefCell double-borrow that panicked on first navigation —
`*x.borrow_mut() = *x.borrow() + 1` holds both borrows at once. Verified
with 10,000 programmatic navigations.

58 tests passing. Traceability 20.3% (29/143).
2026-08-09 08:28:26 +02:00

5.0 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 20
TRACES tags found 24
Requirements defined 143
Requirements covered 29
Coverage 20.3% (29/143)

By type

Type Covered Defined
FR 20 90
NFR 7 47
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 tools/traceability/src/lib.rs:473, tools/traceability/src/lib.rs:505
FR-CAT-1a core/dr-types/src/lib.rs:23
FR-CAT-2 tools/traceability/src/lib.rs:473
FR-CAT-5 core/dr-decode/src/lib.rs:125
FR-CULL-1 core/dr-decode/src/preview.rs:96
FR-CULL-2 core/dr-decode/src/preview.rs:123
FR-DEV-4 core/dr-gpu/src/lib.rs:119
FR-DSP-1 ui/dr-ui/src/lib.rs:21
FR-EXP-9 core/dr-decode/src/lib.rs:151
FR-NC-12 core/dr-sync/src/lib.rs:127, core/dr-sync/src/lib.rs:33
FR-NC-3 core/dr-decode/src/preview.rs:123, core/dr-sync/src/capability.rs:41
FR-NC-4 core/dr-sync/src/capability.rs:6, core/dr-sync/src/lib.rs:127
FR-NC-6c core/dr-types/src/lib.rs:111
FR-PLAT-AND-1 core/dr-types/src/lib.rs:23
FR-RAW-1 core/dr-decode/src/lib.rs:83, core/dr-types/src/lib.rs:70
FR-RAW-3 core/dr-decode/src/lib.rs:151
FR-RAW-4 core/dr-decode/src/error.rs:1
FR-RAW-5 core/dr-decode/src/lib.rs:62
FR-UI-1 ui/dr-ui/src/lib.rs:29
FR-UI-2 ui/dr-ui/src/lib.rs:29
NFR-OPS-1 tools/traceability/src/lib.rs:266
NFR-P1 tools/traceability/src/lib.rs:473
NFR-P13 core/dr-decode/src/preview.rs:96
NFR-R7 core/dr-gpu/src/error.rs:1
NFR-R8 core/dr-gpu/src/error.rs:1
NFR-RES-1 ui/dr-ui/src/lib.rs:21
NFR-SEC-1 core/dr-decode/src/error.rs:1
R1 tools/traceability/src/lib.rs:489, tools/traceability/src/lib.rs:493
R4 core/dr-gpu/src/lib.rs:119

Not yet tagged

114 of 143 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-11
  • FR-CAT-12
  • FR-CAT-13
  • FR-CAT-14
  • FR-CAT-3
  • FR-CAT-4
  • FR-CAT-6
  • FR-CAT-7
  • FR-CAT-8
  • FR-CAT-9
  • FR-CULL-3
  • FR-CULL-4
  • FR-CULL-5
  • FR-CULL-6
  • FR-CULL-7
  • FR-DEV-1
  • FR-DEV-2
  • FR-DEV-3
  • FR-DEV-3a
  • FR-DEV-3b
  • FR-DEV-3c
  • FR-DEV-3d
  • FR-DEV-3e
  • FR-DEV-3f
  • FR-DEV-3g
  • FR-DEV-5
  • FR-DEV-6
  • FR-DEV-7
  • FR-DEV-8
  • FR-DSP-2
  • FR-DSP-3
  • FR-DSP-4
  • FR-DSP-5
  • FR-DSP-6
  • FR-DSP-7
  • FR-DSP-8
  • FR-EXP-1
  • FR-EXP-2
  • FR-EXP-3
  • FR-EXP-4
  • FR-EXP-5
  • FR-EXP-6
  • FR-EXP-7
  • FR-EXP-8
  • FR-NC-1
  • FR-NC-10
  • FR-NC-11
  • FR-NC-2
  • FR-NC-5
  • FR-NC-6
  • FR-NC-6a
  • FR-NC-6b
  • FR-NC-7
  • FR-NC-8
  • FR-NC-9
  • FR-PLAT-AND-2
  • FR-PLAT-AND-3
  • FR-PLAT-AND-4
  • FR-PLAT-AND-5
  • FR-PLAT-AND-6
  • FR-PLAT-LIN-1
  • FR-PLAT-LIN-2
  • FR-PLAT-LIN-3
  • FR-RAW-2
  • FR-UI-3
  • FR-UI-4
  • FR-UI-5
  • FR-UI-6
  • FR-UI-7
  • NFR-A11Y-1
  • NFR-A11Y-2
  • NFR-A11Y-3
  • NFR-ARCH-1
  • NFR-ARCH-2
  • NFR-ARCH-3
  • NFR-ARCH-4
  • 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-P9
  • NFR-PORT-1
  • NFR-PORT-2
  • NFR-PORT-3
  • NFR-R1
  • NFR-R2
  • NFR-R3
  • NFR-R4
  • NFR-R5
  • NFR-R6
  • NFR-RES-2
  • NFR-RES-3
  • NFR-RES-4
  • NFR-SEC-2
  • NFR-SEC-3
  • NFR-SEC-4
  • R2
  • R3
  • R5
  • R6