summaryrefslogtreecommitdiff
path: root/docs/detection-findings.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/detection-findings.md')
-rw-r--r--docs/detection-findings.md48
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.