diff options
Diffstat (limited to 'docs/detection-findings.md')
| -rw-r--r-- | docs/detection-findings.md | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/docs/detection-findings.md b/docs/detection-findings.md index c821062..6f48b72 100644 --- a/docs/detection-findings.md +++ b/docs/detection-findings.md @@ -751,3 +751,51 @@ all but one are corroborated by the length gap to within a minute. The exception Sleepy History also serves files consistently **shorter** than declared -- 50:59 declared against 49:23 served, about 1:36 short on every episode -- so `Accounting` reports a zero gap for it. A feed can be wrong in that direction too, and when it is there is no external check available. + +## Bridging fragmented pods, and the regression it nearly caused + +Implemented 2026-10-08 with `AdConfig.MergeGapMs = 10s`. + +The guard it nearly broke is worth recording. `MaxBreakMs` refused any break longer than four +minutes, applied *after* merging. Bridging makes breaks longer, so five episodes would have +crossed the cap and published nothing -- including Radiolab's Grass Apes, the episode the whole +chain was device-verified on, whose 3:55 pre-roll and 0:18 tag sit two seconds apart and fuse to +4:15. + +The cap now applies to the matches rather than to what bridging makes of them. One enormous match +is evidence of shared programme; a chain of ordinary matches a beat apart is evidence of an ad +pod. `MaxSkipFraction` remains the guard on the episode as a whole. + +## Theme-music cues around ad breaks: real, detectable, already detected + +Peter named Tangle, Jon Stewart and Search Engine as shows that play a short piece of theme music +at every ad break. All three do, and the scan already finds it -- it is the short, +high-partner-count block that the disproven partner-count filter would have thrown away. + +Search Engine is the clearest: `13:08-13:16`, `35:28-35:36`, `44:51-44:59`, all 8.0s, found in +5-13 other episodes. Jon Stewart's is ~5s at four mid-episode positions per episode. Templating +Search Engine's cue at 250Hz and scanning whole episodes with `NormalizedCrossCorrelation` finds +it at r = 0.96, 0.92, 0.85 in episodes it was not taken from. + +**It marks the entry to a break, not both boundaries.** Scanning for the cue down to r = 0.6 +returns one isolated hit per slot, never a pair, in ad-laden and ad-free copies alike. So the cue +locates a break but says nothing about its extent, which is what a skip needs. + +### Two things found while probing this + +**A second fetch of the same episode is not an ad-free reference.** Three consecutive fetches of +one Search Engine enclosure were byte-identical to each other and 82KB different from the copy +mirrored days earlier. The ad load is stable within a session and rotates over days, so the +"align two fetches and read off the insertions" approach yields nothing when done promptly and +yields stale offsets when done late. + +**Shows have an ad window.** Search Engine's three newest mirrored episodes carry 503s, 469s and +202s of insertion; the five older ones carry exactly zero -- served length equal to declared. +The CDN stops inserting after some weeks. + +That generalises, and it is the more useful finding: **138 of 322 mirrored episodes have served +== declared and therefore contain no inserted advertising at all**, and the scan publishes "ad +breaks" on 111 of them, 74 minutes in total. Those are not advertisements. They are the show's +own recurring furniture -- intro, break cue, outro -- which is worth skipping but is a different +thing, and reporting it as inserted advertising is wrong. Every mirrored episode has a usable +declared duration, so this classification is always available. |
