docs: the matcher implements a superseded version of §3

JRay-public-server UR-009 changed the §3 score to count a frame as
agreeing within ±1 frame, on scene-actor-extraction VR-014's measurement:
over 40 correctly recovered offsets on real film audio the exact-frame
rule scored 27 of them below 0.85 and demoted them to `loose`, because
the two windows are cut on their own file's frame grid and those grids
do not coincide.

`AudioSignatureMatcher` still implements the exact rule. Nothing is
misaligned by the divergence — the recovered offset is unaffected, and
JR-047 makes the local answer supersede the server's — but the plugin
will show a caveat for a match that is not in doubt. Recorded against
JR-044 rather than fixed here, so the gap is findable.

TRACES: JR-044 | SR-003
This commit is contained in:
2026-07-31 22:43:37 +02:00
parent 1e247c4c7d
commit 8c5fb5950d
+16
View File
@@ -240,6 +240,22 @@ end-to-end mechanism.
| JR-045 | Emit and honour the signature's own `v1:` prefix, so a DSP change is detectable rather than silently non-matching | SR-003 | Low | **Done** (UT-047…049) — `AudioSignatureMatcher.TryParseFrames` refuses any prefix but `v1:`, and refuses malformed or structurally invalid payloads, so a future producer's `v2:` drops the item to the runtime tier instead of scoring as if it were understood | | JR-045 | Emit and honour the signature's own `v1:` prefix, so a DSP change is detectable rather than silently non-matching | SR-003 | Low | **Done** (UT-047…049) — `AudioSignatureMatcher.TryParseFrames` refuses any prefix but `v1:`, and refuses malformed or structurally invalid payloads, so a future producer's `v2:` drops the item to the runtime tier instead of scoring as if it were understood |
| JR-047 | **A fetched manifest is aligned against the local file before its windows are stored**, and the alignment is recorded beside the truth data | SR-003 | High | **Done** (UT-053…057) — `ManifestAligner` runs on the fetch path. A local alignment supersedes the server's offset, since the server has never seen this file; every unavailable path degrades to the server's offset rather than refusing, and a genuine signature disagreement is recorded and surfaced as a caveat without failing the fetch | | JR-047 | **A fetched manifest is aligned against the local file before its windows are stored**, and the alignment is recorded beside the truth data | SR-003 | High | **Done** (UT-053…057) — `ManifestAligner` runs on the fetch path. A local alignment supersedes the server's offset, since the server has never seen this file; every unavailable path degrades to the server's offset rather than refusing, and a genuine signature disagreement is recorded and surfaced as a caveat without failing the fetch |
> **Outstanding: §3's score gained ±1 frame of tolerance and this matcher has
> not.** `AudioSignatureMatcher` implements the exact-frame rule §3 carried
> until `JRay-public-server` UR-009 landed. The change was
> `scene-actor-extraction` VR-014's measurement: over 40 correctly recovered
> offsets on real film audio the exact rule scored 27 of them below 0.85 and
> demoted them to `loose`, because the two windows are cut on their own file's
> frame grid and those grids do not coincide. With ±1 frame all 40 reach
> `audio` and the strongest false match is unmoved at 0.16.
>
> **Nothing is misaligned by the divergence** — the offset the matcher recovers
> is unaffected, and JR-047 makes the local answer supersede the server's — but
> the plugin will label as `loose` alignments the server calls `audio`, which is
> a caveat shown to a user for a match that is not in doubt. JR-044's matcher
> and [`audio-alignment.md`](audio-alignment.md)'s scoring table both need the
> revised rule. Until then this repo implements a superseded version of §3.
## Human-in-the-loop association (JR-046) ## Human-in-the-loop association (JR-046)
| ID | Requirement | Traces to | Priority | Status | | ID | Requirement | Traces to | Priority | Status |