Primary Block Lists
This report summarizes scanner evidence for blocklistproject/Lists, a Python project with 5,177 GitHub stars. SynthScan examined 348,350 lines of code across 154 source files, recording 203 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 0.8 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 156 finding(s).
Are imports declared and package/API names verified? 8 finding(s).
Are wrappers, guards, and repeated structures necessary? 114 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 12 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 |
|---|---|---|---|---|
| LOW | process_maintenance.py | 50 | def find_lists_containing_domain(domain): | CODE |
| LOW | process_maintenance.py | 111 | def extract_domains_from_issue_body(body): | CODE |
| LOW | process_maintenance.py | 143 | def process_maintenance_issue(issue): | CODE |
| LOW | review_issues_batch.py | 215 | def issue_has_required_fields(issue: dict, field: str) -> bool: | CODE |
| LOW | IMPROVEMENT_PLAN.md | 1005 | def validate_domains_parallel(domains: set[str], max_workers: int = 10) -> dict: | CODE |
| LOW⚡ | IMPROVEMENT_PLAN.md | 1686 | def test_fetch_issues_handles_rate_limit(): | CODE |
| LOW⚡ | IMPROVEMENT_PLAN.md | 1690 | def test_review_issues_batch_validates_domains(): | CODE |
| LOW⚡ | IMPROVEMENT_PLAN.md | 1697 | def test_full_pipeline_with_sample_data(): | CODE |
| LOW⚡ | IMPROVEMENT_PLAN.md | 1706 | def test_find_domain_in_lists(): | CODE |
| LOW | tests/test_issue_reply.py | 4 | def test_build_llm_prompt_includes_issue_context(): | CODE |
| LOW | tests/test_issue_reply.py | 21 | def test_format_preview_mentions_closure_when_requested(): | CODE |
| LOW | tests/test_merge.py | 54 | def test_merges_multiple_sets(self): | CODE |
| LOW | tests/test_merge.py | 59 | def test_deduplicates_across_sets(self): | CODE |
| LOW | tests/test_merge.py | 80 | def test_removes_allowlisted_domains(self): | CODE |
| LOW | tests/test_merge.py | 100 | def test_allowlist_with_extra_domains(self): | CODE |
| LOW | tests/test_merge.py | 111 | def test_sorts_alphabetically(self): | CODE |
| LOW | tests/test_merge.py | 142 | def test_applies_allowlist_file(self): | CODE |
| LOW | tests/test_merge.py | 154 | def test_handles_missing_files(self): | CODE |
| LOW | tests/test_merge.py | 227 | def test_collapses_when_threshold_exceeded(self): | CODE |
| LOW | tests/test_merge.py | 241 | def test_keeps_below_threshold(self): | CODE |
| LOW | tests/test_remove_domain.py | 8 | def test_get_buildable_lists_skips_non_build_targets(self): | CODE |
| LOW | tests/test_config.py | 18 | def test_config_has_required_lists(self): | CODE |
| LOW | tests/test_config.py | 30 | def test_config_has_all_formats(self): | CODE |
| LOW | tests/test_config.py | 49 | def test_filter_by_stable_status(self): | CODE |
| LOW | tests/test_config.py | 59 | def test_filter_by_beta_status(self): | CODE |
| LOW | tests/test_validate.py | 46 | def test_valid_with_underscore_prefix(self): | CODE |
| LOW⚡ | tests/test_validate.py | 65 | def test_invalid_label_too_long(self): | CODE |
| LOW⚡ | tests/test_validate.py | 70 | def test_invalid_leading_hyphen(self): | CODE |
| LOW⚡ | tests/test_validate.py | 74 | def test_invalid_trailing_hyphen(self): | CODE |
| LOW | tests/test_validate.py | 189 | def test_critical_domain_blocked(self): | CODE |
| LOW | tests/test_validate.py | 195 | def test_false_positive_blocked(self): | CODE |
| LOW | tests/test_validate.py | 258 | def test_many_consecutive_digits(self): | CODE |
| LOW | tests/test_validate.py | 332 | def test_common_tlds_list_populated(self): | CODE |
| LOW | tests/test_validate.py | 338 | def test_critical_domains_list_populated(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 26 | def test_hosts_with_extra_spaces(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 35 | def test_adguard_with_subdomain(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 40 | def test_dnsmasq_server_format(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 44 | def test_dnsmasq_address_format(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 48 | def test_dnsmasq_address_with_hash(self): | CODE |
| LOW | tests/test_normalize.py | 62 | def test_lowercase_conversion(self): | CODE |
| LOW | tests/test_normalize.py | 91 | def test_mixed_format_content(self): | CODE |
| LOW | tests/test_normalize.py | 135 | def test_all_formats_produce_same_domains(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 169 | def test_detect_adguard_format(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 175 | def test_detect_dnsmasq_format(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 181 | def test_detect_domains_format(self): | CODE |
| LOW⚡ | tests/test_normalize.py | 191 | def test_extract_commented_domains(self): | CODE |
| LOW⚡ | tests/test_pipeline.py | 57 | def test_hosts_format_root_directory(self, sample_config): | CODE |
| LOW⚡ | tests/test_pipeline.py | 67 | def test_adguard_format_subdirectory(self, sample_config): | CODE |
| LOW⚡ | tests/test_pipeline.py | 77 | def test_domains_format_subdirectory(self, sample_config): | CODE |
| LOW⚡ | tests/test_pipeline.py | 87 | def test_dnsmasq_format_subdirectory(self, sample_config): | CODE |
| LOW | tests/test_pipeline.py | 101 | def test_build_from_hosts_file(self, sample_config): | CODE |
| LOW | tests/test_pipeline.py | 121 | def test_build_creates_all_formats(self, sample_config): | CODE |
| LOW | tests/test_pipeline.py | 164 | def test_build_with_validation(self, sample_config): | CODE |
| LOW | tests/test_pipeline.py | 189 | def test_build_applies_allowlist(self, sample_config): | CODE |
| LOW | tests/test_pipeline.py | 213 | def test_build_handles_missing_source(self, sample_config): | CODE |
| LOW | tests/test_pipeline.py | 231 | def test_run_pipeline_creates_config(self): | CODE |
| LOW | tests/test_pipeline.py | 268 | def test_run_pipeline_specific_lists(self): | STRING |
| LOW | tests/test_pipeline.py | 324 | def test_inconsistent_outputs(self): | CODE |
| LOW | tests/test_pipeline.py | 362 | def test_pipeline_result_fields(self): | CODE |
| LOW⚡ | tests/test_format.py | 138 | def test_selects_correct_formatter(self): | CODE |
| 15 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | drugs.txt | 1 | # Title: Drugs Block List | COMMENT |
| LOW | vaping.txt | 1 | # Title: Vaping Block List | COMMENT |
| LOW | adobe.txt | 1 | # Title: Adobe Block List | COMMENT |
| LOW | piracy.txt | 1 | # Title: Piracy Block List | COMMENT |
| LOW | ransomware.txt | 1 | # Title: Ransomware Block List | COMMENT |
| LOW | fortnite.txt | 1 | # Title: Fortnite Block List | COMMENT |
| LOW | whatsapp.txt | 1 | # Title: Whatsapp Block List | COMMENT |
| LOW | scam.txt | 1 | # Title: Scam Block List | COMMENT |
| LOW | facebook.txt | 1 | # Title: Facebook Block List | COMMENT |
| LOW | tiktok.txt | 1 | # Title: Tiktok Block List | COMMENT |
| LOW | twitter.txt | 1 | # Title: Twitter Block List | COMMENT |
| LOW | torrent.txt | 1 | # Title: Torrent Block List | COMMENT |
| LOW | smart-tv.txt | 1 | # Title: Smart-Tv Block List | COMMENT |
| LOW | config/upstream-sources-example.yml | 1 | # Example Upstream Source Configurations | COMMENT |
| LOW | config/upstream-sources-example.yml | 161 | trusted: true | COMMENT |
| LOW | config/upstream-sources-example.yml | 181 | # - hourly: Check every hour (use sparingly!) | COMMENT |
| LOW | config/upstream-sources-example.yml | 201 | # Example before: | COMMENT |
| LOW | config/upstream-sources-example.yml | 221 | # update_frequency: daily # <-- Added | COMMENT |
| LOW | dnsmasq-version/piracy-dnsmasq.txt | 1 | # Title: Piracy Block List | COMMENT |
| LOW | dnsmasq-version/smart-tv-dnsmasq.txt | 1 | # Title: Smart-Tv Block List | COMMENT |
| LOW | dnsmasq-version/scam-dnsmasq.txt | 1 | # Title: Scam Block List | COMMENT |
| LOW | dnsmasq-version/drugs-dnsmasq.txt | 1 | # Title: Drugs Block List | COMMENT |
| LOW | dnsmasq-version/facebook-dnsmasq.txt | 1 | # Title: Facebook Block List | COMMENT |
| LOW | dnsmasq-version/adobe-dnsmasq.txt | 1 | # Title: Adobe Block List | COMMENT |
| LOW | dnsmasq-version/crypto-dnsmasq.txt | 1 | # Title: Crypto Block List | COMMENT |
| LOW | dnsmasq-version/twitter-dnsmasq.txt | 1 | # Title: Twitter Block List | COMMENT |
| LOW | dnsmasq-version/tiktok-dnsmasq.txt | 1 | # Title: Tiktok Block List | COMMENT |
| LOW | dnsmasq-version/vaping-dnsmasq.txt | 1 | # Title: Vaping Block List | COMMENT |
| LOW | dnsmasq-version/whatsapp-dnsmasq.txt | 1 | # Title: Whatsapp Block List | COMMENT |
| LOW | dnsmasq-version/fortnite-dnsmasq.txt | 1 | # Title: Fortnite Block List | COMMENT |
| LOW | dnsmasq-version/torrent-dnsmasq.txt | 1 | # Title: Torrent Block List | COMMENT |
| LOW | dnsmasq-version/ransomware-dnsmasq.txt | 1 | # Title: Ransomware Block List | COMMENT |
| LOW | alt-version/youtube-nl.txt | 1 | # ------------------------------------[UPDATE]-------------------------------------- | COMMENT |
| LOW | alt-version/adobe-nl.txt | 1 | # Title: Adobe Block List | COMMENT |
| LOW | alt-version/vaping-nl.txt | 1 | # Title: Vaping Block List | COMMENT |
| LOW | alt-version/facebook-nl.txt | 1 | # Title: Facebook Block List | COMMENT |
| LOW | alt-version/smart-tv-nl.txt | 1 | # Title: Smart-Tv Block List | COMMENT |
| LOW | alt-version/ransomware-nl.txt | 1 | # Title: Ransomware Block List | COMMENT |
| LOW | alt-version/crypto-nl.txt | 1 | # Title: Crypto Block List | COMMENT |
| LOW | alt-version/scam-nl.txt | 1 | # Title: Scam Block List | COMMENT |
| LOW | alt-version/tiktok-nl.txt | 1 | # Title: Tiktok Block List | COMMENT |
| LOW | alt-version/torrent-nl.txt | 1 | # Title: Torrent Block List | COMMENT |
| LOW | alt-version/fortnite-nl.txt | 1 | # Title: Fortnite Block List | COMMENT |
| LOW | alt-version/whatsapp-nl.txt | 1 | # Title: Whatsapp Block List | COMMENT |
| LOW | alt-version/piracy-nl.txt | 1 | # Title: Piracy Block List | COMMENT |
| LOW | alt-version/drugs-nl.txt | 1 | # Title: Drugs Block List | COMMENT |
| LOW | alt-version/twitter-nl.txt | 1 | # Title: Twitter Block List | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | config/upstream-sources-example.yml | 34 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 36 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 115 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 117 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 149 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 151 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 165 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 167 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 190 | # ============================================================================= | COMMENT |
| MEDIUM | config/upstream-sources-example.yml | 192 | # ============================================================================= | COMMENT |
| MEDIUM | src/config.py | 9 | # ============================================================================ | COMMENT |
| MEDIUM | src/config.py | 11 | # ============================================================================ | COMMENT |
| MEDIUM | src/config.py | 29 | # ============================================================================ | COMMENT |
| MEDIUM | src/config.py | 31 | # ============================================================================ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | process_maintenance.py | 30 | except socket.gaierror: | CODE |
| HIGH | process_maintenance.py | 32 | except Exception: | CODE |
| HIGH | process_maintenance.py | 75 | except Exception: | CODE |
| HIGH | scripts/process_maintenance.py | 30 | except socket.gaierror: | CODE |
| HIGH | scripts/process_maintenance.py | 32 | except Exception: | CODE |
| HIGH | scripts/process_maintenance.py | 75 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | process_maintenance.py | 32 | except Exception: | CODE |
| LOW | process_maintenance.py | 46 | except Exception: | CODE |
| LOW | process_maintenance.py | 75 | except Exception: | CODE |
| LOW | review_issues_batch.py | 487 | except Exception as e: | CODE |
| LOW | IMPROVEMENT_PLAN.md | 598 | except Exception as e: | CODE |
| LOW | IMPROVEMENT_PLAN.md | 1023 | except Exception as e: | CODE |
| MEDIUM | scripts/process_batch.py | 31 | print(f"Error: {stderr}") | CODE |
| LOW | scripts/process_maintenance.py | 32 | except Exception: | CODE |
| LOW | scripts/process_maintenance.py | 46 | except Exception: | CODE |
| LOW | scripts/process_maintenance.py | 75 | except Exception: | CODE |
| LOW | scripts/review_issues_batch.py | 486 | except Exception as e: | CODE |
| LOW | scripts/fetch_issues.py | 38 | except Exception as e: | CODE |
| MEDIUM | scripts/fetch_issues.py | 39 | print(f'Error: {e}', file=sys.stderr) | CODE |
| LOW | scripts/check-dead-domains.py | 56 | except Exception as e: | CODE |
| LOW | .github/workflows/triage.yml | 145 | except Exception as e: | CODE |
| MEDIUM | .github/workflows/triage.yml | 146 | print(f"Error checking {txt_file}: {e}") | CODE |
| LOW | src/issue_reply.py | 88 | except Exception as exc: # pragma: no cover - network path | CODE |
| LOW | src/domain_lookup.py | 88 | except Exception as e: | CODE |
| LOW | src/pipeline.py | 229 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | process_maintenance.py | 50 | CODE | |
| LOW | process_maintenance.py | 143 | CODE | |
| LOW | scripts/aggregate.py | 7 | CODE | |
| LOW | scripts/process_maintenance.py | 50 | CODE | |
| LOW | scripts/process_maintenance.py | 143 | CODE | |
| LOW | scripts/generate-stats.py | 124 | CODE | |
| LOW | scripts/monitor_upstream.py | 319 | CODE | |
| LOW | scripts/monitor_upstream.py | 394 | CODE | |
| LOW | scripts/generate-changelog.py | 69 | CODE | |
| LOW | scripts/remove_domain.py | 205 | CODE | |
| LOW | scripts/remove_domain.py | 281 | CODE | |
| LOW | scripts/review_issues_batch.py | 63 | CODE | |
| LOW | scripts/review_issues_batch.py | 221 | CODE | |
| LOW | scripts/review_issues_batch.py | 331 | CODE | |
| LOW | scripts/review_issues_batch.py | 404 | CODE | |
| LOW | scripts/verify_format_sync.py | 87 | CODE | |
| LOW | scripts/check-dead-domains.py | 123 | CODE | |
| LOW | src/domain_lookup.py | 61 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build.py | 111 | # Display results | COMMENT |
| LOW | process_triage.sh | 16 | # Check if label exists by listing and matching the name exactly | COMMENT |
| LOW | scripts/monitor_upstream.py | 218 | # Check if any excluded domains are in new_domains that would be added | COMMENT |
| LOW | scripts/remove_domain.py | 305 | # Check if already in exclusions | COMMENT |
| LOW | scripts/verify_format_sync.py | 54 | # Check if all match | COMMENT |
| LOW | scripts/add_domain.py | 136 | # Check if already exists | COMMENT |
| LOW | .github/workflows/normalize-sync.yml | 51 | # Check if there are changes | COMMENT |
| LOW | src/format.py | 289 | # Check if it's in the root (no subdirectory) | COMMENT |
| LOW | src/validate.py | 189 | # Check if it's a subdomain of a critical domain | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/reply_to_issue.py | 10 | CODE | |
| LOW | scripts/remove_domain.py | 38 | CODE | |
| LOW | scripts/remove_domain.py | 45 | CODE | |
| LOW | scripts/remove_domain.py | 45 | CODE | |
| LOW | scripts/add_domain.py | 36 | CODE | |
| LOW | scripts/add_domain.py | 37 | CODE | |
| LOW | scripts/normalize_and_sync.py | 18 | CODE | |
| LOW | src/issue_reply.py | 3 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | UPSTREAM_IMPLEMENTATION_SUMMARY.md | 90 | ### Step 1: Add Upstream Sources to Your Configuration | COMMENT |
| LOW | UPSTREAM_IMPLEMENTATION_SUMMARY.md | 109 | ### Step 2: Add Global Settings | COMMENT |
| LOW | UPSTREAM_IMPLEMENTATION_SUMMARY.md | 125 | ### Step 3: Test Manually | COMMENT |
| LOW | UPSTREAM_IMPLEMENTATION_SUMMARY.md | 134 | ### Step 4: Enable Automation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/format.py | 208 | Format domains using the specified formatter. Args: domains: Iterable of domain strings format_name | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_validate.py | 114 | # This might fail if we have a comprehensive list | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 361 | │ └── pipeline.py # Build orchestration | CODE |