Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 引用:
Expand Down
1 change: 1 addition & 0 deletions Rules/Core/ProxyGFWlist.list
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion audit-baseline.json
Original file line number Diff line number Diff line change
@@ -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|🛑 广告拦截",
Expand Down
20 changes: 19 additions & 1 deletion tests/test_routing_semantics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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)))
Expand Down
Loading