Files
scene-actor-extraction/docs/traceability.md
T
dtourolle faaa71fa09 refactor(traceability): parameterise the extractor for all three components
The tool is moving into the jray-project submodule to be shared by
scene-actor-extraction (C++/Python), jRay (C#) and JRay-public-server
(Rust). Two constants blocked that: LOCAL_TYPES and SOURCE_SUFFIXES were
hardcoded to this repo, so either sibling parsed zero requirements and
scanned zero files. Both, plus the register path, scan roots, system-spec
path, exclude list and CI-executable tier set, are now configuration.

One implementation, parameterised. A second copy for "the other language"
is how two implementations start drifting apart, so there is exactly one -
the same code path now produces:

  scene-actor-extraction  AR/DP/IR/GR/VR   59 defined   0 tagged    0.0%
  jRay                    JR               46 defined  24 covered  52.2%
  JRay-public-server      UR/DR            32 defined  23 covered  71.9%

Configuration is traceability.toml at the component repo root, CLI flags,
or both (flags win). Its directory defines the repo root, so the gate works
from any subdirectory. `--print-example-config` emits the annotated schema.
The JSON report echoes the settings it ran with, since a shared tool's
output is otherwise ambiguous about which repo it describes.

The refusal behaviour is kept and sharpened, because parameterising is
exactly what makes it easy to point a repo at the wrong prefixes or the
wrong suffixes. Zero requirements parsed or zero files scanned is still a
hard failure, and the message now names the setting that is wrong rather
than printing a plausible 0%. Config errors exit 2, not 1: a broken config
is not a coverage failure, and conflating them makes CI logs lie about why
the job went red.

Also fixed while adapting to the sibling registers, which are read but not
modified here:

  * escaped `\|` inside a markdown cell no longer shifts every later column
    (the server's register contains `small-\|M\|`);
  * a tag above an attribute-decorated declaration attributes to the
    declaration, not to `[HttpGet(...)]` or `#[derive(...)]` - the gap
    jRay's register calls out;
  * Rust and C# declaration patterns for context extraction;
  * the missing-tier warning is suppressed for a register that assigns no
    tiers at all, rather than listing every requirement in it.

The workflow is now component-agnostic too: the changed-file check reads
its extension list out of the report the gate just wrote, so the definition
of "source file" lives in one place.

79 tests, still fixture-based, now including the cross-repo cases: the same
parser over JR and UR/DR registers, the same scanner over Rust and C#, and
both misconfigurations failing loudly.
2026-07-30 18:35:56 +02:00

9.7 KiB
Raw Blame History

Requirements traceability matrix

Generated: 2026-07-30T16:35:36+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, T3, static).

Summary

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

By type

Type Covered Tagged but unexecuted Defined
AR 0 0 27
DP 0 0 6
IR 0 0 8
GR 0 0 9
VR 0 0 9

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.

ID Tiers Tagged in source Requirement
AR-027 T4 no Throughput acceptable for arbitrary gallery size
VR-001 out-of-ci no HDF5 post-inference dump at the embedded-frame boundary
VR-002 out-of-ci no Replay drives the real KPN nodes, not a reimplementation
VR-003 out-of-ci no Scoring: micro-F1 against X-Ray, precision/recall logged at every eva…
VR-004 out-of-ci no Reproducible validation corpus with ground truth
VR-005 out-of-ci no Minimum face size study — TPI/FPI vs probe size, gallery held at nati…
VR-006 out-of-ci no Re-tune scene_threshold once native-rate decode lands
VR-007 out-of-ci no Expansion band, clustering threshold, and deferred-pass ablation
VR-008 out-of-ci no Gallery scaling benchmark — throughput vs gallery size

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
AR-001 Done T3 SR-002 untagged - Detect faces in sampled frames; emit bbox, confidence, 5-point landma…
AR-002 Planned T2 SR-002 untagged - Minimum face size 66×66 px, expressed in original resolution (dec…
AR-003 Planned T1, T2, T4 SR-002 untagged - No fixed per-frame face cap — crowd scenes must not lose background c…
AR-004 Planned T1, T4 SR-002 untagged - Backpressure: unbounded faces/frame absorbed by slowing, never by dro…
AR-005 Done T1, T3 SR-002 untagged - Align to 112×112 via ArcFace 5-point similarity transform
AR-006 Done T3 SR-002 untagged - 512-d L2-normalised embeddings, batched
AR-007 In Progress T2 SR-002 untagged - Associate detections by IoU + embedding, with frame-dependent wei…
AR-008 Planned T2 SR-002 untagged - One track pool keyed on last_seen; no separate revival path
AR-009 Done T2 SR-002 untagged - Camera-cut detection (histogram) as an association hint
AR-010 In Progress T2 SR-002 untagged - Scene-boundary detection (TransNetV2) as an association hint
AR-011 Planned T1, T2 SR-002 untagged - Every model is fed the input it was trained for — cost reduced by…
AR-012 Planned T2 SR-002 untagged - Presence follows track extent, not per-frame recognition
AR-013 Planned T2 SR-002 untagged - last_seen optional state machine; window ends at last sighting, nev…
AR-014 Planned T2 SR-002 untagged - Belief swap A→B terminates the track and starts a new one
AR-015 Planned T2 SR-002 untagged - Two live tracks owned by one actor ⇒ treat as a detected cut, re-asso…
AR-016 Planned T2 SR-002 untagged - All tracks closed at EOF — a film ends with faces on screen
AR-017 Planned T1, T2 SR-002 untagged - Every presence claim carries its belief and identification route
AR-018 Planned T1, T2 SR-005 untagged - Per-subject embedding store with banded admission (novel enough, safe…
AR-019 In Progress T2 SR-005 untagged - Per-film gallery annex from owned tracks; acquires the non-frontal vi…
AR-020 Planned T2 SR-005 untagged - Deferred re-identification of unknown tracks against the final expand…
AR-021 Planned T2 SR-005 untagged - Cluster unknown tracks into one entity per person, under temporal can…
AR-022 Planned T1, T2 §4 untagged - Capture still-unidentified tracks: embeddings, metadata, **context cr…
AR-023 Done T1 SR-002 untagged - Fit sigmoid calibration from intra/inter similarity distributions
AR-024 Planned T1, static SR-002 untagged - Always the calibrated probability, never a raw cosine — exception…
AR-025 Planned T1 SR-002 untagged - Per-track Bayesian accumulation in log-odds, with correlated-observat…
AR-026 In Progress T1, T4 SR-001 untagged - All similarity computed as GEMM, including annex and deferred pass
AR-027 Planned T4 SR-001 untagged - Throughput acceptable for arbitrary gallery size
DP-001 Done T1, manual PR-004 untagged - One analysis core; modes are front-ends and must not fork pipeline lo…
DP-002 Done T1, manual PR-004 untagged - Batch CLI over one title
DP-003 Planned T1, manual PR-004 untagged - On-demand resident service with bounded, observable queue
DP-004 Planned T1, manual PR-004 untagged - Opportunistic/idle mode: external trigger, hard stop, implicit re-que…
DP-005 Planned T1, manual PR-004 untagged - Native installer, no Docker; Fedora + Arch
DP-006 Planned T1, manual PR-003 untagged - Background incremental gallery refresh on a timer
IR-001 Done T1 SR-003 untagged - Emit the JRay truth format as sibling .jray.json
IR-002 Planned T1 SR-003 untagged - Windows carry belief + route; extraction.* carries extinction_sec
IR-003 Planned T1 SR-003 untagged - Output written after the deferred pass, not at EOF
IR-004 Planned T1 SR-003 untagged - Compute the audio signature exactly per server spec §3
IR-005 Planned T1 SR-003 untagged - Golden-vector fixture shared with the plugin repo to prove bit-exactn…
IR-006 Done unset SR-001 untagged - Jellyfin round-trip: pull pending queue, push complete results only
IR-007 Planned unset SR-003 untagged - Media < 120 s: emit no signature, apply no sync offset — identical ru…
IR-008 Planned unset SR-003 untagged - Emit and honour the signature's own v1: version prefix
GR-001 Done T1, T3 SR-001, SR-005 untagged - Build gallery from Jellyfin library cast, TMDB profile fallback
GR-002 Done T1, T3 PR-003 untagged - Incremental --merge refresh without re-embedding known actors
GR-003 Planned T1, T3 SR-001 untagged - Report coverage: zero-image actors, under-referenced actors, dedup, c…
GR-004 Planned T1, T3 SR-001 untagged - Stamp embedder identity into the gallery; hard startup error on m…
GR-005 Done T1, T3 SR-005 untagged - Gallery data never leaves the instance
GR-006 Planned T1 SR-005 untagged - Provenance tiers: baked / harvested / confirmed, distinguishable per …
GR-007 Planned T1 SR-005 untagged - Persist harvested embeddings flagged and reviewable, never silent…
GR-008 Planned T1 SR-005 untagged - Flag distributional outliers among an actor's references (poisoning g…
GR-009 TBD unset §4 untagged - Human-confirmed associations persist and improve future extractions
VR-001 Done out-of-ci PR-002 untagged - HDF5 post-inference dump at the embedded-frame boundary
VR-002 Done out-of-ci PR-002 untagged - Replay drives the real KPN nodes, not a reimplementation
VR-003 Done out-of-ci PR-002 untagged - Scoring: micro-F1 against X-Ray, precision/recall logged at every eva…
VR-004 Done out-of-ci PR-002 untagged - Reproducible validation corpus with ground truth
VR-005 Planned out-of-ci PR-002 untagged - Minimum face size study — TPI/FPI vs probe size, gallery held at nati…
VR-006 Planned out-of-ci PR-002 untagged - Re-tune scene_threshold once native-rate decode lands
VR-007 Planned out-of-ci PR-002 untagged - Expansion band, clustering threshold, and deferred-pass ablation
VR-008 Planned out-of-ci PR-002 untagged - Gallery scaling benchmark — throughput vs gallery size
VR-009 Planned T1, out-of-ci PR-002 untagged - Verify accumulated posteriors are calibrated against held-out tracks

Detailed mapping

No TRACES tags found yet. Tags are added as code is written; an empty matrix on a new tree is the correct reading, not a failure.