Repository Analysis

soxoj/maigret

🕵️‍♂️ Collect a dossier on a person by username from 3000+ sites

17.9 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of soxoj/maigret, a Python project with 37,126 GitHub stars. SynthScan v2.0 examined 32,645 lines of code across 106 source files, recording 538 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 17.9 places this repository in the Moderate AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

17.9
Adjusted Score
17.9
Raw Score
100%
Time Factor
2026-08-28
Last Push
37.1K
Stars
Python
Language
32.6K
Lines of Code
106
Files
538
Pattern Hits
2026-08-29
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 0MEDIUM 23LOW 515

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 538 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers376 hits · 374 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py82 def generate_additional_fields_dialog(self, engine: MaigretEngine, dialog):CODE
LOWmaigret/submit.py159 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.py133def build_cloudflare_bypass_config(CODE
LOWmaigret/sites.py124 def __is_equal_by_url_or_name(self, url_or_name_str: str):CODE
LOWmaigret/report.py53def sort_report_by_data_points(results):CODE
LOWmaigret/report.py99def _is_safe_report_image_url(uri) -> bool:CODE
LOWmaigret/report.py140def _pdf_report_link_callback(uri, rel):CODE
LOWmaigret/web/app.py273async def search_multiple_usernames(usernames, options):CODE
LOWmaigret/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.py47def test_pow_challenge_pages_are_bot_protection():CODE
LOWtests/test_workflows.py62def test_dev_build_is_a_prerelease(release_step):CODE
LOWtests/test_workflows.py68def test_dev_build_never_claims_the_latest_marker(release_step):CODE
LOWtests/test_workflows.py72def test_release_tag_does_not_shadow_a_branch(workflow, release_step):CODE
LOWtests/test_workflows.py83def test_release_tag_is_moved_to_the_built_commit(workflow, release_step):CODE
LOWtests/test_utils.py19def test_case_convert_camel_to_snake():CODE
LOWtests/test_utils.py26def test_case_convert_snake_to_camel():CODE
LOWtests/test_utils.py33def test_case_convert_snake_to_title():CODE
LOWtests/test_utils.py40def test_case_convert_camel_with_digits_to_snake():CODE
LOWtests/test_utils.py57def test_is_country_tag_field_names_are_not_country_codes():CODE
LOWtests/test_utils.py81def test_enrich_link_str_escapes_payload():CODE
LOWtests/test_utils.py93def test_enrich_link_str_non_link_is_plain_str():CODE
LOWtests/test_utils.py102def test_url_extract_main_part_negative():CODE
LOWtests/test_utils.py107def test_url_extract_main_part():CODE
LOWtests/test_utils.py126def test_url_extract_main_part_keeps_host_starting_with_prefix_letters():CODE
LOWtests/test_utils.py137def test_url_make_profile_url_regexp():CODE
LOWtests/test_utils.py204def test_is_plausible_username_accepts_bare_usernames():CODE
LOWtests/test_utils.py211def test_is_plausible_username_rejects_urls():CODE
LOWtests/test_utils.py218def test_is_plausible_username_accepts_http_prefixed_handles():CODE
LOWtests/test_utils.py226def test_is_plausible_username_rejects_path_like():CODE
LOWtests/test_utils.py231def test_is_plausible_username_rejects_emails():CODE
LOWtests/test_utils.py236def test_is_plausible_username_rejects_whitespace_and_empty():CODE
LOWtests/test_utils.py243def test_is_plausible_username_rejects_non_strings():CODE
LOWtests/test_utils.py249def test_get_dict_ascii_tree_new_line_false_strips_leading_newline():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.py37def test_load_empty_db_from_str():CODE
LOWtests/test_sites.py67def test_site_correct_initialization():CODE
LOWtests/test_sites.py80def test_site_strip_engine_data():CODE
LOWtests/test_sites.py90def test_site_strip_engine_data_with_site_prior_updates():CODE
LOWtests/test_sites.py118def test_update_from_engine_warns_on_conflicting_dict_entries(caplog):CODE
LOWtests/test_sites.py171def test_extract_id_from_url_skips_none_groups():CODE
LOWtests/test_sites.py214def test_ranked_sites_dict_names():CODE
LOWtests/test_sites.py225def test_ranked_sites_dict_disabled():CODE
LOWtests/test_sites.py234def test_ranked_sites_dict_id_type():CODE
LOWtests/test_sites.py245def test_ranked_sites_dict_excluded_tags():CODE
LOWtests/test_sites.py274def test_ranked_sites_dict_tag_filter_is_case_insensitive():CODE
LOWtests/test_sites.py287def test_ranked_sites_dict_excluded_tags_with_top():CODE
LOWtests/test_sites.py320def test_ranked_sites_dict_mirrors_disabled_parent():CODE
LOWtests/test_sites.py350def test_ranked_sites_dict_mirrors_no_extra_without_parent_in_top():CODE
LOWtests/test_sites.py386def test_update_site_replaces_existing_entry():CODE
LOWtests/test_sites.py399def test_update_site_appends_when_name_not_found():CODE
LOWtests/test_sites.py410def test_has_site_url_or_name(default_db):CODE
LOWtests/test_checking.py200def test_parse_usernames_single_username():CODE
LOWtests/test_checking.py206def test_parse_usernames_list_of_usernames():CODE
LOWtests/test_checking.py212def test_parse_usernames_malformed_list():CODE
LOWtests/test_checking.py220def test_parse_usernames_rejects_url_value():CODE
316 more matches not shown…
Excessive Try-Catch Wrapping59 hits · 63 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py204 except Exception as e:CODE
LOWmaigret/ai.py153 except Exception:CODE
MEDIUMmaigret/checking.py1726def extract_ids_data(html_text, logger, site) -> Dict:CODE
LOWmaigret/checking.py317 except Exception as e:CODE
LOWmaigret/checking.py396 except Exception as e:CODE
LOWmaigret/checking.py485 except Exception as e:CODE
LOWmaigret/checking.py656 except Exception as e:CODE
LOWmaigret/checking.py710 except Exception as e:CODE
LOWmaigret/checking.py1144 except Exception as e:CODE
LOWmaigret/checking.py1605 except Exception as e:CODE
LOWmaigret/checking.py1674 except Exception as e:CODE
LOWmaigret/checking.py1729 except Exception as e:CODE
LOWmaigret/checking.py1761 except Exception as e:CODE
LOWmaigret/checking.py1894 except Exception as e:CODE
LOWmaigret/checking.py1923 except Exception as e:CODE
LOWmaigret/executors.py70 except Exception as e:CODE
LOWmaigret/db_updater.py105 except Exception:CODE
LOWmaigret/db_updater.py148 except Exception:CODE
MEDIUMmaigret/db_updater.py66def _load_state() -> dict:CODE
LOWmaigret/utils.py193 except Exception as e:CODE
LOWmaigret/sites.py539 except Exception as error:CODE
LOWmaigret/sites.py563 except Exception as error:CODE
LOWmaigret/sites.py573 except Exception as error:CODE
LOWmaigret/sites.py589 except Exception as error:CODE
LOWmaigret/settings.py79 except Exception as error:CODE
LOWmaigret/maigret.py74 except Exception as e:CODE
LOWmaigret/maigret.py712 except Exception as e:CODE
LOWmaigret/maigret.py1136 except Exception as e:CODE
LOWmaigret/report.py273 except Exception as e:CODE
LOWmaigret/report.py634 except Exception as e:CODE
LOWmaigret/report.py660 except Exception as e:CODE
LOWmaigret/web/app.py268 except Exception as e:CODE
LOWmaigret/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.py1173 except Exception:CODE
LOWtests/test_checking.py1195 except Exception:CODE
LOWtests/test_checking.py1258 except Exception:CODE
LOWtests/test_checking.py1283 except Exception:CODE
LOWtests/test_submit.py506 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.py88 except Exception as e:CODE
LOWutils/update_site_data.py100 except Exception:CODE
LOWutils/update_site_data.py278 except Exception as e:STRING
MEDIUMutils/update_site_data.py94def 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.py1124# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py1130# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py1206# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py1211# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_idempotent_writes.py24# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_idempotent_writes.py26# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_idempotent_writes.py185# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_idempotent_writes.py187# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_keyword_filtering.py133# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_keyword_filtering.py136# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/test_maigret.py249# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_maigret.py259# -----------------------------------------------------------------------------COMMENT
Unused Imports36 hits · 34 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.py5CODE
LOWtests/test_db_updater.py7CODE
LOWtests/test_db_updater.py9CODE
LOWtests/test_db_updater.py11CODE
LOWtests/test_db_updater.py11CODE
LOWtests/test_db_updater.py11CODE
LOWtests/test_web.py13CODE
LOWtests/test_cloudflare_webgate.py3CODE
LOWtests/test_cli.py3CODE
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.py94CODE
LOWmaigret/notify.py162CODE
LOWmaigret/checking.py750CODE
LOWmaigret/checking.py921CODE
LOWmaigret/checking.py1451CODE
LOWmaigret/checking.py1621CODE
LOWmaigret/checking.py1747CODE
LOWmaigret/checking.py1902CODE
LOWmaigret/checking.py428CODE
LOWmaigret/utils.py163CODE
LOWmaigret/sites.py275CODE
LOWmaigret/sites.py302CODE
LOWmaigret/sites.py621CODE
LOWmaigret/maigret.py589CODE
LOWmaigret/permutator.py10CODE
LOWmaigret/report.py206CODE
LOWmaigret/report.py424CODE
LOWmaigret/report.py589CODE
LOWmaigret/report.py871CODE
LOWmaigret/report.py939CODE
LOWmaigret/report.py252CODE
LOWtests/test_data.py84CODE
LOWutils/check_top_n.py132CODE
LOWutils/update_site_data.py158CODE
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.py241 # Initialize necessary objectsCOMMENT
MEDIUMtests/test_submit.py293 # Initialize necessary objectsCOMMENT
MEDIUMtests/test_submit.py351 # Initialize necessary objectsCOMMENT
MEDIUMutils/site_check.py194 # Create a simple notifierCOMMENT
Redundant / Tautological Comments6 hits · 9 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py456 # 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.py243 # 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 Block7 hits · 7 pts
SeverityFileLineSnippetContext
LOWmaigret/checking.py61COMMENT
LOWmaigret/checking.py241 if payload and method.lower() == 'post':COMMENT
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.py1206CODE
LOWmaigret/checking.py1451CODE
LOWmaigret/checking.py1621CODE
LOWmaigret/utils.py26CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/test_checking.py215 # 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