Files
DarkRoom/docs/traceability.md
T
dtourolle 09e3043f4c Add secure credential storage, sessions, and a launch screen
Login now persists properly rather than through the JSON file the test
harness was using.

  dr-plat            SecretStore trait plus a Secret Service backend.
                     Verified against the live GNOME Keyring: store,
                     retrieve, delete, confirm-gone all round-trip.
  Session/SessionStore   splits credentials from settings — the app
                     password goes to the keyring (FR-NC-2), while
                     server, login, chosen root and format selection are
                     ordinary config. A test asserts the credential never
                     appears in the config file.
  LaunchModel        the launch-screen state machine, testable without a
                     display server: sign in, approve in browser, choose
                     folder, tick formats, sign out.
  launch.slint       the screen itself, in its own file.

Absence of a secrets daemon is an explicit degraded mode, not a silent
fallback to plaintext — the screen says sign-in will not persist rather
than letting the user find out next launch. Android's Keystore backend
fails loudly for the same reason: a no-op store would look like it
worked and then lose the credential.

Two bugs caught by tests rather than by running it:

  - fail() after busy() signed the user out, because busy() had already
    discarded the session. A failed *scan* would have logged you out.
    Busy now carries the session.
  - normalise_server upgrades http:// to https:// rather than accepting
    it. NFR-SEC-3 requires TLS, and silently sending a credential in the
    clear is not a decision to make on the user's behalf.

launch.slint is not yet wired into app.slint. Calling slint_build::compile
twice replaces the generated module rather than adding to it, which broke
the other in-flight work on dr-ui; I reverted that immediately. Wiring it
needs an import inside app.slint, which is that work's file to change.

419 tests passing across ten crates.
2026-08-09 15:20:39 +02:00

8.6 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 63
TRACES tags found 49
Requirements defined 143
Requirements covered 49
Coverage 34.3% (49/143)

By type

Type Covered Defined
FR 36 90
NFR 11 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 core/dr-catalog/src/scan.rs:1, core/dr-sync/src/scan.rs:50, core/dr-types/src/lib.rs:174, tools/traceability/src/lib.rs:473, tools/traceability/src/lib.rs:505
FR-CAT-1a core/dr-types/src/lib.rs:36
FR-CAT-2 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/schema.rs:1, tools/traceability/src/lib.rs:473
FR-CAT-3 core/dr-catalog/src/jobs.rs:1
FR-CAT-4 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/query.rs:1
FR-CAT-5 core/dr-decode/src/lib.rs:216
FR-CAT-6 core/dr-catalog/src/lib.rs:1, core/dr-catalog/src/query.rs:1, core/dr-types/src/selector.rs:1
FR-CAT-7 core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/sync.rs:1, core/dr-types/src/selector.rs:1
FR-CAT-9 core/dr-catalog/src/scan.rs:1, core/dr-sync-nextcloud/src/desktop_client.rs:30, core/dr-types/src/lib.rs:93
FR-CULL-1 core/dr-decode/src/preview.rs:96
FR-CULL-2 core/dr-decode/src/preview.rs:123
FR-DEV-3 core/dr-pipeline/src/framing.rs:174
FR-DEV-3a core/dr-pipeline/src/graph.rs:128, core/dr-pipeline/src/graph.rs:15, core/dr-pipeline/src/graph.rs:33
FR-DEV-3b core/dr-pipeline/src/graph.rs:33
FR-DEV-3c core/dr-pipeline/src/graph.rs:128
FR-DEV-3d core/dr-pipeline/src/framing.rs:174
FR-DEV-3e core/dr-decode/src/lib.rs:325, core/dr-decode/src/lib.rs:445
FR-DEV-4 core/dr-gpu/src/lib.rs:123
FR-DSP-1 ui/dr-ui/src/lib.rs:31
FR-EXP-9 core/dr-decode/src/lib.rs:242
FR-NC-1 core/dr-sync-nextcloud/src/auth.rs:132, core/dr-sync-nextcloud/src/auth.rs:44
FR-NC-12 core/dr-sync-nextcloud/src/lib.rs:34, core/dr-sync/src/lib.rs:130, core/dr-sync/src/lib.rs:36
FR-NC-3 core/dr-decode/src/preview.rs:123, core/dr-sync/src/capability.rs:41
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:130, core/dr-sync/src/scan.rs:50
FR-NC-5 core/dr-sync-nextcloud/src/propfind.rs:51
FR-NC-6a core/dr-types/src/selector.rs:1
FR-NC-6c core/dr-sync-nextcloud/src/desktop_client.rs:30, core/dr-types/src/lib.rs:175, core/dr-types/src/lib.rs:93
FR-NC-9 core/dr-catalog/src/merge.rs:1, core/dr-catalog/src/sync.rs:1
FR-PLAT-AND-1 core/dr-types/src/lib.rs:36
FR-PLAT-AND-3 core/dr-catalog/src/jobs.rs:1
FR-RAW-1 core/dr-decode/src/lib.rs:174, core/dr-types/src/lib.rs:103, core/dr-types/src/lib.rs:174
FR-RAW-3 core/dr-decode/src/lib.rs:242, core/dr-decode/src/lib.rs:70
FR-RAW-4 core/dr-decode/src/error.rs:1
FR-RAW-5 core/dr-decode/src/lib.rs:98
FR-UI-1 ui/dr-ui/src/lib.rs:39
FR-UI-2 ui/dr-ui/src/lib.rs:39
NFR-ARCH-2 core/dr-catalog/src/jobs.rs:1
NFR-ARCH-4 core/dr-catalog/src/error.rs:1
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, tools/traceability/src/lib.rs:473
NFR-P13 core/dr-decode/src/preview.rs:96
NFR-R1 core/dr-catalog/src/sync.rs:1
NFR-R5 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 ui/dr-ui/src/lib.rs:31
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:123

Not yet tagged

94 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-8
  • FR-CULL-3
  • FR-CULL-4
  • FR-CULL-5
  • FR-CULL-6
  • FR-CULL-7
  • FR-DEV-1
  • FR-DEV-2
  • 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-10
  • FR-NC-11
  • FR-NC-2
  • FR-NC-6
  • FR-NC-6b
  • FR-NC-7
  • FR-NC-8
  • FR-PLAT-AND-2
  • 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-3
  • 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-R2
  • NFR-R3
  • NFR-R4
  • NFR-R6
  • NFR-RES-2
  • NFR-RES-3
  • NFR-RES-4
  • NFR-SEC-2
  • NFR-SEC-3
  • NFR-SEC-4
  • R2
  • R3
  • R5
  • R6