Free proxy node aggregator. Daily updated vmess/vless/trojan/ss. 免费 代理节点 翻墙 梯子 科学上网 机场订阅 网络加速 VPN 免翻墙每日更新 一键导入
This report summarizes scanner evidence for awesome-vpn/awesome-vpn, a Python project with 6,616 GitHub stars. SynthScan examined 30,299 lines of code across 70 source files, recording 203 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 10.0 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 74 finding(s).
Are imports declared and package/API names verified? 11 finding(s).
Are wrappers, guards, and repeated structures necessary? 157 finding(s).
Which changes need focused human review? 203 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 203 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | core/validator.py | 303 | except Exception: | CODE |
| HIGH | core/validator.py | 451 | except Exception: | CODE |
| HIGH | core/validator.py | 442 | except Exception: | CODE |
| HIGH | core/geo_utils.py | 100 | except OSError: | CODE |
| HIGH | core/geo_utils.py | 106 | except OSError: | CODE |
| HIGH | core/geo_utils.py | 195 | except Exception: | CODE |
| HIGH | core/geo_utils.py | 191 | except Exception: | CODE |
| HIGH | core/pipeline.py | 56 | except Exception: | CODE |
| HIGH | core/pipeline.py | 70 | except Exception: | CODE |
| HIGH | core/pipeline.py | 179 | except Exception: | CODE |
| HIGH | core/dual_validator.py | 78 | except Exception: | CODE |
| HIGH | core/dual_validator.py | 92 | except Exception: | CODE |
| HIGH | core/dual_validator.py | 56 | except Exception: | CODE |
| HIGH | core/dual_validator.py | 249 | except Exception: | CODE |
| HIGH | core/dual_validator.py | 329 | except Exception: | CODE |
| HIGH | core/spider.py | 211 | except Exception: | CODE |
| HIGH | core/spider.py | 218 | except Exception: | CODE |
| HIGH | core/spider.py | 371 | except (ValueError, TypeError, AttributeError): | CODE |
| HIGH | core/parsers/clash2base64.py | 58 | except Exception: | CODE |
| HIGH | core/parsers/vmess.py | 68 | except json.JSONDecodeError: | CODE |
| HIGH | core/harvesters/static_feed.py | 31 | except Exception: | CODE |
| HIGH | core/harvesters/static_feed.py | 25 | except (ValueError, TypeError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | core/validator.py | 120 | def tcp_ping(self, host, port, timeout=3): | CODE |
| LOW | core/validator.py | 87 | except Exception: | CODE |
| LOW | core/validator.py | 124 | except Exception: | CODE |
| LOW | core/validator.py | 189 | except Exception: | CODE |
| LOW | core/validator.py | 227 | except Exception: | CODE |
| LOW | core/validator.py | 274 | except Exception: | CODE |
| LOW | core/validator.py | 303 | except Exception: | CODE |
| LOW | core/validator.py | 420 | except Exception: | CODE |
| LOW | core/validator.py | 431 | except Exception: | CODE |
| LOW | core/validator.py | 442 | except Exception: | CODE |
| LOW | core/validator.py | 451 | except Exception: | CODE |
| LOW | core/validator.py | 486 | except Exception: | CODE |
| LOW | core/deduplicator.py | 142 | except Exception: | CODE |
| LOW | core/geo_utils.py | 87 | except Exception as e: | CODE |
| LOW | core/geo_utils.py | 113 | except Exception: | CODE |
| LOW | core/geo_utils.py | 134 | except Exception as e: | CODE |
| LOW | core/geo_utils.py | 157 | except Exception as e: | CODE |
| LOW | core/geo_utils.py | 191 | except Exception: | CODE |
| LOW | core/geo_utils.py | 195 | except Exception: | CODE |
| LOW | core/node_ledger.py | 21 | except Exception: | CODE |
| LOW | core/node_ledger.py | 46 | except Exception as e: | CODE |
| LOW | core/node_ledger.py | 56 | except Exception as e: | CODE |
| MEDIUM | core/node_ledger.py | 50 | def save(self) -> None: | CODE |
| LOW | core/pipeline.py | 56 | except Exception: | CODE |
| LOW | core/pipeline.py | 70 | except Exception: | CODE |
| LOW | core/pipeline.py | 80 | except Exception: | CODE |
| LOW | core/pipeline.py | 179 | except Exception: | CODE |
| MEDIUM | core/pipeline.py | 173 | def _parse(link): | CODE |
| LOW | core/dual_validator.py | 56 | except Exception: | CODE |
| LOW | core/dual_validator.py | 78 | except Exception: | CODE |
| LOW | core/dual_validator.py | 92 | except Exception: | CODE |
| LOW⚡ | core/dual_validator.py | 236 | except Exception as e: | CODE |
| LOW⚡ | core/dual_validator.py | 243 | except Exception: | CODE |
| LOW⚡ | core/dual_validator.py | 249 | except Exception: | CODE |
| LOW⚡ | core/dual_validator.py | 316 | except Exception as e: | CODE |
| LOW⚡ | core/dual_validator.py | 323 | except Exception: | CODE |
| LOW⚡ | core/dual_validator.py | 329 | except Exception: | CODE |
| LOW | core/dual_validator.py | 359 | except Exception as e: | CODE |
| LOW | core/quality.py | 106 | except Exception: | CODE |
| LOW | core/quality.py | 175 | except Exception: | CODE |
| LOW | core/binary_manager.py | 88 | except Exception as e: | CODE |
| LOW | core/binary_manager.py | 185 | except Exception as e: | CODE |
| LOW | core/spider.py | 100 | except Exception as e: | CODE |
| LOW | core/spider.py | 189 | except Exception as e: | CODE |
| LOW | core/spider.py | 211 | except Exception: | CODE |
| LOW | core/spider.py | 218 | except Exception: | CODE |
| LOW | core/spider.py | 229 | except Exception as e: | CODE |
| LOW | core/filters/prescreen.py | 34 | except Exception: | CODE |
| LOW | core/parsers/ssr.py | 10 | except Exception: | CODE |
| LOW | core/parsers/clash2base64.py | 58 | except Exception: | CODE |
| LOW | core/parsers/vless.py | 12 | except Exception: | CODE |
| LOW | core/parsers/vless.py | 17 | except Exception: | CODE |
| LOW | core/parsers/socks.py | 20 | except Exception: | CODE |
| LOW | core/parsers/ss.py | 63 | except Exception: | CODE |
| LOW | core/parsers/ss.py | 80 | except Exception: | CODE |
| LOW | core/parsers/ss.py | 118 | except Exception: | CODE |
| LOW | core/parsers/ss.py | 137 | except Exception: | CODE |
| LOW | core/parsers/tool.py | 240 | except Exception: | CODE |
| LOW | core/parsers/tool.py | 337 | except Exception: | CODE |
| MEDIUM | core/parsers/tool.py | 237 | def get_protocol(s): | CODE |
| 17 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/dual_validator.py | 62 | def detect_physical_interface() -> str: | CODE |
| LOW | core/spider.py | 139 | def extract_subscription_links(self, text): | CODE |
| LOW | tests/test_dual_validator.py | 8 | def test_detect_physical_interface(): | CODE |
| LOW | tests/test_harvesters.py | 13 | def test_channel_ledger_lifecycle(): | CODE |
| LOW | tests/test_harvesters.py | 61 | def test_telegram_harvester_extraction(): | CODE |
| LOW | tests/test_harvesters.py | 88 | def test_github_radar_harvester(): | STRING |
| LOW | tests/test_clash_converter.py | 44 | def test_vmess_websocket_transport(): | CODE |
| LOW | tests/test_clash_converter.py | 92 | def test_vless_grpc_transport(): | CODE |
| LOW | tests/test_clash_converter.py | 167 | def test_trojan_websocket_transport(): | CODE |
| LOW | tests/test_clash_converter.py | 229 | def test_tuic_alpn_string_normalized_to_list(): | CODE |
| LOW | tests/test_clash_converter.py | 251 | def test_to_clash_proxies_filters_unsupported(): | CODE |
| LOW⚡ | tests/test_clash_converter.py | 270 | def test_to_clash_proxies_empty_list(): | CODE |
| LOW⚡ | tests/test_clash_converter.py | 274 | def test_vmess_default_tag_when_missing(): | CODE |
| LOW⚡ | tests/test_clash_converter.py | 280 | def test_vmess_alter_id_default_zero(): | CODE |
| LOW | tests/test_node_ledger.py | 30 | def test_record_validation_and_streak(temp_ledger): | CODE |
| LOW | tests/test_node_ledger.py | 108 | def test_quality_score_with_longevity(): | CODE |
| LOW | tests/test_vmess_parser.py | 9 | def test_vmess_uri_allow_insecure_zero_disables_insecure(): | CODE |
| LOW | tests/test_vmess_parser.py | 15 | def test_vmess_uri_allow_insecure_absent_keeps_insecure_true(): | CODE |
| LOW | tests/test_spider.py | 14 | def test_extract_links_simple(): | CODE |
| LOW | tests/test_spider.py | 31 | def test_parse_subscription_clash_yaml(): | CODE |
| LOW | tests/test_property.py | 16 | def test_ensure_unique_tags_never_duplicates(tags): | CODE |
| LOW | tests/test_property.py | 24 | def test_clash_proxy_vmess_roundtrip(server, port): | CODE |
| LOW | tests/test_property.py | 40 | def test_deduplicator_idempotent(): | CODE |
| LOW | tests/test_matrix.py | 10 | def test_matrix_exporter_and_telemetry(): | CODE |
| LOW | tests/test_deduplicator.py | 4 | def test_ensure_unique_tags_suffixes_duplicate_names(): | CODE |
| LOW | tests/test_deduplicator.py | 21 | def test_ensure_unique_tags_reserves_existing_suffixes(): | CODE |
| LOW | tests/test_deduplicator.py | 33 | def test_ensure_unique_tags_is_idempotent_and_ignores_empty_tags(): | CODE |
| LOW | tests/test_output_groups.py | 46 | def test_singbox_groups_are_english_and_standard(): | CODE |
| LOW | tests/test_output_groups.py | 76 | def test_clash_groups_are_english_and_standard(): | CODE |
| LOW | tests/test_output_groups.py | 110 | def test_output_configs_contain_no_chinese(): | CODE |
| LOW | tests/test_filters.py | 29 | def test_prescreen_funnel_workflow(): | CODE |
| LOW | tests/test_filters.py | 51 | def test_fair_source_interleaving(): | CODE |
| LOW | tests/test_geo_utils.py | 13 | def test_format_node_name_with_city(tmp_path): | CODE |
| LOW | tests/test_geo_utils.py | 23 | def test_format_node_name_without_city(tmp_path): | CODE |
| LOW | tests/test_geo_utils.py | 47 | def test_resolve_to_ip_direct(): | CODE |
| LOW | tests/test_quality.py | 26 | def test_shadowsocks_no_tls_scores_low(): | CODE |
| LOW | tests/test_quality.py | 31 | def test_quality_score_latency_penalty(): | CODE |
| LOW | tests/test_quality.py | 42 | def test_filter_by_china_probe_no_url_pass_through(): | CODE |
| LOW | tests/test_quality.py | 48 | def test_filter_by_china_probe_uses_probe(monkeypatch): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/validator.py | 455 | CODE | |
| LOW | core/validator.py | 75 | CODE | |
| LOW | core/validator.py | 240 | CODE | |
| LOW | core/validator.py | 277 | CODE | |
| LOW | core/validator.py | 311 | CODE | |
| LOW | core/deduplicator.py | 83 | CODE | |
| LOW | core/geo_utils.py | 118 | CODE | |
| LOW | core/node_ledger.py | 101 | CODE | |
| LOW | core/pipeline.py | 165 | CODE | |
| LOW | core/dual_validator.py | 47 | CODE | |
| LOW | core/dual_validator.py | 62 | CODE | |
| LOW | core/binary_manager.py | 92 | CODE | |
| LOW | core/binary_manager.py | 108 | CODE | |
| LOW | core/spider.py | 47 | CODE | |
| LOW | core/spider.py | 233 | CODE | |
| LOW | core/spider.py | 249 | CODE | |
| LOW | core/spider.py | 283 | CODE | |
| LOW | core/spider.py | 320 | CODE | |
| LOW | core/filters/prescreen.py | 60 | CODE | |
| LOW | core/parsers/clash2base64.py | 7 | CODE | |
| LOW | core/parsers/vless.py | 7 | CODE | |
| LOW | core/parsers/ss.py | 10 | CODE | |
| LOW | core/parsers/vmess.py | 8 | CODE | |
| LOW | core/converters/clash.py | 117 | CODE | |
| LOW | core/harvesters/channel_ledger.py | 154 | CODE | |
| LOW | core/harvesters/static_feed.py | 80 | CODE | |
| LOW | core/harvesters/static_feed.py | 113 | CODE | |
| LOW | core/harvesters/static_feed.py | 170 | CODE | |
| LOW | core/harvesters/telegram.py | 38 | CODE | |
| LOW | core/harvesters/telegram.py | 82 | CODE | |
| LOW | core/harvesters/github_radar.py | 115 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | main.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/geo_utils.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/node_ledger.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/pipeline.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/dual_validator.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/binary_manager.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/spider.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/filters/__init__.py | 6 | __all__ = ["HoneypotFilter", "PrescreenFunnel"] | CODE |
| LOW | core/filters/prescreen.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/filters/honeypot.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/converters/clash.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/harvesters/channel_ledger.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/harvesters/static_feed.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/harvesters/telegram.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/harvesters/__init__.py | 9 | __all__ = [ | CODE |
| LOW | core/harvesters/github_radar.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/matrix/exporter.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | core/matrix/__init__.py | 6 | __all__ = ["MatrixExporter", "TelemetryReporter"] | CODE |
| LOW | core/matrix/telemetry.py | 9 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/filters/__init__.py | 3 | CODE | |
| LOW | core/filters/__init__.py | 4 | CODE | |
| LOW | core/harvesters/__init__.py | 3 | CODE | |
| LOW | core/harvesters/__init__.py | 3 | CODE | |
| LOW | core/harvesters/__init__.py | 4 | CODE | |
| LOW | core/harvesters/__init__.py | 5 | CODE | |
| LOW | core/harvesters/__init__.py | 6 | CODE | |
| LOW | core/harvesters/__init__.py | 7 | CODE | |
| LOW | core/matrix/__init__.py | 3 | CODE | |
| LOW | core/matrix/__init__.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | core/validator.py | 255 | pos += 5 # skip null, type, class | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 18 | ### Step 1: Copy a subscription link | COMMENT |
| LOW | README.md | 31 | ### Step 2: Download a client app | COMMENT |
| LOW | README.md | 43 | ### Step 3: Paste and connect | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .pre-commit-config.yaml | 41 | # hooks: | COMMENT |