diff --git a/CHANGELOG.md b/CHANGELOG.md index 6777a98c..33820d2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ ## Unreleased +## v68.3.0 (2026-05-21) + ### Detection Evasion -- **Ad spoofing default flipped on → off** — was previously on by default with a localStorage opt-out (`twitchAdSolutions_disableAdSpoofing='true'` to disable); now off by default with a localStorage opt-IN (`twitchAdSolutions_disableAdSpoofing='false'` to re-enable). Rationale: convergent signals that the spoof's always-100%-watched + audible + visible beacon pattern (fires before a human would plausibly have watched the ad) may itself fingerprint as anomalous in Twitch's anti-adblock heuristics — silent fingerprinting that vaft's `GQL response status` surveillance line (which only catches loud rejections) cannot detect. Field signal: an in-stream ad reaching the committed autoplay 360p backup on `warn` despite full vaft pod coverage and 100% Twitch acceptance of the spoof beacons (i.e., consistent with detection escalation rather than spoof rejection). Convergent with the TTV-AB maintainer's hypothesis. Mechanism retained intact: users who want to A/B test or explicitly opt in can set `twitchAdSolutions_disableAdSpoofing='false'`. vaft only (#NN) +- **Ad spoofing default flipped on → off** — was previously on by default with a localStorage opt-out (`twitchAdSolutions_disableAdSpoofing='true'` to disable); now off by default with a localStorage opt-IN (`twitchAdSolutions_disableAdSpoofing='false'` to re-enable). Rationale: convergent signals that the spoof's always-100%-watched + audible + visible beacon pattern (fires before a human would plausibly have watched the ad) may itself fingerprint as anomalous in Twitch's anti-adblock heuristics — silent fingerprinting that vaft's `GQL response status` surveillance line (which only catches loud rejections) cannot detect. Field signal: a Twitch ad overlay with countdown reached the user during an ad break on `warn` while spoofing was on, despite full vaft pod coverage and 100% Twitch acceptance of the spoof beacons — though the precise mechanism by which the spoof would drive overlay rendering is unverified (Twitch's player UI is driven by local m3u8 ad-cycle tracking, not GQL response — but a server-side coupling is plausible). Convergent with the TTV-AB maintainer's hypothesis. Mechanism retained intact: users who want to A/B test or explicitly opt in can set `twitchAdSolutions_disableAdSpoofing='false'`. vaft only (#NN) ## v68.2.0 (2026-05-21) diff --git a/CLAUDE.md b/CLAUDE.md index 1722a31f..79c916c3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -32,7 +32,7 @@ uBlock files have `twitch-videoad.js text/javascript` as line 1 (not valid JS ## Versions -Bump `@version` (userscript header) and `ourTwitchAdSolutionsVersion` together for functional changes. Current: vaft 68.2.0/83, video-swap-new 1.86/54, strip 1.9/26. Testing: vaft 651.0.0/651, video-swap-new -/619. +Bump `@version` (userscript header) and `ourTwitchAdSolutionsVersion` together for functional changes. Current: vaft 68.3.0/84, video-swap-new 1.86/54, strip 1.9/26. Testing: vaft 651.0.0/651, video-swap-new -/619. ## localStorage Config diff --git a/vaft/vaft-ublock-origin.js b/vaft/vaft-ublock-origin.js index 7a6e001b..aa3b0716 100644 --- a/vaft/vaft-ublock-origin.js +++ b/vaft/vaft-ublock-origin.js @@ -37,7 +37,7 @@ twitch-videoad.js text/javascript } } 'use strict'; - const ourTwitchAdSolutionsVersion = 83;// Used to prevent conflicts with outdated versions of the scripts + const ourTwitchAdSolutionsVersion = 84;// Used to prevent conflicts with outdated versions of the scripts console.log('[AD DEBUG] TwitchAdSolutions vaft v' + ourTwitchAdSolutionsVersion + ' loading'); if (typeof window.twitchAdSolutionsVersion !== 'undefined' && window.twitchAdSolutionsVersion >= ourTwitchAdSolutionsVersion) { console.log('[AD DEBUG] CONFLICT: vaft v' + ourTwitchAdSolutionsVersion + ' skipped — another script already active (v' + window.twitchAdSolutionsVersion + '). Remove duplicate scripts.'); diff --git a/vaft/vaft.user.js b/vaft/vaft.user.js index 88330bcf..8d564a37 100644 --- a/vaft/vaft.user.js +++ b/vaft/vaft.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name TwitchAdSolutions (vaft) // @namespace https://github.com/ryanbr/TwitchAdSolutions -// @version 68.2.0 +// @version 68.3.0 // @description Multiple solutions for blocking Twitch ads (vaft) // @updateURL https://github.com/ryanbr/TwitchAdSolutions/raw/master/vaft/vaft.user.js // @downloadURL https://github.com/ryanbr/TwitchAdSolutions/raw/master/vaft/vaft.user.js @@ -47,7 +47,7 @@ } } 'use strict'; - const ourTwitchAdSolutionsVersion = 83;// Used to prevent conflicts with outdated versions of the scripts + const ourTwitchAdSolutionsVersion = 84;// Used to prevent conflicts with outdated versions of the scripts console.log('[AD DEBUG] TwitchAdSolutions vaft v' + ourTwitchAdSolutionsVersion + ' loading'); if (typeof window.twitchAdSolutionsVersion !== 'undefined' && window.twitchAdSolutionsVersion >= ourTwitchAdSolutionsVersion) { console.log('[AD DEBUG] CONFLICT: vaft v' + ourTwitchAdSolutionsVersion + ' skipped — another script already active (v' + window.twitchAdSolutionsVersion + '). Remove duplicate scripts.');