Repository Analysis

soxoj/maigret

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

17.6 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of soxoj/maigret, a Python project with 35,349 GitHub stars. SynthScan v2.0 examined 28,137 lines of code across 100 source files, recording 420 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 17.6 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.6
Adjusted Score
17.6
Raw Score
100%
Time Factor
2026-07-14
Last Push
35.3K
Stars
Python
Language
28.1K
Lines of Code
100
Files
420
Pattern Hits
2026-07-14
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 25LOW 395

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 420 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 Identifiers269 hits · 294 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py75 def generate_additional_fields_dialog(self, engine: MaigretEngine, dialog):CODE
LOWmaigret/submit.py152 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.py77def build_cloudflare_bypass_config(CODE
LOWmaigret/sites.py122 def __is_equal_by_url_or_name(self, url_or_name_str: str):CODE
LOWmaigret/report.py47def sort_report_by_data_points(results):CODE
LOWmaigret/web/app.py106async def search_multiple_usernames(usernames, options):CODE
LOWmaigret/web/app.py117def sanitize_username_for_path(username: str) -> str:CODE
LOWpyinstaller/maigret_standalone.py20def _launched_by_double_click() -> bool:STRING
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.py168def test_parse_usernames_single_username():CODE
LOWtests/test_checking.py174def test_parse_usernames_list_of_usernames():CODE
LOWtests/test_checking.py180def test_parse_usernames_malformed_list():CODE
LOWtests/test_checking.py188def test_parse_usernames_rejects_url_value():CODE
LOWtests/test_checking.py198def test_parse_usernames_rejects_email_value():CODE
LOWtests/test_checking.py206def test_parse_usernames_filters_urls_inside_list():CODE
LOWtests/test_checking.py215def test_parse_usernames_supported_id():CODE
LOWtests/test_checking.py225def test_update_results_info_links():CODE
LOWtests/test_checking.py237def test_update_results_info_no_website():CODE
LOWtests/test_checking.py243def test_extract_ids_data_bad_html_returns_empty():CODE
LOWtests/test_checking.py250def test_get_failed_sites_filters_permanent_errors():CODE
209 more matches not shown…
Excessive Try-Catch Wrapping55 hits · 61 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py195 except Exception as e:CODE
LOWmaigret/ai.py153 except Exception:CODE
MEDIUMmaigret/checking.py165def _make_request(CODE
MEDIUMmaigret/checking.py323def check(self) -> Tuple[Optional[str], int, Optional[CheckError]]:CODE
MEDIUMmaigret/checking.py1570def extract_ids_data(html_text, logger, site) -> Dict:CODE
LOWmaigret/checking.py214 except Exception as e:CODE
LOWmaigret/checking.py293 except Exception as e:CODE
LOWmaigret/checking.py364 except Exception as e:CODE
LOWmaigret/checking.py534 except Exception as e:CODE
LOWmaigret/checking.py588 except Exception as e:CODE
LOWmaigret/checking.py1009 except Exception as e:CODE
LOWmaigret/checking.py1449 except Exception as e:CODE
LOWmaigret/checking.py1518 except Exception as e:CODE
LOWmaigret/checking.py1573 except Exception as e:CODE
LOWmaigret/checking.py1599 except Exception as e:CODE
LOWmaigret/executors.py33 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.py537 except Exception as error:CODE
LOWmaigret/sites.py561 except Exception as error:CODE
LOWmaigret/sites.py571 except Exception as error:CODE
LOWmaigret/sites.py587 except Exception as error:CODE
LOWmaigret/settings.py75 except Exception as error:CODE
LOWmaigret/maigret.py73 except Exception as e:CODE
LOWmaigret/maigret.py676 except Exception as e:CODE
LOWmaigret/maigret.py1092 except Exception as e:CODE
LOWmaigret/report.py202 except Exception as e:CODE
LOWmaigret/report.py550 except Exception as e:CODE
LOWmaigret/report.py576 except Exception as e:CODE
LOWmaigret/web/app.py101 except Exception as e:CODE
LOWmaigret/web/app.py112 except Exception as e:CODE
LOWmaigret/web/app.py215 except Exception as e:CODE
LOWmaigret/web/app.py361 except Exception as e:CODE
MEDIUMmaigret/web/app.py127def process_search_task(usernames, options, timestamp):CODE
LOWpyinstaller/maigret_standalone.py34 except Exception:STRING
LOWtests/test_checking.py955 except Exception:CODE
LOWtests/test_checking.py977 except Exception:CODE
LOWtests/test_checking.py1040 except Exception:CODE
LOWtests/test_checking.py1065 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.py906# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py912# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py988# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_checking.py993# -----------------------------------------------------------------------------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.py247# -----------------------------------------------------------------------------COMMENT
MEDIUMtests/test_maigret.py257# -----------------------------------------------------------------------------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.py59CODE
LOWmaigret/web/app.py1CODE
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_cloudflare_webgate.py3CODE
LOWtests/test_cli.py3CODE
LOWtests/test_maigret.py15CODE
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 Nesting24 hits · 22 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py87CODE
LOWmaigret/notify.py153CODE
LOWmaigret/checking.py628CODE
LOWmaigret/checking.py787CODE
LOWmaigret/checking.py1295CODE
LOWmaigret/checking.py1465CODE
LOWmaigret/checking.py1578CODE
LOWmaigret/checking.py165CODE
LOWmaigret/utils.py163CODE
LOWmaigret/sites.py273CODE
LOWmaigret/sites.py300CODE
LOWmaigret/sites.py619CODE
LOWmaigret/permutator.py10CODE
LOWmaigret/report.py135CODE
LOWmaigret/report.py342CODE
LOWmaigret/report.py505CODE
LOWmaigret/report.py752CODE
LOWmaigret/report.py181CODE
LOWmaigret/web/app.py127CODE
LOWtests/test_data.py84CODE
LOWutils/check_top_n.py132CODE
LOWutils/update_site_data.py158CODE
LOWutils/site_check.py417CODE
LOWutils/site_check.py656CODE
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.py149 # Initialize necessary objectsCOMMENT
MEDIUMtests/test_submit.py197 # Initialize necessary objectsCOMMENT
MEDIUMtests/test_submit.py251 # Initialize necessary objectsCOMMENT
MEDIUMutils/site_check.py194 # Create a simple notifierCOMMENT
Redundant / Tautological Comments6 hits · 9 pts
SeverityFileLineSnippetContext
LOWmaigret/submit.py422 # Check if the site check is ordinary or notCOMMENT
LOWmaigret/notify.py178 # Check if this is a keyword matchCOMMENT
LOWmaigret/executors.py42 # Add tasks to the queueCOMMENT
LOWmaigret/db_updater.py243 # Check if update availableCOMMENT
LOWmaigret/web/app.py306 # Check if job is completedCOMMENT
LOWutils/check_top_n.py247 # Check if status_code would workCOMMENT
AI Structural Patterns5 hits · 4 pts
SeverityFileLineSnippetContext
LOWmaigret/notify.py254CODE
LOWmaigret/checking.py1056CODE
LOWmaigret/checking.py1295CODE
LOWmaigret/checking.py1465CODE
LOWmaigret/utils.py26CODE
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippetContext
LOWmaigret/checking.py1221 # silently absorbs the first SIGINT (it draws a "⚠" mark on the barCOMMENT
LOWtests/test_maigret.py241def test_extract_ids_from_results_empty_input_returns_empty(default_db):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 Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/test_checking.py183 # 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.py9logger = logging.getLogger(__name__)CODE