@duckduckgo/autoconsent 16.48.0 → 16.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/.agents/skills/optimize-button-patterns/SKILL.md +145 -0
  2. package/.agents/skills/oxylabs-testing/SKILL.md +1 -1
  3. package/.claude/skills/optimize-button-patterns/SKILL.md +7 -0
  4. package/.github/workflows/release-labels.yml +2 -6
  5. package/AGENTS.md +2 -0
  6. package/CHANGELOG.md +77 -0
  7. package/data/Readme.md +6 -0
  8. package/data/labelled-button-texts.csv +7006 -0
  9. package/dist/addon-firefox/background.bundle.js +6 -1
  10. package/dist/addon-firefox/compact-rules.json +1 -1
  11. package/dist/addon-firefox/content.bundle.js +26 -13
  12. package/dist/addon-firefox/manifest.json +1 -1
  13. package/dist/addon-firefox/rule-index.json +1 -1
  14. package/dist/addon-firefox/rules.json +1 -1
  15. package/dist/addon-mv3/background.bundle.js +6 -1
  16. package/dist/addon-mv3/compact-rules.json +1 -1
  17. package/dist/addon-mv3/content.bundle.js +26 -13
  18. package/dist/addon-mv3/manifest.json +1 -1
  19. package/dist/addon-mv3/rule-index.json +1 -1
  20. package/dist/addon-mv3/rules.json +1 -1
  21. package/dist/autoconsent.cjs.js +26 -13
  22. package/dist/autoconsent.esm.js +26 -13
  23. package/dist/autoconsent.playwright.js +26 -13
  24. package/dist/autoconsent.standalone.js +27 -14
  25. package/dist/types/eval-snippets.d.ts +3 -0
  26. package/lib/eval-snippets.ts +7 -0
  27. package/lib/heuristic-patterns.ts +20 -11
  28. package/package.json +3 -1
  29. package/rules/autoconsent/amazon-hiring.json +16 -0
  30. package/rules/autoconsent/avada-cookie-consent.json +43 -0
  31. package/rules/autoconsent/axeptio.json +17 -4
  32. package/rules/autoconsent/bigcrunch.json +39 -0
  33. package/rules/autoconsent/borlabs.json +5 -0
  34. package/rules/autoconsent/bricklink.json +33 -0
  35. package/rules/autoconsent/ceneo.json +9 -0
  36. package/rules/autoconsent/conjointly.json +43 -0
  37. package/rules/autoconsent/consentmo.json +51 -7
  38. package/rules/autoconsent/cookie-popup-close-cookies.json +37 -0
  39. package/rules/autoconsent/cookieconsent2.json +6 -1
  40. package/rules/autoconsent/costco.json +27 -0
  41. package/rules/autoconsent/datasign.json +85 -0
  42. package/rules/autoconsent/dhbbank.json +13 -0
  43. package/rules/autoconsent/ee-consent-notice.json +40 -0
  44. package/rules/autoconsent/ensembleartsphilly.json +33 -0
  45. package/rules/autoconsent/evium.de.json +33 -0
  46. package/rules/autoconsent/fera-cookies.json +67 -0
  47. package/rules/autoconsent/iubenda.json +13 -7
  48. package/rules/autoconsent/la7-cmp.json +30 -0
  49. package/rules/autoconsent/laravel-cookie-consent.json +45 -0
  50. package/rules/autoconsent/legislation-gov-uk.json +43 -0
  51. package/rules/autoconsent/mackeeper.json +34 -0
  52. package/rules/autoconsent/ndl-go-jp.json +35 -0
  53. package/rules/autoconsent/pandectes.json +48 -15
  54. package/rules/autoconsent/passle.json +32 -0
  55. package/rules/autoconsent/paypal-us.json +3 -3
  56. package/rules/autoconsent/paypal.json +5 -2
  57. package/rules/autoconsent/primeconsent.json +39 -0
  58. package/rules/autoconsent/shinden.pl.json +34 -0
  59. package/rules/autoconsent/texas-instruments.json +17 -0
  60. package/rules/autoconsent/thegrandyork.json +46 -0
  61. package/rules/autoconsent/thenounproject.json +61 -0
  62. package/rules/autoconsent/toyota.json +16 -5
  63. package/rules/autoconsent/tri-table.json +14 -0
  64. package/rules/autoconsent/truevault-polaris.json +63 -0
  65. package/rules/autoconsent/uft-cookie-notice.json +15 -0
  66. package/rules/autoconsent/wbd-legal-terms.json +32 -0
  67. package/rules/autoconsent/webflow.json +1 -1
  68. package/rules/autoconsent/wix.json +90 -8
  69. package/rules/compact-rules.json +1 -1
  70. package/rules/rule-index.json +1 -1
  71. package/rules/rules.json +1 -1
  72. package/scripts/benchmark-button-classification.ts +75 -0
  73. package/scripts/button-text-benchmark.ts +102 -0
  74. package/tests/amazon-hiring.spec.ts +3 -0
  75. package/tests/avada-cookie-consent.spec.ts +9 -0
  76. package/tests/axeptio.spec.ts +8 -4
  77. package/tests/bigcrunch.spec.ts +16 -0
  78. package/tests/borlabs.spec.ts +7 -3
  79. package/tests/bricklink.spec.ts +3 -0
  80. package/tests/ceneo.spec.ts +3 -0
  81. package/tests/conjointly.spec.ts +3 -0
  82. package/tests/consentmo.spec.ts +1 -0
  83. package/tests/cookie-popup-close-cookies.spec.ts +10 -0
  84. package/tests/cookieconsent2.spec.ts +6 -1
  85. package/tests/costco.spec.ts +5 -0
  86. package/tests/datasign.spec.ts +8 -0
  87. package/tests/dhbbank.spec.ts +6 -0
  88. package/tests/ee-consent-notice.spec.ts +9 -0
  89. package/tests/ensembleartsphilly.spec.ts +6 -0
  90. package/tests/evium.de.spec.ts +5 -0
  91. package/tests/fera-cookies.spec.ts +6 -0
  92. package/tests/iubenda.spec.ts +6 -0
  93. package/tests/la7-cmp.spec.ts +6 -0
  94. package/tests/laravel-cookie-consent.spec.ts +10 -0
  95. package/tests/legislation-gov-uk.spec.ts +3 -0
  96. package/tests/mackeeper.spec.ts +3 -0
  97. package/tests/ndl-go-jp.spec.ts +8 -0
  98. package/tests/pandectes.spec.ts +20 -1
  99. package/tests/passle.spec.ts +8 -0
  100. package/tests/paypal-us.spec.ts +2 -3
  101. package/tests/primeconsent.spec.ts +11 -0
  102. package/tests/shinden.pl.spec.ts +5 -0
  103. package/tests/texas-instruments.spec.ts +3 -0
  104. package/tests/thegrandyork.spec.ts +3 -0
  105. package/tests/thenounproject.spec.ts +3 -0
  106. package/tests/tri-table.spec.ts +5 -0
  107. package/tests/truevault-polaris.spec.ts +9 -0
  108. package/tests/uft-cookie-notice.spec.ts +3 -0
  109. package/tests/wbd-legal-terms.spec.ts +18 -0
  110. package/tests/webflow.spec.ts +7 -1
  111. package/tests/wix.spec.ts +8 -1
  112. package/tests-wtr/heuristics/button-classification-accuracy.test.ts +41 -0
  113. package/tests-wtr/heuristics/heuristics-utils.test.ts +64 -0
  114. package/rules/autoconsent/paypal-cookieprefs.json +0 -29
  115. package/tests/paypal-cookieprefs.spec.ts +0 -7
@@ -0,0 +1,145 @@
1
+ ---
2
+ name: optimize-button-patterns
3
+ description: >-
4
+ Iteratively improves the heuristic button regex patterns in lib/heuristic-patterns.ts
5
+ against data/labelled-button-texts.csv. Use when labels are updated, benchmark
6
+ coverage is low, or the user asks to optimize/fix button pattern regexes.
7
+ Targets zero false positives and ≥90% weighted coverage per label (settings,
8
+ accept, reject, acknowledge).
9
+ disable-model-invocation: true
10
+ ---
11
+
12
+ # Optimize Button Patterns
13
+
14
+ Improve the button patterns in `lib/heuristic-patterns.ts` so `classifyButtonTextRegex` matches the labelled dataset in `data/labelled-button-texts.csv`.
15
+
16
+ These patterns decide what autoconsent clicks in users' browsers, and tracker-radar-collector imports them for crawl post-processing. A pattern that moves a button between labels changes which heuristic tier handles its popup (see `classifyPopup`): an `acknowledge` button is clicked in tier1, an `accept` button only in tier2. Keep that in mind when a fix moves text between `ACCEPT_PATTERNS` and `ACKNOWLEDGE_PATTERNS`.
17
+
18
+ ## Prerequisites
19
+
20
+ 1. Confirm `data/labelled-button-texts.csv` has up-to-date labels. New rows come from tracker-radar-collector: `collect-popup-button-texts.js` adds unlabelled rows and `label-button-texts.js` labels them with an LLM (see that repo's `post-processing/README.md`). If the CSV has unlabelled rows, suggest running `label-button-texts.js` first.
21
+ 2. For label semantics, read the `classifyButtonTextLLM` prompt in tracker-radar-collector's `post-processing/generate-autoconsent-rules/detection.js`. That prompt is the source of truth for labels; do not duplicate it here.
22
+ 3. If a label looks wrong, fix the row in the CSV rather than bending patterns to fit it (see AGENTS.md).
23
+
24
+ ## Success criteria
25
+
26
+ Stop when all three are met:
27
+
28
+ 1. **Zero false positives** (occurrence-weighted total across labels)
29
+ 2. **Per-label weighted coverage > 90%** for each of `settings`, `accept`, `reject`, and `acknowledge` (`other` is excluded from optimization)
30
+ 3. **Pattern consolidation**: merge literal clusters into regexes where safe; dedupe exact duplicates
31
+
32
+ `npm run test:lib` enforces criteria 1 and 2 (`tests-wtr/heuristics/button-classification-accuracy.test.ts`), so it must pass before you finish.
33
+
34
+ ## Benchmark
35
+
36
+ Run after every batch of edits:
37
+
38
+ ```bash
39
+ npm run benchmark-buttons -- --top 25
40
+ ```
41
+
42
+ The output has the totals (weighted false positives, weighted misses) and, per label, the row and occurrence-weighted correct rate, the false-positive count, and the top false positives and misses sorted by occurrences, formatted as `[label -> predicted] "text" (xN)`. A label passes when its weighted rate is above 90%. Check all four labels every iteration. Use `--top <n>` for longer example lists.
43
+
44
+ Count patterns before and after with:
45
+
46
+ ```bash
47
+ npx ts-node -e "import * as p from './lib/heuristic-patterns'; for (const [k, v] of Object.entries(p)) console.log(k, v.length)"
48
+ ```
49
+
50
+ ## Run loop
51
+
52
+ Max ~10 iterations. Each iteration:
53
+
54
+ ### 1. Measure
55
+
56
+ Run the benchmark. Record each label's weighted rate (and which labels are below 90%), weighted false positives, and pattern counts.
57
+
58
+ ### 2. Fix false positives first
59
+
60
+ For each false positive (predicted as a label, but the ground truth is a different label):
61
+
62
+ - Find the matching pattern in `lib/heuristic-patterns.ts` (grep the cleaned text; remember the classification order: reject → settings → accept → acknowledge).
63
+ - Fix by removing the pattern, moving it to the correct list, narrowing it with `^...$` anchors, or adding a `BUTTON_NEVER_MATCH_PATTERNS` guard.
64
+ - Re-run the benchmark. **Do not add new coverage patterns while false positives remain.**
65
+
66
+ ### 3. Improve coverage
67
+
68
+ While any label is below 90%, prioritize the labels furthest below (by the gap in weighted correct count: weighted support minus weighted correct).
69
+
70
+ Each iteration, take the top 15–25 misses by occurrences from **under-target labels only**.
71
+
72
+ For each miss:
73
+
74
+ - Add the smallest pattern that fixes it in the correct list (`REJECT_PATTERNS`, `SETTINGS_PATTERNS`, `ACCEPT_PATTERNS` or `ACKNOWLEDGE_PATTERNS`, keeping the per-language sub-lists for reject).
75
+ - Prefer extending an existing regex over adding a literal string.
76
+ - Run the collision check (below) before keeping it.
77
+ - Re-run the benchmark after each batch. False positives must not increase, and no label's rate may drop below its previous value.
78
+
79
+ ### 4. Merge patterns
80
+
81
+ Once false positives are 0 and **every** label is above 90%:
82
+
83
+ - Remove exact duplicate literals within the same list.
84
+ - Replace clusters of 3+ similar literals with one anchored alternation regex, e.g. `/^(alles accepteren|accepteer alles|alles akzeptieren)$/i`.
85
+ - Re-run the benchmark to confirm there is no regression.
86
+
87
+ ### 5. Verify and report
88
+
89
+ Run `npm run test:lib` and `npm run lint`, then report using the output template at the end of this file.
90
+
91
+ ## Pattern authoring rules
92
+
93
+ - Edit the button lists in `lib/heuristic-patterns.ts` only. Do not change `DETECT_PATTERNS`/`DETECT_NEVER_MATCH_PATTERNS` or the classification code in `lib/heuristics.ts` as part of this loop.
94
+ - Classification order: **reject → settings → accept → acknowledge → other** (see `classifyButtonTextRegex`). Patterns are matched against `cleanButtonText` output (lowercased, punctuation and emoji stripped, whitespace collapsed).
95
+ - Essential/necessary-only phrases → **reject**, even when "accept" appears.
96
+ - `allow` / `permit` + selection → **accept**; `customize` / `manage` / show details → **settings**.
97
+ - Neutral dismiss (OK, close, got it) → **acknowledge**. Accept-and-close (e.g. "akzeptieren schließen") → **accept**.
98
+ - Use anchored regexes (`^...$`) for short action verbs to avoid substring false positives.
99
+ - Preserve the language section comments (`// German`, `// Dutch`, etc.) and existing explanatory comments.
100
+
101
+ ## Known pitfalls
102
+
103
+ Patterns misplaced across lists cause false positives:
104
+
105
+ | Text | Correct label | Common mistake |
106
+ |------|---------------|----------------|
107
+ | `selectie toestaan` | accept | Listed in the Dutch reject patterns |
108
+ | `widerrufen` | other (revoke link, not a reject button) | Added to the German reject patterns |
109
+ | bare `essential` / `required` | other (category labels) | Matched by the essential-only reject pattern |
110
+
111
+ When fixing false positives, search `lib/heuristic-patterns.ts` for the literal or a regex that matches the cleaned text, then move, remove or narrow it.
112
+
113
+ ## Collision check
114
+
115
+ Before adding pattern `P` for label `L`:
116
+
117
+ 1. Apply `cleanButtonText` when matching (same as runtime).
118
+ 2. Scan the labelled CSV: if `P` would match a row where `label !== L`, that is a collision. Include rows labelled `other`: the benchmark does not count those as false positives, but autoconsent would still click them.
119
+ 3. If a high-occurrence collision exists, narrow `P` or skip it.
120
+ 4. String patterns match the exact cleaned text; regex patterns use `.test(cleanedText)`.
121
+
122
+ ## Stop conditions
123
+
124
+ - All success criteria met (including every label above 90%), or
125
+ - No improvement in any under-target label's weighted rate for 2 consecutive iterations (report blockers per label), or
126
+ - User iteration budget reached
127
+
128
+ ## Output template
129
+
130
+ End with:
131
+
132
+ ```markdown
133
+ ## Button pattern optimization results
134
+ - False positives: N → 0
135
+ - Per-label weighted coverage (target >90% each):
136
+ - settings: X% → Y%
137
+ - accept: X% → Y%
138
+ - reject: X% → Y%
139
+ - acknowledge: X% → Y%
140
+ - Pattern count: A → B
141
+ - Key changes:
142
+ - ...
143
+ - Remaining top misses (if any, by label below target):
144
+ - [label -> predicted] "text" (xN)
145
+ ```
@@ -93,7 +93,7 @@ With `solveCaptcha: true`, a listener in autoconsent's isolated world forwards t
93
93
 
94
94
  - **CAPTCHA events arrive via `window.postMessage`, not CDP.** With `solveCaptcha: true`, autoconsent's wait pauses whenever a start event arrives, until `oxylabs-captcha-end`, `oxylabs-captcha-solve-end` or `oxylabs-captcha-error`, for at most 60s from the first start (the timeout in Oxylabs' example). Oxylabs documents no deadline for the start event, so captcha-free pages aren't held up waiting for one. Agent Browser sends `oxylabs-captcha-solve-start` with a `captchaType` (e.g. `turnstile`); the documented `oxylabs-captcha-start` is accepted too. A Cloudflare Turnstile took about 35-40s to solve. Hard blocks without a captcha (e.g. DataDome "Access is temporarily restricted", Akamai "Access denied") send no events, so solving doesn't help there.
95
95
  - **Main-world CDP bindings don't work on Agent Browser.** `page.exposeBinding`, and `Runtime.addBinding` without `executionContextName`, never reach the page. Bindings scoped to an isolated world (what the harness uses) work, and `window` messages reach isolated-world listeners, so listen there.
96
- - **Limits:** 100 concurrent sessions and 10 new sessions per second per account.
96
+ - **Limits:** 100 concurrent sessions and 10 new sessions per second per account. Going over the per-second limit fails `connectOverCDP` with `WebSocket error: ... 429 Too Many Requests`, and the library does not retry it. `testRegions` opens sessions one at a time, but a script that opens sessions in parallel (several `withOxylabsPage` calls in a `Promise.all`, or several such scripts at once) can easily send 10 within a second. Stagger the session opens (for example 200ms apart), and rerun any test that failed with a 429. A 429 is not a result about the site.
97
97
  - **Call injection before `page.goto`**, so autoconsent is in place before page scripts run.
98
98
  - **Oxylabs blocks certain site categories** (e.g. government sites), and some sites block Oxylabs too: check the screenshots. Use alternative URLs for the same CMP, or retest as described in the `proxy-testing` gotchas.
99
99
  - **Each region test creates a new browser session** — there's no session reuse across regions.
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: optimize-button-patterns
3
+ description: Iteratively improves the heuristic button regex patterns in lib/heuristic-patterns.ts against data/labelled-button-texts.csv. Use when labels are updated, benchmark coverage is low, or the user asks to optimize/fix button pattern regexes.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ @.agents/skills/optimize-button-patterns/SKILL.md
@@ -18,13 +18,9 @@ permissions:
18
18
 
19
19
  jobs:
20
20
  # No concurrency group here: a 'labeled' event right after 'opened' must not cancel this job.
21
+ # Only on 'opened': a later run would re-add category labels that the author replaced.
21
22
  path-labels:
22
- if: >-
23
- ${{
24
- github.event.action == 'opened' ||
25
- github.event.action == 'reopened' ||
26
- github.event.action == 'ready_for_review'
27
- }}
23
+ if: ${{ github.event.action == 'opened' }}
28
24
  runs-on: ubuntu-latest
29
25
  steps:
30
26
  - uses: actions/checkout@v4
package/AGENTS.md CHANGED
@@ -41,6 +41,7 @@ npm run watch # auto-rebuild on changes to lib/, addon/, rules/
41
41
  | `npm run test:chrome` | Playwright tests in Chrome only |
42
42
  | `npm run build-rules` | Rebuild `rules.json`, `compact-rules.json` |
43
43
  | `npm run create-rule` | Scaffold a new JSON rule + test spec |
44
+ | `npm run benchmark-buttons` | Score heuristic button classification against labelled button texts |
44
45
 
45
46
  ## Code Style
46
47
  - **Preserve existing comments.** Do not remove JSDoc comments, TODO comments, or inline explanations unless the related code is also being removed. Rewriting a comment to reflect updated logic is fine.
@@ -135,6 +136,7 @@ shadow root or same-origin iframe.
135
136
  - If an existing generic rule fails on a specific site: first look for other sites with the same failure (spec sites, data/coverage.json, publicwww). If the issue applies to more sites, update the generic rule; if the issue is truly site-specific, prefer making a site-specific rule or a config exception. Never change a generic rule to fix a site-specific implementation problem.
136
137
  - After updating an existing generic rule, do a heavy testing run: all known sites (specs + data/coverage.json + publicwww) across the expanded set. Inspect both API results AND screenshots.
137
138
  - **When adding or fixing a rule for a site, remove stale site-specific rules covering the same site.** If a site-specific rule is obsolete in all regions (the site switched CMP), remove it rather than leaving it alongside the new or updated rule.
139
+ - **Heuristic pattern changes must keep the labelled button benchmark green.** `lib/heuristic-patterns.ts` is the source of truth for heuristic patterns; downstream projects (e.g. tracker-radar-collector) should import them rather than keep copies. `tests-wtr/heuristics/button-classification-accuracy.test.ts` checks `classifyButtonTextRegex` against `data/labelled-button-texts.csv` (no false positives, >90% weighted accuracy per label). Use `npm run benchmark-buttons` to see what a change gains or loses, and the `optimize-button-patterns` skill to tune patterns against it. New labelled rows come from the tracker-radar-collector post-processing scripts (`collect-popup-button-texts.js`, `label-button-texts.js`). Fix a mislabelled row in the CSV rather than bending patterns to fit it.
138
140
  - if a popup does not provide an opt-out button, `optOut` _may_ click "dismiss"/"acknowledge" instead. Check with the existing heuristic patterns in /lib/heuristic-patterns.ts for reference. Do **not** click a TIER2 (single Accept) button — see General Guidelines.
139
141
  - do not keep outdated selectors in changed rules, unless they are actually used in some conditions
140
142
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,80 @@
1
+ # v16.50.0 (Sat Oct 10 2026)
2
+
3
+ #### Rules
4
+
5
+ - Rule update: ddg_android (eun) CPM magic report: openrouter.ai [#1646](https://github.com/duckduckgo/autoconsent/pull/1646) ([@daxtheduck](https://github.com/daxtheduck) [@muodov](https://github.com/muodov))
6
+ - Rule update: ddg_android (usc) CPM magic report: hiring.amazon.ca [#1647](https://github.com/duckduckgo/autoconsent/pull/1647) ([@daxtheduck](https://github.com/daxtheduck))
7
+ - Rule update: ddg_ios (use) CPM magic report: www.foodnetwork.com [#1649](https://github.com/duckduckgo/autoconsent/pull/1649) ([@daxtheduck](https://github.com/daxtheduck))
8
+ - Rule update: bigcrunch [#1655](https://github.com/duckduckgo/autoconsent/pull/1655) ([@daxtheduck](https://github.com/daxtheduck))
9
+ - Rule update: avada-cookie-consent [#1670](https://github.com/duckduckgo/autoconsent/pull/1670) ([@daxtheduck](https://github.com/daxtheduck))
10
+ - Rule update: ceneo [#1660](https://github.com/duckduckgo/autoconsent/pull/1660) ([@daxtheduck](https://github.com/daxtheduck))
11
+ - Rule update: axeptio [#1658](https://github.com/duckduckgo/autoconsent/pull/1658) ([@daxtheduck](https://github.com/daxtheduck))
12
+ - Rule update: dhbbank [#1669](https://github.com/duckduckgo/autoconsent/pull/1669) ([@daxtheduck](https://github.com/daxtheduck))
13
+ - Rule update: laravel-cookie-consent [#1668](https://github.com/duckduckgo/autoconsent/pull/1668) ([@daxtheduck](https://github.com/daxtheduck))
14
+ - Rule update: mackeeper [#1666](https://github.com/duckduckgo/autoconsent/pull/1666) ([@daxtheduck](https://github.com/daxtheduck))
15
+ - Rule update: fera-cookies [#1665](https://github.com/duckduckgo/autoconsent/pull/1665) ([@daxtheduck](https://github.com/daxtheduck))
16
+ - Rule update: uft-cookie-notice [#1664](https://github.com/duckduckgo/autoconsent/pull/1664) ([@daxtheduck](https://github.com/daxtheduck))
17
+ - Rule update: ndl-go-jp [#1663](https://github.com/duckduckgo/autoconsent/pull/1663) ([@daxtheduck](https://github.com/daxtheduck))
18
+ - Rule update: la7-cmp [#1662](https://github.com/duckduckgo/autoconsent/pull/1662) ([@daxtheduck](https://github.com/daxtheduck))
19
+ - Rule update: thenounproject [#1661](https://github.com/duckduckgo/autoconsent/pull/1661) ([@daxtheduck](https://github.com/daxtheduck))
20
+ - Rule update: bricklink [#1659](https://github.com/duckduckgo/autoconsent/pull/1659) ([@daxtheduck](https://github.com/daxtheduck))
21
+ - Rule update: texas-instruments [#1657](https://github.com/duckduckgo/autoconsent/pull/1657) ([@daxtheduck](https://github.com/daxtheduck))
22
+ - Rule update: legislation-gov-uk [#1656](https://github.com/duckduckgo/autoconsent/pull/1656) ([@daxtheduck](https://github.com/daxtheduck))
23
+ - Rule update: toyota [#1654](https://github.com/duckduckgo/autoconsent/pull/1654) ([@daxtheduck](https://github.com/daxtheduck))
24
+ - Rule update: [E2E test] bryantpark.org fix path [#1651](https://github.com/duckduckgo/autoconsent/pull/1651) ([@daxtheduck](https://github.com/daxtheduck))
25
+ - Rule update: Cookie popup on www.thegrandyork.co.uk [#1650](https://github.com/duckduckgo/autoconsent/pull/1650) ([@daxtheduck](https://github.com/daxtheduck))
26
+ - Rule update: Cookie prompt not dismissed for erewhon.com [#1644](https://github.com/duckduckgo/autoconsent/pull/1644) ([@daxtheduck](https://github.com/daxtheduck))
27
+ - Rule update: Cookie Popup on vaquerogengage.com [#1620](https://github.com/duckduckgo/autoconsent/pull/1620) ([@daxtheduck](https://github.com/daxtheduck) [@muodov](https://github.com/muodov))
28
+ - paypal: hide the no-Decline banner, retry the Decline click [#1652](https://github.com/duckduckgo/autoconsent/pull/1652) ([@muodov](https://github.com/muodov))
29
+ - Rule update: conjointly [#1648](https://github.com/duckduckgo/autoconsent/pull/1648) ([@daxtheduck](https://github.com/daxtheduck))
30
+
31
+ #### CI / Release Automation
32
+
33
+ - Apply path-based labels only when a PR is opened [#1671](https://github.com/duckduckgo/autoconsent/pull/1671) ([@muodov](https://github.com/muodov))
34
+
35
+ #### Authors: 2
36
+
37
+ - Dax ([@daxtheduck](https://github.com/daxtheduck))
38
+ - Maxim Tsoy ([@muodov](https://github.com/muodov))
39
+
40
+ ---
41
+
42
+ # v16.49.0 (Fri Oct 09 2026)
43
+
44
+ #### Rules
45
+
46
+ - Rule update: ddg_mac_desktop (use) CPM magic report: us.select-sport.com [#1645](https://github.com/duckduckgo/autoconsent/pull/1645) ([@daxtheduck](https://github.com/daxtheduck))
47
+ - Rule update: evium.de [#1643](https://github.com/duckduckgo/autoconsent/pull/1643) ([@daxtheduck](https://github.com/daxtheduck))
48
+ - Rule update: pandectes [#1641](https://github.com/duckduckgo/autoconsent/pull/1641) ([@daxtheduck](https://github.com/daxtheduck))
49
+ - Rule update: ensembleartsphilly [#1618](https://github.com/duckduckgo/autoconsent/pull/1618) ([@daxtheduck](https://github.com/daxtheduck))
50
+ - Add button classification benchmarking suite [#1604](https://github.com/duckduckgo/autoconsent/pull/1604) ([@claude](https://github.com/claude) [@sammacbeth](https://github.com/sammacbeth))
51
+ - Rule update: costco.ca cookie prompt not handled [#1639](https://github.com/duckduckgo/autoconsent/pull/1639) ([@daxtheduck](https://github.com/daxtheduck) [@muodov](https://github.com/muodov))
52
+ - Rule update: ddg_mac_desktop (use) CPM magic report: www.mcgeeandco.com [#1637](https://github.com/duckduckgo/autoconsent/pull/1637) ([@daxtheduck](https://github.com/daxtheduck))
53
+ - Rule update: ddg_ios (ase) CPM magic report: www.ctgt.ai [#1636](https://github.com/duckduckgo/autoconsent/pull/1636) ([@daxtheduck](https://github.com/daxtheduck))
54
+ - Rule update: CPM feedback: shinden.pl [#1635](https://github.com/duckduckgo/autoconsent/pull/1635) ([@daxtheduck](https://github.com/daxtheduck))
55
+ - Rule update: Cookie popup on jfe-holdings.co.jp (Datasign CMP) [#1633](https://github.com/duckduckgo/autoconsent/pull/1633) ([@daxtheduck](https://github.com/daxtheduck))
56
+ - Rule update: Cookie popup on www.jclewislincoln.com [#1632](https://github.com/duckduckgo/autoconsent/pull/1632) ([@daxtheduck](https://github.com/daxtheduck))
57
+ - Rule update: Cookie popup on catflooringaccessories.com [#1631](https://github.com/duckduckgo/autoconsent/pull/1631) ([@daxtheduck](https://github.com/daxtheduck))
58
+ - Rule update: Cookie popup on technologylaw.fkks.com (Passle CMP) [#1630](https://github.com/duckduckgo/autoconsent/pull/1630) ([@daxtheduck](https://github.com/daxtheduck))
59
+ - Rule update: goaexperience.co.uk (Cookieconsent CMP) [#1629](https://github.com/duckduckgo/autoconsent/pull/1629) ([@daxtheduck](https://github.com/daxtheduck))
60
+ - Rule update: ddg_ios (ase) CPM magic report: www.poconopoolandspallc.com [#1628](https://github.com/duckduckgo/autoconsent/pull/1628) ([@daxtheduck](https://github.com/daxtheduck))
61
+ - Rule update: Cookie consent not dismissed on https://www.yogurtland.com/ (no-reject version of Iubenda) [#1625](https://github.com/duckduckgo/autoconsent/pull/1625) ([@daxtheduck](https://github.com/daxtheduck))
62
+ - Rule update: Cookie popup on goorin.com [#1623](https://github.com/duckduckgo/autoconsent/pull/1623) ([@daxtheduck](https://github.com/daxtheduck))
63
+ - Rule update: https://www.headphonecheck.com/ (Borlabs CMP, Easylist breakage) [#1622](https://github.com/duckduckgo/autoconsent/pull/1622) ([@daxtheduck](https://github.com/daxtheduck))
64
+
65
+ #### AI / Agent Workflow
66
+
67
+ - oxylabs-testing: note what happens over the new-session limit [#1640](https://github.com/duckduckgo/autoconsent/pull/1640) ([@muodov](https://github.com/muodov))
68
+
69
+ #### Authors: 4
70
+
71
+ - Claude ([@claude](https://github.com/claude))
72
+ - Dax ([@daxtheduck](https://github.com/daxtheduck))
73
+ - Maxim Tsoy ([@muodov](https://github.com/muodov))
74
+ - Sam Macbeth ([@sammacbeth](https://github.com/sammacbeth))
75
+
76
+ ---
77
+
1
78
  # v16.48.0 (Thu Oct 08 2026)
2
79
 
3
80
  #### Rules
package/data/Readme.md CHANGED
@@ -4,8 +4,14 @@ This folder contains statistics gathered from running crawls with autoconsent ac
4
4
  The crawler uses [tracker-radar-collector](https://github.com/duckduckgo/tracker-radar-collector/) to crawl a list of the top 10k sites for US, DE and GB regions.
5
5
  The results report how many sites in this list the rule triggered for, and some error counts.
6
6
 
7
+ ## Labelled button texts
8
+
9
+ `labelled-button-texts.csv` holds cookie popup button texts collected from crawls (`button_text`, normalized with `cleanButtonText`), the number of sites each appeared on (`occurences`), and a `label`: `settings`, `accept`, `reject`, `acknowledge` or `other`.
10
+ It is produced by the [tracker-radar-collector](https://github.com/duckduckgo/tracker-radar-collector/) post-processing scripts (`collect-popup-button-texts.js`, then `label-button-texts.js`), and is used by `npm run benchmark-buttons` and `tests-wtr/heuristics/button-classification-accuracy.test.ts` to measure heuristic button classification.
11
+
7
12
  ## Data format
8
13
 
14
+
9
15
  In `coverage.json` the data is included as a JSON object. Keys correspond to rule names and contain stats for `US`, `DE` and `GB` regions, where applicable.
10
16
  The stats contain the following keys:
11
17
  - `sites`: Number of sites where this rule was triggered (`detectCmp` was true).