Files
dtourolle 7eb5c175af
CI / fmt, clippy, test (pull_request) Failing after 54s
CI / static musl binary (pull_request) Skipped
CI / advisories and licences (pull_request) Successful in 39s
docs: tag the untagged verifications, and record the UR-007 conflict
Five tests and the schema constant implemented requirements without
carrying a tag, so those requirements read as uncovered when they were
not. No behaviour changes here — every edit is a comment.

Also documents `static` as a real tier rather than an exemption: it is
already in `ci_executable_tiers` and its checks run in CI, and it exists
because DR-007's single binary and DR-012's licence policy are properties
of the build that a unit test could only assert as theatre.

The UR-007 note records a cross-repo status conflict rather than
resolving it. `jRay` JR-025 is `Done` and claims UR-007, but the fetch
path that would exercise it (`jRay` JR-031) is still `Planned`. Either
JR-025 is scoped to selection alone or it over-claims; until that is
settled neither register should be trusted for UR-007 coverage.

The gate reports 0 orphan tags and 19/19 UR coverage.

TRACES: DR-001, DR-014, UR-015, UR-016, UR-018 | SR-003, SR-004
2026-07-31 16:26:10 +02:00

21 KiB

Requirements traceability matrix

Generated: 2026-07-31T14:25:51+00:00

Denominators are read from requirements.md at run time, never hardcoded. Coverage counts a requirement only when it is tagged in source and has a verification tier this repo's CI host can execute (T1, T2, static).

Summary

Metric Value
Source files scanned 29
TRACES tags found 50
EXCEPTION tags found 0
Requirements defined 33
Requirements covered 31
Coverage 93.9% (31/33)
Coverage of CI-executable scope 93.9% (31/33)
Tagged but unexecuted in CI 0
Orphan tags 0

By type

Type Covered Tagged but unexecuted Defined
UR 19 0 19
DR 12 0 14
  • PR tags present (separate taxonomy, not counted in coverage): PR-004, PR-005, PR-006
  • SR tags present (separate taxonomy, not counted in coverage): SR-001, SR-002, SR-003, SR-004, SR-005

Not executable in CI

These requirements have no verification tier this repo's CI host can run, so a tag on them is evidence of intent, not of verification. They are never counted as covered.

None.

Orphan tags

A tag naming an ID requirements.md does not define. This is what renumbering produces, and what a typo produces.

None.

Requirements tracing up to nothing

A register row whose Traces to cell names no parent. Work serving no stated goal is how scope creeps in, and it is invisible unless something looks.

None.

Recorded exceptions

Deliberate, documented departures from an invariant (EXCEPTION: XX-nnn <reason>). Reported separately and never counted as coverage — an exception is a decision to be reviewed, not evidence a requirement is met.

None.

Register

ID Status Tier Traces to Trace state Tagged in Requirement
UR-001 Done T2 SR-001 covered src/api/exists.rs, src/matching.rs Cheap existence probe, separate from the fetch, returning availabilit…
UR-002 Done T2 PR-006 covered src/api/upload.rs, src/ingest.rs Accept a contributed manifest for a media item
UR-003 Done T1, T2 SR-004 covered src/api/upload.rs, src/castcheck.rs, src/model.rs, src/validate.rs, src/worker.rs Content verification: strict schema, size caps, approximate TMDB cast…
UR-004 Done T1, T2 SR-004 covered src/auth.rs, src/ratelimit.rs Rate limiting, per token where present and per source IP otherwise
UR-005 Done T1, T2 SR-004 covered src/api/report.rs, src/api/upload.rs, src/auth.rs, src/castcheck.rs, src/worker.rs Trust without accounts: not usable as a content store, nor for prank …
UR-006 Done T2 PR-006 covered src/api/fetch.rs, src/api/upload.rs, src/validate.rs Serve and accept a whole series in one operation
UR-007 In Progress unset PR-005 covered src/api/exists.rs Plugin queries an ordered, configurable list of servers
UR-008 Done T1, T2 PR-006 covered src/api/federation.rs, src/worker.rs Servers replicate manifests between each other
UR-009 In Progress T1 SR-003 covered src/validate.rs Store an audio spectral-peak signature for content-based identificati…
UR-010 Done T1, T2 SR-001 covered src/api/fetch.rs, src/castcheck.rs, src/db/repo.rs, src/model.rs Identity crossing the API boundary is TMDB/IMDB ids, never a name alo…
UR-011 Done T2 SR-004 covered src/model.rs, src/validate.rs Reject any field capable of carrying binary or attacker-chosen content
UR-012 Done T2 SR-005 covered src/db/repo.rs, src/ingest.rs Never accept, store, or serve gallery data — reference faces or embed…
UR-013 Done T1 SR-002 covered src/api/fetch.rs, src/model.rs, src/validate.rs Windows are scene-scoped claims; never reinterpret their boundaries
UR-014 Done T1 SR-003 covered src/api/federation.rs, src/model.rs, src/validate.rs Reject an unknown jmanifest_version outright, never guess
UR-015 Done T2 SR-003 covered src/validate.rs, tests/api.rs Accept extraction.extinction_sec in place of anneal_sec
UR-016 Done T2 SR-003 covered src/validate.rs, tests/api.rs Accept and store extraction.gallery_scope; rank on it (§7)
UR-017 Done T1, T2 SR-003 covered src/model.rs Accept per-window belief and identification route; scenes are objec…
UR-018 Done T1 SR-003 covered src/ingest.rs Exclude belief and route from content_id, replicating them as attri…
UR-019 Done T2 PR-006 covered src/api/upload.rs Contributed manifests are CC0 1.0; the grant is delivered with the to…
DR-001 Done T1 SR-004 covered src/model.rs, tests/api.rs Strict parse boundary: unknown fields rejected structurally, not by v…
DR-002 Done T1 SR-004 covered src/api/fetch.rs, src/db/repo.rs Fully relational storage — no JSON blob on the write path
DR-003 Done T1 PR-004 covered src/db/mod.rs Single serialized writer connection, with a read pool alongside
DR-004 Done T1 PR-004 covered src/db/repo.rs All database access behind a repository layer, not scattered through …
DR-005 Done T1 PR-004 covered src/db/repo.rs Background work in-process, with the job queue as a table so it survi…
DR-006 Done T1 PR-004 covered src/ratelimit.rs Rate-limit counters in process memory; no external counter store
DR-007 Done static PR-004 untagged - Ship a single static binary plus one database file; container optional
DR-008 Done T2 SR-004 covered src/auth.rs, src/config.rs X-Forwarded-For honoured only from explicitly configured proxies
DR-009 Done T2 SR-004 covered src/app.rs Body caps enforced while streaming, before parsing, per route
DR-010 Done T1 SR-003 covered src/api/json.rs Request bodies are UTF-8 only, rejected with a diagnosable error othe…
DR-011 Done T1 SR-003 covered src/content_id.rs, src/validate.rs content_id canonical form is byte-stable and cross-implementation t…
DR-012 Done static PR-004 untagged - Dependency audit: advisories, licence policy, source policy
DR-013 Done T1 SR-003 covered src/api/json.rs, src/app.rs, src/error.rs API errors use the status codes the spec names, not the framework's d…
DR-014 Done static PR-004 covered src/db/mod.rs Portable SQL — no SQLite-specific form where a standard one exists

Detailed mapping

DR-001

Locations: 2

DR-002

Locations: 3

DR-003

Locations: 1

DR-004

Locations: 1

  • src/db/repo.rs:331 — pub fn insert_manifest(tx: &Transaction<'_>, m: &NewManifest<'_>) -> anyhow::Result<()>

DR-005

Locations: 1

  • src/db/repo.rs:702 — pub fn lease_jobs(tx: &Transaction<'_>, now: &str, limit: usize) -> anyhow::Result<Vec<Jo…

DR-006

Locations: 1

DR-008

Locations: 2

DR-009

Locations: 1

DR-010

Locations: 1

DR-011

Locations: 3

DR-013

Locations: 3

DR-014

Locations: 1

PR-004

Locations: 4

PR-005

Locations: 2

PR-006

Locations: 10

SR-001

Locations: 7

SR-002

Locations: 4

SR-003

Locations: 15

SR-004

Locations: 18

SR-005

Locations: 2

UR-001

Locations: 3

UR-002

Locations: 2

UR-003

Locations: 6

UR-004

Locations: 2

  • src/auth.rs:76 — pub fn client_ip(headers: &HeaderMap, peer: Option<IpAddr>, trusted_proxies: &[IpAddr]) -…
  • src/ratelimit.rs:93 — impl Default for RateLimiter

UR-005

Locations: 6

UR-006

Locations: 3

UR-007

Locations: 1

UR-008

Locations: 6

UR-009

Locations: 1

  • src/validate.rs:364 — pub fn validate_audio_signature(sig: &str, runtime_sec: f64) -> VResult<()>

UR-010

Locations: 4

UR-011

Locations: 4

UR-012

Locations: 2

UR-013

Locations: 4

UR-014

Locations: 3

UR-015

Locations: 3

UR-016

Locations: 2

UR-017

Locations: 2

UR-018

Locations: 1

UR-019

Locations: 1