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).
188 lines
5.0 KiB
Markdown
188 lines
5.0 KiB
Markdown
# Requirements traceability matrix
|
|
|
|
<!-- GENERATED FILE — do not edit by hand. -->
|
|
<!-- Regenerate: cargo run -p traceability -- report -->
|
|
|
|
Denominators are parsed from [`requirements.md`](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#L473), [`tools/traceability/src/lib.rs:505`](../tools/traceability/src/lib.rs#L505) |
|
|
| FR-CAT-1a | [`core/dr-types/src/lib.rs:23`](../core/dr-types/src/lib.rs#L23) |
|
|
| FR-CAT-2 | [`tools/traceability/src/lib.rs:473`](../tools/traceability/src/lib.rs#L473) |
|
|
| FR-CAT-5 | [`core/dr-decode/src/lib.rs:125`](../core/dr-decode/src/lib.rs#L125) |
|
|
| FR-CULL-1 | [`core/dr-decode/src/preview.rs:96`](../core/dr-decode/src/preview.rs#L96) |
|
|
| FR-CULL-2 | [`core/dr-decode/src/preview.rs:123`](../core/dr-decode/src/preview.rs#L123) |
|
|
| FR-DEV-4 | [`core/dr-gpu/src/lib.rs:119`](../core/dr-gpu/src/lib.rs#L119) |
|
|
| FR-DSP-1 | [`ui/dr-ui/src/lib.rs:21`](../ui/dr-ui/src/lib.rs#L21) |
|
|
| FR-EXP-9 | [`core/dr-decode/src/lib.rs:151`](../core/dr-decode/src/lib.rs#L151) |
|
|
| FR-NC-12 | [`core/dr-sync/src/lib.rs:127`](../core/dr-sync/src/lib.rs#L127), [`core/dr-sync/src/lib.rs:33`](../core/dr-sync/src/lib.rs#L33) |
|
|
| FR-NC-3 | [`core/dr-decode/src/preview.rs:123`](../core/dr-decode/src/preview.rs#L123), [`core/dr-sync/src/capability.rs:41`](../core/dr-sync/src/capability.rs#L41) |
|
|
| FR-NC-4 | [`core/dr-sync/src/capability.rs:6`](../core/dr-sync/src/capability.rs#L6), [`core/dr-sync/src/lib.rs:127`](../core/dr-sync/src/lib.rs#L127) |
|
|
| FR-NC-6c | [`core/dr-types/src/lib.rs:111`](../core/dr-types/src/lib.rs#L111) |
|
|
| FR-PLAT-AND-1 | [`core/dr-types/src/lib.rs:23`](../core/dr-types/src/lib.rs#L23) |
|
|
| FR-RAW-1 | [`core/dr-decode/src/lib.rs:83`](../core/dr-decode/src/lib.rs#L83), [`core/dr-types/src/lib.rs:70`](../core/dr-types/src/lib.rs#L70) |
|
|
| FR-RAW-3 | [`core/dr-decode/src/lib.rs:151`](../core/dr-decode/src/lib.rs#L151) |
|
|
| FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1) |
|
|
| FR-RAW-5 | [`core/dr-decode/src/lib.rs:62`](../core/dr-decode/src/lib.rs#L62) |
|
|
| FR-UI-1 | [`ui/dr-ui/src/lib.rs:29`](../ui/dr-ui/src/lib.rs#L29) |
|
|
| FR-UI-2 | [`ui/dr-ui/src/lib.rs:29`](../ui/dr-ui/src/lib.rs#L29) |
|
|
| NFR-OPS-1 | [`tools/traceability/src/lib.rs:266`](../tools/traceability/src/lib.rs#L266) |
|
|
| NFR-P1 | [`tools/traceability/src/lib.rs:473`](../tools/traceability/src/lib.rs#L473) |
|
|
| NFR-P13 | [`core/dr-decode/src/preview.rs:96`](../core/dr-decode/src/preview.rs#L96) |
|
|
| NFR-R7 | [`core/dr-gpu/src/error.rs:1`](../core/dr-gpu/src/error.rs#L1) |
|
|
| NFR-R8 | [`core/dr-gpu/src/error.rs:1`](../core/dr-gpu/src/error.rs#L1) |
|
|
| NFR-RES-1 | [`ui/dr-ui/src/lib.rs:21`](../ui/dr-ui/src/lib.rs#L21) |
|
|
| NFR-SEC-1 | [`core/dr-decode/src/error.rs:1`](../core/dr-decode/src/error.rs#L1) |
|
|
| R1 | [`tools/traceability/src/lib.rs:489`](../tools/traceability/src/lib.rs#L489), [`tools/traceability/src/lib.rs:493`](../tools/traceability/src/lib.rs#L493) |
|
|
| R4 | [`core/dr-gpu/src/lib.rs:119`](../core/dr-gpu/src/lib.rs#L119) |
|
|
|
|
## 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.
|
|
|
|
<details><summary>Show untagged requirements</summary>
|
|
|
|
- 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
|
|
|
|
</details>
|