From 24a734a823f639b670a007f6ab2f786ab89603cb Mon Sep 17 00:00:00 2001 From: J_Sinclair <56301946+E-R-Butch@users.noreply.github.com> Date: Wed, 4 Nov 2026 13:08:13 +0800 Subject: [PATCH] fix: baseline reviewed bilibili GFW overlap Preserve the existing ChinaMedia policy when GFWList adds bilibili.tv. Keep the generated rule, record only its reviewed overlap, and add routing regression coverage without weakening the audit. --- README.md | 2 ++ Rules/Core/ProxyGFWlist.list | 1 + audit-baseline.json | 3 ++- tests/test_routing_semantics.py | 20 +++++++++++++++++++- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index df06f6d..ce1244b 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,8 @@ https://raw.githubusercontent.com/E-R-Butch/ACL4SSR-Redux/master/Config/ACL4SSR_ `ProxyGFWlist.list`、`ChinaIp.list`、`ChinaIpV6.list`、`BanEasy*.list` 由每日同步生成,其中的条目被更早的规则覆盖属于预期(自动同步会把它们写回来),不要手工删除;`scripts/audit_rules.py` 的基线负责把这些已知条目与新增冲突区分开。 +2026-11-04 复核 [GFWList 新增的 `bilibili.tv`](https://github.com/gfwlist/gfwlist/commit/e1ff22048acbf77bd7b21906355c47e44d3ecda5):保留其生成条目,同时保留现有 `ChinaMedia.list` 的优先级,首个命中仍为「🌏 国内媒体」(默认 DIRECT,可手动选择代理)。此处只把这一条已复核的重叠加入基线,并用分流回归测试固定原有行为,不代表验证了国际站的地区可用性;其它新增冲突仍需单独复核。 + ## 📦 Provider 生成与再平衡 `scripts/split_providers.py` 把广告与隐私这面单独抽出来做全局去重和多文件再平衡,产物由客户端以 `rule-provider` + `RULE-SET` 引用: diff --git a/Rules/Core/ProxyGFWlist.list b/Rules/Core/ProxyGFWlist.list index f300fdd..a215c68 100644 --- a/Rules/Core/ProxyGFWlist.list +++ b/Rules/Core/ProxyGFWlist.list @@ -805,6 +805,7 @@ DOMAIN-SUFFIX,bigjapanesesex.com DOMAIN-SUFFIX,bignews.org DOMAIN-SUFFIX,bigone.com DOMAIN-SUFFIX,bild.de +DOMAIN-SUFFIX,bilibili.tv DOMAIN-SUFFIX,bilinovel.com DOMAIN-SUFFIX,binance.com DOMAIN-SUFFIX,binance.org diff --git a/audit-baseline.json b/audit-baseline.json index 09003d4..438dacf 100644 --- a/audit-baseline.json +++ b/audit-baseline.json @@ -1,9 +1,10 @@ { "note": "Reviewed rule conflicts that the ini order intentionally accepts. See README '规则优先级与已知取舍'. Refresh with: python3 scripts/audit_rules.py --update-baseline", - "count": 72, + "count": 73, "accepted": [ "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,admob.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,admob.com|🛑 广告拦截", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,ads-twitter.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,ads-twitter.com|🛑 广告拦截", + "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,bilibili.tv|Rules/Ruleset/Active/ChinaMedia.list|DOMAIN-SUFFIX,bilibili.tv|🌏 国内媒体", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,crashlytics.com|Rules/Ruleset/Active/AppleReject.list|DOMAIN-SUFFIX,crashlytics.com|🔒 隐私保护", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,googlecommerce.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,googlecommerce.com|🛑 广告拦截", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,incloak.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,incloak.com|🛑 广告拦截", diff --git a/tests/test_routing_semantics.py b/tests/test_routing_semantics.py index 908f7c0..00e1a17 100644 --- a/tests/test_routing_semantics.py +++ b/tests/test_routing_semantics.py @@ -4,7 +4,7 @@ import tempfile import unittest -from scripts import validate_rules +from scripts import audit_rules, validate_rules ROOT = pathlib.Path(__file__).resolve().parents[1] @@ -33,6 +33,24 @@ def check_mutation(self, text): path.write_text(text, encoding="utf-8") return validate_rules.validate_ini(path) + def test_bilibili_keeps_explicit_media_policy_before_gfwlist(self): + # An upstream GFWList addition must not silently change the existing + # service policy. Its exact overlap is reviewed in audit-baseline.json. + ordered = audit_rules.collect_ranked_rules(self.text.splitlines()) + for host in ("bilibili.tv", "www.bilibili.tv", "bilibili.com", "www.bilibili.com"): + with self.subTest(host=host): + winner = next(rule for rule in ordered if ( + rule["type"] == "DOMAIN" and host == rule["value"] or + rule["type"] == "DOMAIN-SUFFIX" and + (host == rule["value"] or host.endswith("." + rule["value"])) or + rule["type"] == "DOMAIN-KEYWORD" and rule["value"] in host + )) + self.assertEqual(winner["target"], "🌏 国内媒体") + self.assertEqual(audit_rules.source_name(winner), "Rules/Ruleset/Active/ChinaMedia.list") + self.assertEqual( + validate_rules.group_selectors(self.definitions["🌏 国内媒体"])[0], "[]DIRECT" + ) + def test_original_claude_indirect_direct_route_is_rejected(self): text = self.text.replace("🎭 Claude`select`[]🎭 Claude 自动", "🎭 Claude`select`[]🚀 节点选择") self.assertTrue(any("reaches DIRECT" in error for error in self.check_mutation(text)))