summaryrefslogtreecommitdiff
path: root/docs/detection-findings.md
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-10-08 04:02:39 +0000
committerClaude <noreply@anthropic.com>2026-10-08 04:02:39 +0000
commit9e1dfe2989dfce61bb96007cf52faf519cd7b654 (patch)
treeada88eb28888922214ece1c6d59f5696d49386d7 /docs/detection-findings.md
parent9ba30c95c6bc9a6405ab21f616e933b09fa0358f (diff)
Bridge ad pods fragmented by brief lapses in agreement
A pod of several advertisements is found as several matches, because agreement lapses between them. Published unbridged, 45% of the gaps between consecutive breaks came in under ten seconds and 152 of 262 multi-break episodes contained one -- which plays as a skip, a one-to- nine-second burst of advertisement, then another skip. Bridging also moves agreement with the declared length gap from 69% to 73% median, because what was bridged was advertising too. MaxBreakMs now applies to the matches rather than to what bridging makes of them. Applied after bridging it refused five episodes that bridging had pushed over the four-minute cap, Radiolab's Grass Apes among them -- a 3:55 pre-roll and an 0:18 tag two seconds apart fuse to 4:15, and the episode the whole chain was device-verified on would have published nothing. One enormous match is evidence of shared programme; a chain of ordinary matches a beat apart is evidence of an ad pod. MaxSkipFraction still guards the episode as a whole. Also pins the ad scan's production values, which were measured rather than picked, and records what probing Peter's theme-music observation turned up: the cue is real and already detected, it marks a break's entry but not its extent, a second fetch is not an ad-free reference, and 138 of 322 mirrored episodes contain no inserted advertising at all while the scan reports breaks on 111 of them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
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.