AI Slop Code RIsk Monitor

soxoj/maigret

🕵️‍♂️ Collect a dossier on a person by username from 6K websites

22.5 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for soxoj/maigret, a Python project with 38,715 GitHub stars. SynthScan examined 31,841 lines of code across 108 source files, recording 613 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 22.5 (Elevated 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.

22.5
Adjusted Signal
22.5
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
38.7K
Stars
Python
Language
31.8K
Lines of Code
108
Files
613
Pattern Hits
2026-10-12
Scan Date
0.16
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 53.7/100 · HIGH

Can maintainers explain intent, assumptions, and trade-offs? 489 finding(s).

Hallucinated Dependency & Supply Chain Risk 4.8/100 · LOW

Are imports declared and package/API names verified? 34 finding(s).

Agent Over-Engineering Ratio 62.4/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 530 finding(s).

PR Review Velocity Impact 68.9/100 · HIGH

Which changes need focused human review? 613 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 17MEDIUM 23LOW 573

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 613 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.

Hyper-Verbose Identifiers435 hits · 424 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py83 def generate_additional_fields_dialog(self, engine: MaigretEngine, dialog):CODE
LOWmaigret/submit.py160 async def get_html_response_to_compare(CODE
LOWmaigret/notify.py58 def make_colored_terminal_notify(CODE
LOWmaigret/notify.py68 def make_simple_terminal_notify(CODE
LOWmaigret/checking.py138def build_cloudflare_bypass_config(CODE
LOWmaigret/sites.py164 def __is_equal_by_url_or_name(self, url_or_name_str: str):CODE
LOWmaigret/report.py54def sort_report_by_data_points(results):CODE
LOWmaigret/report.py100def _is_safe_report_image_url(uri) -> bool:CODE
LOWmaigret/report.py141def _pdf_report_link_callback(uri, rel):CODE
LOW⚡maigret/web/app.py273async def search_multiple_usernames(usernames, options):CODE
LOW⚡maigret/web/app.py284def sanitize_username_for_path(username: str) -> str:CODE
LOWpyinstaller/maigret_standalone.py20def _launched_by_double_click() -> bool:STRING
LOWtests/test_error_detection.py43def test_pow_challenge_pages_are_bot_protection():CODE
LOWtests/test_error_detection.py70def test_google_recaptcha_interstitial_is_a_captcha():CODE
LOWtests/test_error_detection.py82def test_page_embedding_a_recaptcha_widget_is_not_an_error():CODE
LOW⚡tests/test_workflows.py90def test_dev_build_is_a_prerelease(release_step):CODE
LOW⚡tests/test_workflows.py96def test_dev_build_never_claims_the_latest_marker(release_step):CODE
LOW⚡tests/test_workflows.py100def test_release_tag_does_not_shadow_a_branch(workflow, release_step):CODE
LOWtests/test_workflows.py111def test_release_tag_is_moved_to_the_built_commit(workflow, release_step):CODE
LOWtests/test_workflows.py127def test_every_release_step_is_guarded_by_event(workflow):CODE
LOWtests/test_workflows.py137def test_published_release_keeps_the_metadata_it_was_given(published_release_step):CODE
LOWtests/test_workflows.py153def test_published_release_targets_the_published_tag(published_release_step):CODE
LOW⚡tests/test_utils.py21def test_case_convert_camel_to_snake():CODE
LOW⚡tests/test_utils.py28def test_case_convert_snake_to_camel():CODE
LOW⚡tests/test_utils.py35def test_case_convert_snake_to_title():CODE
LOW⚡tests/test_utils.py42def test_case_convert_camel_with_digits_to_snake():CODE
LOW⚡tests/test_utils.py95def test_enrich_link_str_non_link_is_plain_str():CODE
LOW⚡tests/test_utils.py104def test_url_extract_main_part_negative():CODE
LOW⚡tests/test_utils.py109def test_url_extract_main_part():CODE
LOW⚡tests/test_utils.py210def test_is_plausible_username_accepts_bare_usernames():CODE
LOW⚡tests/test_utils.py217def test_is_plausible_username_rejects_urls():CODE
LOW⚡tests/test_utils.py224def test_is_plausible_username_accepts_http_prefixed_handles():CODE
LOW⚡tests/test_utils.py232def test_is_plausible_username_rejects_path_like():CODE
LOW⚡tests/test_utils.py237def test_is_plausible_username_rejects_emails():CODE
LOW⚡tests/test_utils.py242def test_is_plausible_username_rejects_whitespace_and_empty():CODE
LOW⚡tests/test_utils.py249def test_is_plausible_username_rejects_non_strings():CODE
LOW⚡tests/test_utils.py255def test_get_dict_ascii_tree_new_line_false_strips_leading_newline():CODE
LOW⚡tests/test_utils.py295def test_read_input_file_keeps_values_with_colons(tmp_path):CODE
LOW⚡tests/test_utils.py305def test_read_input_file_warns_on_a_misspelled_id_type(tmp_path, capsys):CODE
LOW⚡tests/test_utils.py313def test_read_input_file_stdin(monkeypatch):CODE
LOWtests/test_utils.py59def test_is_country_tag_field_names_are_not_country_codes():CODE
LOWtests/test_utils.py83def test_enrich_link_str_escapes_payload():CODE
LOWtests/test_utils.py128def test_url_extract_main_part_keeps_host_starting_with_prefix_letters():CODE
LOWtests/test_utils.py139def test_url_make_profile_url_regexp():CODE
LOWtests/test_utils.py196def test_get_dict_ascii_tree_handles_non_string_values():CODE
LOWtests/test_utils.py284def test_read_input_file_with_id_types(tmp_path):CODE
LOWtests/conftest.py48def pytest_collection_modifyitems(items):CODE
LOWtests/conftest.py52def get_test_reports_filenames():CODE
LOWtests/conftest.py100def httpserver_listen_address():CODE
LOWtests/test_sites.py38def test_load_empty_db_from_str():CODE
LOWtests/test_sites.py68def test_site_correct_initialization():CODE
LOWtests/test_sites.py81def test_site_stats_are_instance_local():CODE
LOWtests/test_sites.py91def test_site_default_check_type_and_engine_precedence():CODE
LOWtests/test_sites.py112def test_site_strip_engine_data():CODE
LOWtests/test_sites.py122def test_saving_database_preserves_site_url_detector(tmp_path):CODE
LOWtests/test_sites.py135def test_site_strip_engine_data_with_site_prior_updates():CODE
LOWtests/test_sites.py163def test_site_scalar_field_wins_over_engine(caplog):CODE
LOWtests/test_sites.py198def test_strip_engine_data_keeps_site_override():CODE
LOWtests/test_sites.py227def test_constructor_defaults_do_not_count_as_site_overrides(caplog):CODE
LOWtests/test_sites.py247def test_update_from_engine_warns_on_conflicting_dict_entries(caplog):CODE
375 more matches not shown…
Empty Error Handlers17 hits · 85 pts
SeverityFileLineSnippetContext
HIGHmaigret/checking.py399except aiodns.error.DNSError:CODE
HIGHmaigret/executors.py97except asyncio.TimeoutError:CODE
HIGHmaigret/db_updater.py128except Exception:CODE
HIGHmaigret/db_updater.py183except OSError:CODE
HIGHmaigret/db_updater.py195except (json.JSONDecodeError, OSError):CODE
HIGHmaigret/db_updater.py84except OSError:CODE
HIGHmaigret/settings.py76except FileNotFoundError:CODE
HIGHmaigret/report.py994except FileNotFoundError:CODE
HIGHpyinstaller/maigret_standalone.py41except EOFError:CODE
HIGHtests/test_checking.py1180except Exception:CODE
HIGHtests/test_checking.py1202except Exception:CODE
HIGHtests/test_checking.py1265except Exception:CODE
HIGHtests/test_checking.py1290except Exception:CODE
HIGHtests/test_submit.py541except Exception:CODE
HIGHutils/site_check.py47except ImportError:CODE
HIGHutils/site_check.py650except Exception:CODE
HIGHutils/import_sites.py279except asyncio.exceptions.TimeoutError:CODE
Excessive Try-Catch Wrapping59 hits · 63 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py205 except Exception as e:CODE
LOWmaigret/ai.py193 except Exception:CODE
MEDIUMmaigret/checking.py1740def extract_ids_data(html_text, logger, site) -> Dict:CODE
LOWmaigret/checking.py322 except Exception as e:CODE
LOWmaigret/checking.py401 except Exception as e:CODE
LOWmaigret/checking.py490 except Exception as e:CODE
LOWmaigret/checking.py661 except Exception as e:CODE
LOWmaigret/checking.py715 except Exception as e:CODE
LOWmaigret/checking.py1152 except Exception as e:CODE
LOWmaigret/checking.py1615 except Exception as e:CODE
LOWmaigret/checking.py1688 except Exception as e:CODE
LOWmaigret/checking.py1743 except Exception as e:CODE
LOWmaigret/checking.py1775 except Exception as e:CODE
LOWmaigret/checking.py1908 except Exception as e:CODE
LOWmaigret/checking.py1937 except Exception as e:CODE
LOWmaigret/executors.py70 except Exception as e:CODE
LOWmaigret/db_updater.py128 except Exception:CODE
LOWmaigret/db_updater.py176 except Exception:CODE
MEDIUMmaigret/db_updater.py66def _load_state() -> dict:CODE
LOWmaigret/utils.py238 except Exception as e:CODE
LOWmaigret/sites.py597 except Exception as error:CODE
LOWmaigret/sites.py627 except Exception as error:CODE
LOWmaigret/sites.py637 except Exception as error:CODE
LOWmaigret/sites.py653 except Exception as error:CODE
LOWmaigret/settings.py79 except Exception as error:CODE
LOWmaigret/maigret.py74 except Exception as e:CODE
LOWmaigret/maigret.py735 except Exception as e:CODE
LOWmaigret/maigret.py1178 except Exception as e:CODE
LOWmaigret/report.py324 except Exception as e:CODE
LOWmaigret/report.py709 except Exception as e:CODE
LOWmaigret/report.py735 except Exception as e:CODE
LOW⚡maigret/web/app.py268 except Exception as e:CODE
LOW⚡maigret/web/app.py279 except Exception as e:CODE
LOWmaigret/web/app.py392 except Exception as e:CODE
LOWmaigret/web/app.py452 except Exception as e:CODE
LOWmaigret/web/app.py470 except Exception as e:CODE
LOWmaigret/web/app.py483 except Exception as e:CODE
LOWmaigret/web/app.py697 except Exception as e:CODE
MEDIUMmaigret/web/app.py167def parse_settings_form(form):CODE
LOWpyinstaller/maigret_standalone.py34 except Exception:STRING
LOWtests/test_checking.py1180 except Exception:CODE
LOWtests/test_checking.py1202 except Exception:CODE
LOWtests/test_checking.py1265 except Exception:CODE
LOWtests/test_checking.py1290 except Exception:CODE
LOWtests/test_submit.py541 except Exception:CODE
LOWtests/test_data.py93 except Exception:CODE
LOWutils/check_top_n.py115 except Exception as e:CODE
LOWutils/check_top_n.py125 except Exception as e:CODE
LOWutils/check_top_n.py176 except Exception as e:CODE
LOWutils/update_site_data.py109 except Exception as e:CODE
LOWutils/update_site_data.py121 except Exception:CODE
LOWutils/update_site_data.py309 except Exception as e:STRING
MEDIUMutils/update_site_data.py115def get_base_domain(url):CODE
LOWutils/site_check.py148 except Exception as e:CODE
LOWutils/site_check.py158 except Exception as e:CODE
LOWutils/site_check.py219 except Exception as e:CODE
LOWutils/site_check.py650 except Exception:CODE
LOWutils/import_sites.py87 except Exception as e:CODE
MEDIUMutils/import_sites.py254 # print(f'Error: {str(e)}')COMMENT
Decorative Section Separators12 hits · 45 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_checking.py1131# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py1137# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py1213# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py1218# -----------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_idempotent_writes.py24# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_idempotent_writes.py26# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_idempotent_writes.py185# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_idempotent_writes.py187# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_keyword_filtering.py133# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_keyword_filtering.py136# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_maigret.py249# -----------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_maigret.py259# -----------------------------------------------------------------------------COMMENT
Unused Imports34 hits · 31 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py6CODE
LOWmaigret/submit.py13CODE
LOWmaigret/__init__.py9CODE
LOWmaigret/__init__.py22CODE
LOWmaigret/__init__.py23CODE
LOWmaigret/__init__.py23CODE
LOWmaigret/__init__.py23CODE
LOWmaigret/__init__.py24CODE
LOWmaigret/__init__.py11CODE
LOWmaigret/result.py11CODE
LOWmaigret/result.py12CODE
LOWmaigret/maigret.py10CODE
LOWmaigret/maigret.py60CODE
LOWtests/test_permutator.py1CODE
LOWtests/test_db_updater.py4CODE
LOWtests/test_db_updater.py9CODE
LOWtests/test_db_updater.py12CODE
LOWtests/test_db_updater.py12CODE
LOWtests/test_db_updater.py12CODE
LOWtests/test_web.py13CODE
LOWtests/test_cloudflare_webgate.py3CODE
LOWtests/test_cli.py6CODE
LOWtests/test_maigret.py17CODE
LOWutils/fp_probe_top_sites.py12CODE
LOWutils/update_site_data.py14CODE
LOWutils/site_check.py22CODE
LOWutils/site_check.py22CODE
LOWutils/site_check.py37CODE
LOWutils/site_check.py38CODE
LOWutils/site_check.py38CODE
LOWutils/site_check.py38CODE
LOWutils/site_check.py44CODE
LOWutils/site_check.py45CODE
LOWutils/import_sites.py11CODE
Deep Nesting28 hits · 26 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py95CODE
LOWmaigret/notify.py162CODE
LOWmaigret/checking.py755CODE
LOWmaigret/checking.py926CODE
LOWmaigret/checking.py1459CODE
LOWmaigret/checking.py1631CODE
LOWmaigret/checking.py1761CODE
LOWmaigret/checking.py1916CODE
LOWmaigret/checking.py433CODE
LOWmaigret/utils.py208CODE
LOWmaigret/sites.py315CODE
LOWmaigret/sites.py356CODE
LOWmaigret/sites.py685CODE
LOWmaigret/maigret.py597CODE
LOWmaigret/permutator.py10CODE
LOWmaigret/report.py259CODE
LOWmaigret/report.py499CODE
LOWmaigret/report.py664CODE
LOWmaigret/report.py946CODE
LOWmaigret/report.py1018CODE
LOWmaigret/report.py303CODE
LOWtests/test_data.py84CODE
LOWutils/check_top_n.py132CODE
LOWutils/update_site_data.py179CODE
LOWutils/site_check.py417CODE
LOWutils/site_check.py656CODE
LOWutils/selfcheck_triage.py28CODE
LOWutils/selfcheck_triage.py50CODE
Self-Referential Comments6 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_submit.py24 # Create the Submitter instanceCOMMENT
MEDIUMtests/test_submit.py48 # Create the Submitter instance without enginesCOMMENT
MEDIUMtests/test_submit.py276 # Initialize necessary objectsCOMMENT
MEDIUMtests/test_submit.py328 # Initialize necessary objectsCOMMENT
MEDIUMtests/test_submit.py386 # Initialize necessary objectsCOMMENT
MEDIUMutils/site_check.py194 # Create a simple notifierCOMMENT
Redundant / Tautological Comments6 hits · 9 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py457 # Check if the site check is ordinary or notCOMMENT
LOWmaigret/notify.py191 # Check if this is a keyword matchCOMMENT
LOWmaigret/executors.py79 # Add tasks to the queueCOMMENT
LOWmaigret/db_updater.py272 # Check if update availableCOMMENT
LOWmaigret/web/app.py642 # Check if job is completedCOMMENT
LOWutils/check_top_n.py247 # Check if status_code would workCOMMENT
Over-Commented Block8 hits · 8 pts
SeverityFileLineSnippetContext
LOWmaigret/checking.py61COMMENT
LOWmaigret/checking.py261 # new exit node. A generic ProxyError (e.g. bad credentials) isCOMMENT
LOWmaigret/checking.py1381 # ctrl_c=False is critical: alive_progress's default Ctrl+C handlerCOMMENT
LOWmaigret/executors.py41 # Deliberately asyncio.wait(), not wait_for(): wait_for'sCOMMENT
LOWtests/test_maigret.py241COMMENT
LOWdocs/source/_static/maigret_search_help.js1// Show a helper when a docs search returns zero results.COMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml41 - name: Initialize CodeQLCOMMENT
AI Structural Patterns5 hits · 4 pts
SeverityFileLineSnippetContext
LOWmaigret/notify.py267CODE
LOWmaigret/checking.py1214CODE
LOWmaigret/checking.py1459CODE
LOWmaigret/checking.py1631CODE
LOWmaigret/utils.py71CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_checking.py222 # should swallow the error and just return emptyCOMMENT
Modern Structural Boilerplate2 hits · 2 pts
SeverityFileLineSnippetContext
LOWmaigret/sites.py12logger = logging.getLogger(__name__)CODE
LOWtests/test_executors.py10logger = logging.getLogger(__name__)CODE