Correcting the previous commit: I claimed VFS placeholders could not be
downloaded. That was wrong. The desktop client exposes a socket at
$XDG_RUNTIME_DIR/Nextcloud/socket speaking newline-delimited
COMMAND:argument, and MAKE_AVAILABLE_LOCALLY:<path> does fetch the file.
Verified against client 4.0.7: a 1-byte stub became a real 2.8MB file in
2.8 seconds.
Implemented as dr-sync-nextcloud::desktop_client, deliberately optional.
Android has no desktop client, no XDG_RUNTIME_DIR socket and no
placeholders, so detect() returns None there and callers fall back to the
connector. It earns its place only because it is ~30 lines with no
dependencies: where a library already lives in a VFS folder, asking the
client to fetch beats downloading a second copy over WebDAV and leaving
the client's placeholder state inconsistent.
What this does not change: hydration is whole-file, so it suits the
original tier and never browsing. Filling a grid this way downloads the
entire library. Range extraction remains the only mechanism satisfying
FR-NC-3, and ARCH §9.0 now says so precisely.
Also fixes two real Android build failures found by cross-compiling:
- reqwest's `rustls` feature defaults to aws-lc-rs, whose aws-lc-sys
crate is C and fails under the NDK — exactly the pain D1 chose Rust
to avoid. Switched to rustls-no-provider + ring, installing the
provider in the constructor so no caller can build a client that
panics on first use.
- ring itself needs CC/AR per target; cargo-ndk sets only the linker.
Added them to the container.
87 tests passing. dr-sync-nextcloud cross-compiles for aarch64-linux-android.
5.9 KiB
5.9 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 | 25 |
| TRACES tags found | 31 |
| Requirements defined | 143 |
| Requirements covered | 32 |
| Coverage | 22.4% (32/143) |
By type
| Type | Covered | Defined |
|---|---|---|
| FR | 23 | 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
Not yet tagged
111 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-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-10
- FR-NC-11
- FR-NC-2
- 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