From 62396fce758e540f7a9a060cd5255c63f28b8670 Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Thu, 30 Jul 2026 21:16:15 +0200 Subject: [PATCH] docs: record why exclude_dirs stays unset, refresh matrix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tool's defaults already exclude `vendor`, which covers the submodule at scripts/vendor/jray-project. Setting the key explicitly is a trap worth documenting: it REPLACES the defaults rather than extending them, and matching is on path components rather than prefixes — so ["scripts/vendor"] matches nothing while silently dropping __pycache__, node_modules, build and the rest. Verified: the submodule's source is not scanned, and the only vendored path in the report is the system spec it reads for PR/SR orphan checking. Coverage after the merges: 5/63, 0 orphans. Every tag names a real requirement, and nothing claims a requirement that is still Planned. Co-Authored-By: Claude Opus 5 --- docs/traceability.md | 244 ++++++++++++++++++++++++++++++++++++++++--- traceability.toml | 10 ++ 2 files changed, 240 insertions(+), 14 deletions(-) diff --git a/docs/traceability.md b/docs/traceability.md index 55ec79b..b2bdada 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -3,7 +3,7 @@ -**Generated:** 2026-07-30T16:58:28+00:00 +**Generated:** 2026-07-30T19:15:45+00:00 Denominators are read from [`requirements.md`](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`). @@ -11,13 +11,13 @@ Denominators are read from [`requirements.md`](requirements.md) at run time, nev | Metric | Value | |---|---| -| Source files scanned | 84 | -| TRACES tags found | 0 | +| Source files scanned | 92 | +| TRACES tags found | 64 | | EXCEPTION tags found | 0 | | Requirements defined | 63 | -| Requirements covered | 0 | -| **Coverage** | **0.0%** (0/63) | -| Coverage of CI-executable scope | 0.0% (0/52) | +| Requirements covered | 5 | +| **Coverage** | **7.9%** (5/63) | +| Coverage of CI-executable scope | 9.6% (5/52) | | Tagged but unexecuted in CI | 0 | | Orphan tags | 0 | @@ -27,10 +27,12 @@ Denominators are read from [`requirements.md`](requirements.md) at run time, nev |---|---|---|---| | AR | 0 | 0 | 27 | | DP | 0 | 0 | 8 | -| IR | 0 | 0 | 8 | -| GR | 0 | 0 | 9 | +| IR | 4 | 0 | 8 | +| GR | 1 | 0 | 9 | | VR | 0 | 0 | 11 | +- **UT** tags present (separate taxonomy, not counted in coverage): UT-101, UT-102, UT-103, UT-104 +- **SR** tags present (separate taxonomy, not counted in coverage): SR-001, SR-003 ## Not executable in CI @@ -110,15 +112,15 @@ _None._ | 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 | **Done** — `src/aud… | T1 | SR-003 | untagged | - | Compute the audio signature exactly per server spec §3 | -| IR-005 | **Done** — `tests/f… | T1 | SR-003 | untagged | - | Golden-vector fixture shared with the plugin repo to prove bit-exactn… | +| IR-004 | **Done** — `src/aud… | T1 | SR-003 | covered | `src/audio_signature.cpp`, `src/audio_signature.hpp`, `tests/test_audio_signature.cpp` | Compute the audio signature exactly per server spec §3 | +| IR-005 | **Done** — `tests/f… | T1 | SR-003 | covered | `src/audio_signature.cpp`, `src/audio_signature.hpp`, `tests/test_audio_signature.cpp` | Golden-vector fixture shared with the plugin repo to prove bit-exactn… | | IR-006 | Done | T1, manual | SR-001 | untagged | - | Jellyfin round-trip: pull pending queue, push complete results only | -| IR-007 | **Done** | T1 | SR-003 | untagged | - | Media < 120 s: emit no signature, apply no sync offset — identical ru… | -| IR-008 | **Done** | T1 | SR-003 | untagged | - | Emit and honour the signature's own `v1:` version prefix | +| IR-007 | **Done** | T1 | SR-003 | covered | `src/audio_signature.cpp`, `src/audio_signature.hpp`, `tests/test_audio_signature.cpp` | Media < 120 s: emit no signature, apply no sync offset — identical ru… | +| IR-008 | **Done** | T1 | SR-003 | covered | `src/audio_signature.cpp`, `src/audio_signature.hpp`, `tests/test_audio_signature.cpp` | 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 | **Done** — basename… | T1, T3 | SR-001 | untagged | - | Stamp embedder identity into the gallery; **hard startup error** on m… | +| GR-004 | **Done** — basename… | T1, T3 | SR-001 | covered | `scripts/filter_gallery.py`, `scripts/make_gallery.py`, `scripts/make_jellyfin_gallery.py`, `scripts/movienet_eval.py`, `scripts/optimizer/fetch_missing_actors.py`, `scripts/optimizer/optimize.py`, `scripts/optimizer/reembed_gallery.py`, `scripts/optimizer/replay.py`, `scripts/sae_embed_loader.py`, `scripts/sae_gallery.py`, `scripts/sae_stamp.py`, `scripts/stamp_gallery.py`, `src/config.hpp`, `src/gallery/embedder_stamp.cpp`, `src/gallery/embedder_stamp.hpp`, `src/gallery/gallery_builder.cpp`, `src/gallery/gallery_store.cpp`, `src/kpn_bindings.cpp`, `src/main.cpp`, `src/nodes/embedding_dump_node.hpp`, `src/scene_preview.cpp`, `src/types.hpp`, `tests/test_gallery_store.cpp` | 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… | @@ -138,5 +140,219 @@ _None._ ## 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._ +### GR-004 + +**Locations:** 44 + +- [`src/config.hpp:43`](../src/config.hpp#L43) — `Unknown` +- [`src/gallery/embedder_stamp.cpp:1`](../src/gallery/embedder_stamp.cpp#L1) — `Unknown` +- [`src/gallery/embedder_stamp.hpp:2`](../src/gallery/embedder_stamp.hpp#L2) — `Unknown` +- [`src/gallery/gallery_builder.cpp:45`](../src/gallery/gallery_builder.cpp#L45) — `ActorGallery build_gallery(const BuildConfig& cfg)` +- [`src/gallery/gallery_store.cpp:82`](../src/gallery/gallery_store.cpp#L82) — `H5::StrType str(H5::PredType::C_S1, H5T_VARIABLE);` +- [`src/gallery/gallery_store.cpp:167`](../src/gallery/gallery_store.cpp#L167) — `H5::DataSpace scalar(H5S_SCALAR);` +- [`src/gallery/gallery_store.cpp:219`](../src/gallery/gallery_store.cpp#L219) — `Unknown` +- [`src/kpn_bindings.cpp:167`](../src/kpn_bindings.cpp#L167) — `Unknown` +- [`src/kpn_bindings.cpp:217`](../src/kpn_bindings.cpp#L217) — `Unknown` +- [`src/main.cpp:172`](../src/main.cpp#L172) — `Unknown` +- [`src/nodes/embedding_dump_node.hpp:29`](../src/nodes/embedding_dump_node.hpp#L29) — `static constexpr std::string_view label() { return "embedding_dump"; }` +- [`src/nodes/embedding_dump_node.hpp:101`](../src/nodes/embedding_dump_node.hpp#L101) — `H5::StrType str(H5::PredType::C_S1, H5T_VARIABLE);` +- [`src/scene_preview.cpp:133`](../src/scene_preview.cpp#L133) — `int main(int argc, char** argv)` +- [`src/types.hpp:141`](../src/types.hpp#L141) — `struct Actor` +- [`tests/test_gallery_store.cpp:182`](../tests/test_gallery_store.cpp#L182) — `TempFile tf("gallery_stamped.h5");` +- [`tests/test_gallery_store.cpp:201`](../tests/test_gallery_store.cpp#L201) — `TempFile tf("gallery_stamped.h5");` +- [`tests/test_gallery_store.cpp:219`](../tests/test_gallery_store.cpp#L219) — `TempFile tf("gallery_unstamped.h5");` +- [`tests/test_gallery_store.cpp:240`](../tests/test_gallery_store.cpp#L240) — `TempFile tf("gallery_json_stamp.json");` +- [`tests/test_gallery_store.cpp:252`](../tests/test_gallery_store.cpp#L252) — `Unknown` +- [`tests/test_gallery_store.cpp:268`](../tests/test_gallery_store.cpp#L268) — `Unknown` +- [`tests/test_gallery_store.cpp:300`](../tests/test_gallery_store.cpp#L300) — `Unknown` +- [`tests/test_gallery_store.cpp:309`](../tests/test_gallery_store.cpp#L309) — `Unknown` +- [`tests/test_gallery_store.cpp:333`](../tests/test_gallery_store.cpp#L333) — `Unknown` +- [`tests/test_gallery_store.cpp:348`](../tests/test_gallery_store.cpp#L348) — `Unknown` +- [`tests/test_gallery_store.cpp:367`](../tests/test_gallery_store.cpp#L367) — `Unknown` +- [`tests/test_gallery_store.cpp:384`](../tests/test_gallery_store.cpp#L384) — `TempFile tf("fake_model.onnx");` +- [`scripts/filter_gallery.py:80`](../scripts/filter_gallery.py#L80) — `if actor_jellyfin_id(a) in cast_ids]` +- [`scripts/make_gallery.py:181`](../scripts/make_gallery.py#L181) — `Unknown` +- [`scripts/make_jellyfin_gallery.py:446`](../scripts/make_jellyfin_gallery.py#L446) — `Unknown` +- [`scripts/make_jellyfin_gallery.py:454`](../scripts/make_jellyfin_gallery.py#L454) — `Unknown` +- [`scripts/movienet_eval.py:65`](../scripts/movienet_eval.py#L65) — `with open(args.gt) as f:` +- [`scripts/optimizer/fetch_missing_actors.py:62`](../scripts/optimizer/fetch_missing_actors.py#L62) — `def fetch(missing_path, out_path, token, build_dir, models_dir, arcface,` +- [`scripts/optimizer/fetch_missing_actors.py:109`](../scripts/optimizer/fetch_missing_actors.py#L109) — `def merge(base_path, add_path, out_path):` +- [`scripts/optimizer/fetch_missing_actors.py:123`](../scripts/optimizer/fetch_missing_actors.py#L123) — `def merge(base_path, add_path, out_path):` +- [`scripts/optimizer/optimize.py:186`](../scripts/optimizer/optimize.py#L186) — `Unknown` +- [`scripts/optimizer/optimize.py:202`](../scripts/optimizer/optimize.py#L202) — `if not Path(f["dump"]).exists():` +- [`scripts/optimizer/reembed_gallery.py:62`](../scripts/optimizer/reembed_gallery.py#L62) — `for i, a in enumerate(ref["actors"], 1):` +- [`scripts/optimizer/replay.py:111`](../scripts/optimizer/replay.py#L111) — `Unknown` +- [`scripts/optimizer/replay.py:250`](../scripts/optimizer/replay.py#L250) — `Unknown` +- [`scripts/sae_embed_loader.py:22`](../scripts/sae_embed_loader.py#L22) — `return arcface if arcface else str(Path(models_dir) / DEFAULT_ARCFACE)` +- [`scripts/sae_gallery.py:171`](../scripts/sae_gallery.py#L171) — `if not _stamp_empty(embedder):` +- [`scripts/sae_gallery.py:199`](../scripts/sae_gallery.py#L199) — `for a in range(len(offset)):` +- [`scripts/sae_stamp.py:3`](../scripts/sae_stamp.py#L3) — `Unknown` +- [`scripts/stamp_gallery.py:4`](../scripts/stamp_gallery.py#L4) — `Unknown` + +### IR-004 + +**Locations:** 16 + +- [`src/audio_signature.cpp:3`](../src/audio_signature.cpp#L3) — `Unknown` +- [`src/audio_signature.cpp:265`](../src/audio_signature.cpp#L265) — `std::vector pack_frames(const std::vector& mono)` +- [`src/audio_signature.cpp:320`](../src/audio_signature.cpp#L320) — `std::optional signature_from_mono(const std::vector& mono)` +- [`src/audio_signature.cpp:327`](../src/audio_signature.cpp#L327) — `std::optional> decode_centre_window(const std::string& path)` +- [`src/audio_signature.cpp:421`](../src/audio_signature.cpp#L421) — `std::optional compute_signature(const std::string& path)` +- [`src/audio_signature.hpp:4`](../src/audio_signature.hpp#L4) — `Unknown` +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:129`](../tests/test_audio_signature.cpp#L129) — `Unknown` +- [`tests/test_audio_signature.cpp:151`](../tests/test_audio_signature.cpp#L151) — `Unknown` +- [`tests/test_audio_signature.cpp:167`](../tests/test_audio_signature.cpp#L167) — `Unknown` +- [`tests/test_audio_signature.cpp:236`](../tests/test_audio_signature.cpp#L236) — `Unknown` +- [`tests/test_audio_signature.cpp:263`](../tests/test_audio_signature.cpp#L263) — `TempWav w("centred300");` +- [`tests/test_audio_signature.cpp:301`](../tests/test_audio_signature.cpp#L301) — `Unknown` +- [`tests/test_audio_signature.cpp:314`](../tests/test_audio_signature.cpp#L314) — `kNumBands * std::log10(1000.0 / kBandLoHz) / std::log10(kBandHiHz / kBandLoHz)));` +- [`tests/test_audio_signature.cpp:328`](../tests/test_audio_signature.cpp#L328) — `std::vector a(kWindowSamples / 50);` +- [`tests/test_audio_signature.cpp:344`](../tests/test_audio_signature.cpp#L344) — `return base64_encode(reinterpret_cast(s.data()), s.size());` + +### IR-005 + +**Locations:** 5 + +- [`src/audio_signature.cpp:421`](../src/audio_signature.cpp#L421) — `std::optional compute_signature(const std::string& path)` +- [`src/audio_signature.hpp:4`](../src/audio_signature.hpp#L4) — `Unknown` +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:129`](../tests/test_audio_signature.cpp#L129) — `Unknown` +- [`tests/test_audio_signature.cpp:138`](../tests/test_audio_signature.cpp#L138) — `Unknown` + +### IR-007 + +**Locations:** 8 + +- [`src/audio_signature.cpp:3`](../src/audio_signature.cpp#L3) — `Unknown` +- [`src/audio_signature.cpp:327`](../src/audio_signature.cpp#L327) — `std::optional> decode_centre_window(const std::string& path)` +- [`src/audio_signature.cpp:421`](../src/audio_signature.cpp#L421) — `std::optional compute_signature(const std::string& path)` +- [`src/audio_signature.hpp:4`](../src/audio_signature.hpp#L4) — `Unknown` +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:201`](../tests/test_audio_signature.cpp#L201) — `TempWav w("short30");` +- [`tests/test_audio_signature.cpp:219`](../tests/test_audio_signature.cpp#L219) — `TempWav w("exact120");` +- [`tests/test_audio_signature.cpp:229`](../tests/test_audio_signature.cpp#L229) — `TempWav w("exact120");` + +### IR-008 + +**Locations:** 7 + +- [`src/audio_signature.cpp:3`](../src/audio_signature.cpp#L3) — `Unknown` +- [`src/audio_signature.cpp:320`](../src/audio_signature.cpp#L320) — `std::optional signature_from_mono(const std::vector& mono)` +- [`src/audio_signature.cpp:421`](../src/audio_signature.cpp#L421) — `std::optional compute_signature(const std::string& path)` +- [`src/audio_signature.hpp:4`](../src/audio_signature.hpp#L4) — `Unknown` +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:129`](../tests/test_audio_signature.cpp#L129) — `Unknown` +- [`tests/test_audio_signature.cpp:167`](../tests/test_audio_signature.cpp#L167) — `Unknown` + +### SR-001 + +**Locations:** 44 + +- [`src/config.hpp:43`](../src/config.hpp#L43) — `Unknown` +- [`src/gallery/embedder_stamp.cpp:1`](../src/gallery/embedder_stamp.cpp#L1) — `Unknown` +- [`src/gallery/embedder_stamp.hpp:2`](../src/gallery/embedder_stamp.hpp#L2) — `Unknown` +- [`src/gallery/gallery_builder.cpp:45`](../src/gallery/gallery_builder.cpp#L45) — `ActorGallery build_gallery(const BuildConfig& cfg)` +- [`src/gallery/gallery_store.cpp:82`](../src/gallery/gallery_store.cpp#L82) — `H5::StrType str(H5::PredType::C_S1, H5T_VARIABLE);` +- [`src/gallery/gallery_store.cpp:167`](../src/gallery/gallery_store.cpp#L167) — `H5::DataSpace scalar(H5S_SCALAR);` +- [`src/gallery/gallery_store.cpp:219`](../src/gallery/gallery_store.cpp#L219) — `Unknown` +- [`src/kpn_bindings.cpp:167`](../src/kpn_bindings.cpp#L167) — `Unknown` +- [`src/kpn_bindings.cpp:217`](../src/kpn_bindings.cpp#L217) — `Unknown` +- [`src/main.cpp:172`](../src/main.cpp#L172) — `Unknown` +- [`src/nodes/embedding_dump_node.hpp:29`](../src/nodes/embedding_dump_node.hpp#L29) — `static constexpr std::string_view label() { return "embedding_dump"; }` +- [`src/nodes/embedding_dump_node.hpp:101`](../src/nodes/embedding_dump_node.hpp#L101) — `H5::StrType str(H5::PredType::C_S1, H5T_VARIABLE);` +- [`src/scene_preview.cpp:133`](../src/scene_preview.cpp#L133) — `int main(int argc, char** argv)` +- [`src/types.hpp:141`](../src/types.hpp#L141) — `struct Actor` +- [`tests/test_gallery_store.cpp:182`](../tests/test_gallery_store.cpp#L182) — `TempFile tf("gallery_stamped.h5");` +- [`tests/test_gallery_store.cpp:201`](../tests/test_gallery_store.cpp#L201) — `TempFile tf("gallery_stamped.h5");` +- [`tests/test_gallery_store.cpp:219`](../tests/test_gallery_store.cpp#L219) — `TempFile tf("gallery_unstamped.h5");` +- [`tests/test_gallery_store.cpp:240`](../tests/test_gallery_store.cpp#L240) — `TempFile tf("gallery_json_stamp.json");` +- [`tests/test_gallery_store.cpp:252`](../tests/test_gallery_store.cpp#L252) — `Unknown` +- [`tests/test_gallery_store.cpp:268`](../tests/test_gallery_store.cpp#L268) — `Unknown` +- [`tests/test_gallery_store.cpp:300`](../tests/test_gallery_store.cpp#L300) — `Unknown` +- [`tests/test_gallery_store.cpp:309`](../tests/test_gallery_store.cpp#L309) — `Unknown` +- [`tests/test_gallery_store.cpp:333`](../tests/test_gallery_store.cpp#L333) — `Unknown` +- [`tests/test_gallery_store.cpp:348`](../tests/test_gallery_store.cpp#L348) — `Unknown` +- [`tests/test_gallery_store.cpp:367`](../tests/test_gallery_store.cpp#L367) — `Unknown` +- [`tests/test_gallery_store.cpp:384`](../tests/test_gallery_store.cpp#L384) — `TempFile tf("fake_model.onnx");` +- [`scripts/filter_gallery.py:80`](../scripts/filter_gallery.py#L80) — `if actor_jellyfin_id(a) in cast_ids]` +- [`scripts/make_gallery.py:181`](../scripts/make_gallery.py#L181) — `Unknown` +- [`scripts/make_jellyfin_gallery.py:446`](../scripts/make_jellyfin_gallery.py#L446) — `Unknown` +- [`scripts/make_jellyfin_gallery.py:454`](../scripts/make_jellyfin_gallery.py#L454) — `Unknown` +- [`scripts/movienet_eval.py:65`](../scripts/movienet_eval.py#L65) — `with open(args.gt) as f:` +- [`scripts/optimizer/fetch_missing_actors.py:62`](../scripts/optimizer/fetch_missing_actors.py#L62) — `def fetch(missing_path, out_path, token, build_dir, models_dir, arcface,` +- [`scripts/optimizer/fetch_missing_actors.py:109`](../scripts/optimizer/fetch_missing_actors.py#L109) — `def merge(base_path, add_path, out_path):` +- [`scripts/optimizer/fetch_missing_actors.py:123`](../scripts/optimizer/fetch_missing_actors.py#L123) — `def merge(base_path, add_path, out_path):` +- [`scripts/optimizer/optimize.py:186`](../scripts/optimizer/optimize.py#L186) — `Unknown` +- [`scripts/optimizer/optimize.py:202`](../scripts/optimizer/optimize.py#L202) — `if not Path(f["dump"]).exists():` +- [`scripts/optimizer/reembed_gallery.py:62`](../scripts/optimizer/reembed_gallery.py#L62) — `for i, a in enumerate(ref["actors"], 1):` +- [`scripts/optimizer/replay.py:111`](../scripts/optimizer/replay.py#L111) — `Unknown` +- [`scripts/optimizer/replay.py:250`](../scripts/optimizer/replay.py#L250) — `Unknown` +- [`scripts/sae_embed_loader.py:22`](../scripts/sae_embed_loader.py#L22) — `return arcface if arcface else str(Path(models_dir) / DEFAULT_ARCFACE)` +- [`scripts/sae_gallery.py:171`](../scripts/sae_gallery.py#L171) — `if not _stamp_empty(embedder):` +- [`scripts/sae_gallery.py:199`](../scripts/sae_gallery.py#L199) — `for a in range(len(offset)):` +- [`scripts/sae_stamp.py:3`](../scripts/sae_stamp.py#L3) — `Unknown` +- [`scripts/stamp_gallery.py:4`](../scripts/stamp_gallery.py#L4) — `Unknown` + +### SR-003 + +**Locations:** 2 + +- [`src/audio_signature.cpp:3`](../src/audio_signature.cpp#L3) — `Unknown` +- [`src/audio_signature.hpp:4`](../src/audio_signature.hpp#L4) — `Unknown` + +### UT-101 + +**Locations:** 5 + +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:129`](../tests/test_audio_signature.cpp#L129) — `Unknown` +- [`tests/test_audio_signature.cpp:138`](../tests/test_audio_signature.cpp#L138) — `Unknown` +- [`tests/test_audio_signature.cpp:151`](../tests/test_audio_signature.cpp#L151) — `Unknown` +- [`tests/test_audio_signature.cpp:167`](../tests/test_audio_signature.cpp#L167) — `Unknown` + +### UT-102 + +**Locations:** 5 + +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:201`](../tests/test_audio_signature.cpp#L201) — `TempWav w("short30");` +- [`tests/test_audio_signature.cpp:219`](../tests/test_audio_signature.cpp#L219) — `TempWav w("exact120");` +- [`tests/test_audio_signature.cpp:229`](../tests/test_audio_signature.cpp#L229) — `TempWav w("exact120");` +- [`tests/test_audio_signature.cpp:236`](../tests/test_audio_signature.cpp#L236) — `Unknown` + +### UT-103 + +**Locations:** 2 + +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:263`](../tests/test_audio_signature.cpp#L263) — `TempWav w("centred300");` + +### UT-104 + +**Locations:** 5 + +- [`tests/test_audio_signature.cpp:3`](../tests/test_audio_signature.cpp#L3) — `Unknown` +- [`tests/test_audio_signature.cpp:301`](../tests/test_audio_signature.cpp#L301) — `Unknown` +- [`tests/test_audio_signature.cpp:314`](../tests/test_audio_signature.cpp#L314) — `kNumBands * std::log10(1000.0 / kBandLoHz) / std::log10(kBandHiHz / kBandLoHz)));` +- [`tests/test_audio_signature.cpp:328`](../tests/test_audio_signature.cpp#L328) — `std::vector a(kWindowSamples / 50);` +- [`tests/test_audio_signature.cpp:344`](../tests/test_audio_signature.cpp#L344) — `return base64_encode(reinterpret_cast(s.data()), s.size());` + +## Tag diagnostics + +**Malformed tags:** + +- `scripts/filter_gallery.py:80` — {'ignored': ['— a filtered gallery holds the SAME vectors as its']} +- `scripts/make_gallery.py:181` — {'ignored': ['— stamp with the model actually loaded', 'resolved']} +- `scripts/make_jellyfin_gallery.py:454` — {'ignored': ["— --merge keeps the existing actors' vectors and"]} +- `scripts/movienet_eval.py:65` — {'ignored': ['— match() below is a bare dot product against the']} +- `scripts/optimizer/fetch_missing_actors.py:109` — {'ignored': ['— the legacy JSON gallery carries the same stamp as']} +- `scripts/optimizer/fetch_missing_actors.py:123` — {'ignored': ['— merging two galleries from different models makes']} +- `scripts/optimizer/optimize.py:202` — {'ignored': ['— every (dump', 'gallery) pair is checked ONCE here']} +- `scripts/optimizer/reembed_gallery.py:62` — {'ignored': ['— this script exists to produce a gallery in a']} +- `scripts/optimizer/replay.py:111` — {'ignored': ['— checked here', 'before any network is built', 'so a']} +- `scripts/optimizer/replay.py:250` — {'ignored': ['— promote an unprovable gallery/dump binding from a']} +- `scripts/sae_embed_loader.py:22` — {'ignored': ['— single source of truth for "which model is this"']} +- `scripts/sae_gallery.py:171` — {'ignored': ['— omitted entirely when unknown', 'so "unstamped"']} +- `scripts/sae_gallery.py:199` — {'ignored': ['— carried through so a derived gallery (filter']} diff --git a/traceability.toml b/traceability.toml index e27448f..531ab22 100644 --- a/traceability.toml +++ b/traceability.toml @@ -17,6 +17,16 @@ languages = ["cpp", "python"] source_roots = ["src", "tests", "scripts", "experiments", "eval"] +# exclude_dirs is deliberately NOT set. The tool's defaults already exclude +# `vendor` (among __pycache__, external, build, node_modules and friends), which +# covers the submodule at scripts/vendor/jray-project — that is not this repo's +# code, and its parser tests carry literal TRACES: strings that would otherwise +# be credited here as coverage. +# +# Note the key REPLACES the defaults rather than adding to them, and matching is +# on path components, not prefixes: setting it to ["scripts/vendor"] both fails +# to match anything and silently drops every default exclusion. + # CI is an Intel N100 with no discrete GPU. T4 is deliberately absent: a # requirement verifiable only on GPU hardware is reported as tagged but # unexecuted and never counted as covered, because counting a test that cannot