Repository Analysis

maurosoria/dirsearch

Web path scanner

11.1 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of maurosoria/dirsearch, a Python project with 14,492 GitHub stars. SynthScan v2.0 examined 38,860 lines of code across 205 source files, recording 365 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 11.1 places this repository in the Low 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).

11.1
Adjusted Score
11.1
Raw Score
100%
Time Factor
2026-07-01
Last Push
14.5K
Stars
Python
Language
38.9K
Lines of Code
205
Files
365
Pattern Hits
2026-07-14
Scan Date
0.02
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 5HIGH 0MEDIUM 4LOW 356

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 365 distinct pattern matches across 10 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 Identifiers152 hits · 175 pts
SeverityFileLineSnippetContext
LOWtests/test_optional_db_dependencies.py67 def test_core_imports_without_database_drivers(self):CODE
LOWtests/test_optional_db_dependencies.py73 def test_file_reports_import_without_database_drivers(self):CODE
LOWtests/test_optional_db_dependencies.py89 def test_mysql_report_fails_only_when_driver_is_used(self):CODE
LOWtests/test_optional_db_dependencies.py99 def test_postgresql_report_fails_only_when_driver_is_used(self):CODE
LOWtests/test_release_scripts.py46 def test_configure_threaded_stack(self):STRING
LOWtests/test_release_scripts.py53 def test_configure_async_stack(self):STRING
LOWtests/test_release_scripts.py60 def test_configure_native_rust_stack(self):STRING
LOWtests/test_native_install_packaging.py6 def test_entrypoints_include_native_builder(self):CODE
LOWtests/test_native_install_packaging.py16 def test_package_data_includes_native_sources(self):CODE
LOWtests/test_native_install_packaging.py22 def test_setup_uses_standard_package_dir_mapping(self):CODE
LOWtests/test_native_install_packaging.py31 def test_ntlm_auth_is_not_a_direct_dependency(self):CODE
LOWtests/test_native_install_packaging.py48 def test_install_docs_use_native_builder_flow(self):CODE
LOWtests/test_report_exception_handling.py13 def test_csv_report_rejects_wrong_header(self):CODE
LOWtests/test_report_exception_handling.py21 def test_file_report_validation_chains_parse_error(self):CODE
LOWtests/test_report_exception_handling.py31 def test_sqlite_report_rejects_non_sqlite_file(self):CODE
LOWtests/test_report_exception_handling.py41 def test_raw_request_malformed_input_preserves_invalid_request_type(self):CODE
LOWtests/core/test_importable_api.py87 def test_public_imports_are_available(self):CODE
LOWtests/core/test_importable_api.py106 def test_builtin_template_and_wordlist_limit(self):CODE
LOWtests/core/test_importable_api.py136 def test_python_api_runs_template_wordlist_and_callbacks(self):CODE
LOWtests/core/test_importable_api.py162 def test_result_predicate_filters_custom_matches(self):CODE
LOWtests/core/test_importable_api.py179 def test_session_factory_customizes_requests(self):CODE
LOWtests/core/test_importable_api.py199 def test_from_raw_request_runs_with_body_and_query(self):CODE
LOWtests/core/test_importable_api.py225 def test_from_raw_request_file_uses_absolute_form_target(self):CODE
LOWtests/core/test_importable_api.py246 def test_from_raw_request_requires_one_source(self):CODE
LOWtests/core/test_importable_api.py259 def test_raise_on_error_invokes_callback_then_raises(self):CODE
LOWtests/core/test_importable_api.py281 def test_two_configs_do_not_leak_state(self):CODE
LOWtests/core/test_options.py10 def test_response_size_options_accept_raw_bytes_and_units(self):CODE
LOWtests/core/test_options.py31 def test_response_size_options_accept_bytes_suffix(self):CODE
LOWtests/core/test_options.py52 def test_header_filter_options_are_parsed(self):CODE
LOWtests/core/test_options.py76 def test_invalid_header_regex_exits(self):CODE
LOWtests/core/test_native_builder.py13def create_native_source_tree(root: Path) -> Path:CODE
LOWtests/core/test_native_builder.py23 def test_native_sources_available_requires_all_files(self):CODE
LOWtests/core/test_native_builder.py33 def test_prerequisite_errors_report_missing_commands_and_headers(self):CODE
LOWtests/core/test_native_builder.py49 def test_prerequisite_errors_report_python_version(self):CODE
LOWtests/core/test_native_builder.py63 def test_install_hint_for_debian_like_systems(self):CODE
LOWtests/core/test_native_builder.py69 def test_install_hint_for_fedora_like_systems(self):CODE
LOWtests/core/test_scanner.py56 def test_generate_redirect_regex(self):CODE
LOWtests/core/test_scanner.py94 def test_probable_wildcard_skips_expensive_similarity_for_large_bodies(self):CODE
LOWtests/core/test_scanner.py121 def test_probable_wildcard_keeps_similarity_for_medium_bodies(self):CODE
LOWtests/core/test_request_backend.py33 def test_native_accepts_default_supported_options(self):CODE
LOWtests/core/test_request_backend.py36 def test_native_rejects_async_mode(self):CODE
LOWtests/core/test_request_backend.py42 def test_native_rejects_non_get_methods(self):CODE
LOWtests/core/test_request_backend.py48 def test_native_rejects_proxies(self):CODE
LOWtests/core/test_request_backend.py54 def test_native_rejects_delay(self):CODE
LOWtests/core/test_wordlist_backend.py25 def test_auto_selects_python_backend(self):CODE
LOWtests/core/test_wordlist_backend.py28 def test_python_selects_python_backend(self):CODE
LOWtests/core/test_wordlist_backend.py31 def test_native_reports_unavailable(self):CODE
LOWtests/core/test_wordlist_backend.py39 def test_native_matches_python_when_available(self):CODE
LOWtests/core/test_wordlist_backend.py71 def test_native_matches_python_for_generation_options_when_available(self):CODE
LOWtests/core/test_dictionary_templates.py55 def test_repeated_placeholder_uses_same_value(self):CODE
LOWtests/core/test_dictionary_templates.py62 def test_category_placeholder(self):CODE
LOWtests/core/test_dictionary_templates.py67 def test_ext_placeholder_compatibility(self):CODE
LOWtests/core/test_async_fuzzer.py72 async def test_does_not_filter_response_matching_index_page(self):CODE
LOWtests/core/test_native_fuzzer.py93 def test_native_fuzzer_processes_native_responses(self):CODE
LOWtests/core/test_native_fuzzer.py116 def test_native_fuzzer_routes_backend_errors(self):CODE
LOWtests/core/test_native_fuzzer.py131 def test_native_fuzzer_routes_filtered_results_to_not_found_callbacks(self):CODE
LOWtests/core/test_fuzzer_filter_stacks.py124 def test_advanced_filters_apply_in_sync_stack(self):CODE
LOWtests/core/test_fuzzer_filter_stacks.py150 async def test_advanced_filters_apply_in_async_stack(self):CODE
LOWtests/core/test_fuzzer_filter_stacks.py175 def test_pushed_down_advanced_filters_apply_in_native_stack(self):CODE
LOWtests/core/test_advanced_filters.py80 def test_match_status_is_opt_in(self):CODE
92 more matches not shown…
Unused Imports87 hits · 78 pts
SeverityFileLineSnippetContext
LOWdirsearch.py23CODE
LOWdirsearch.py23CODE
LOWdirsearch.py23CODE
LOWdirsearch.py23CODE
LOWdirsearch.py23CODE
LOWdirsearch.py23CODE
LOW__init__.py6CODE
LOW__init__.py6CODE
LOW__init__.py6CODE
LOW__init__.py6CODE
LOW__init__.py6CODE
LOW__init__.py6CODE
LOW__init__.py6CODE
LOWtesting.py23CODE
LOWtesting.py24CODE
LOWtesting.py25CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py26CODE
LOWtesting.py37CODE
LOWtesting.py38CODE
LOWtesting.py39CODE
LOWtesting.py40CODE
LOWtesting.py41CODE
LOWtesting.py42CODE
LOWtesting.py43CODE
LOWtesting.py43CODE
LOWtesting.py43CODE
LOWtesting.py48CODE
LOWtesting.py49CODE
LOWtesting.py50CODE
LOWtesting.py51CODE
LOWtesting.py52CODE
LOWtesting.py53CODE
LOWtesting.py54CODE
LOWtesting.py55CODE
LOWtesting.py56CODE
LOWtesting.py57CODE
LOWtesting.py58CODE
LOWtesting.py59CODE
LOWtesting.py60CODE
LOWtesting.py61CODE
LOWtesting.py62CODE
LOWtesting.py63CODE
LOWtesting.py64CODE
LOWtests/test_optional_db_dependencies.py19CODE
LOWtests/core/test_importable_api.py1CODE
LOWtests/core/test_wordlist_backend.py1CODE
LOWtests/core/test_dictionary_templates.py1CODE
LOWtests/controller/test_session_store.py19CODE
LOWscripts/split_wordlists.py4CODE
LOWscripts/configure_stack.py2CODE
LOWscripts/build_portable.py2CODE
LOWscripts/build_native.py2CODE
27 more matches not shown…
Over-Commented Block74 hits · 74 pts
SeverityFileLineSnippetContext
LOWdirsearch.py1#!/usr/bin/env python3COMMENT
LOWpyproject.toml1# -*- coding: utf-8 -*-COMMENT
LOWconfig.ini21#include-status = 200-299,401COMMENT
LOWconfig.ini41#filter-status = 500-599COMMENT
LOWconfig.ini61#prefixes = .,adminCOMMENT
LOWconfig.ini101verbose = FalseCOMMENT
LOWsetup.py1#!/usr/bin/env python3COMMENT
LOWtesting.py1#!/usr/bin/env python3COMMENT
LOWtests/test_optional_db_dependencies.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/test_release_scripts.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/core/test_scanner.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/connection/test_dns.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/connection/test_requester.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/parse/test_config.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/parse/test_url.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/parse/test_headers.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/utils/test_mimetype.py1# This program is free software; you can redistribute it and/or modifyCOMMENT
LOWtests/utils/test_common.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/utils/test_schemedet.py1# This program is free software; you can redistribute it and/or modifyCOMMENT
LOWtests/utils/test_diff.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/utils/test_crawl.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/utils/test_random.py1# -*- coding: utf-8 -*-COMMENT
LOWtests/controller/test_session_store.py1# -*- coding: utf-8 -*-COMMENT
LOWdocs/configuration.md21target-max-time = 0COMMENT
LOWdocs/configuration.md41# Advanced opt-in filters and matchers, inspired by ffuf/wfuzz. These are notCOMMENT
LOWdocs/configuration.md81#headers = [COMMENT
LOWdocs/configuration.md121# - {date}: Scan date, format: DD-MM-YYYY (e.g. 07-10-2022)COMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOWlib/core/options.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/scanner.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/logger.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/api.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/fuzzer.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/settings.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/exceptions.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/structures.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/dictionary.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/filters.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/data.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/core/decorators.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/connection/dns.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/connection/response.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/connection/requester.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/parse/config.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/parse/cmdline.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/parse/rawrequest.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/parse/url.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/parse/headers.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/crawl.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/mimetype.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/safe_xml.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/random.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/file.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/common.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/diff.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/utils/schemedet.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/controller/controller.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/controller/session.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/view/terminal.py1# -*- coding: utf-8 -*-COMMENT
LOWlib/view/colors.py1# -*- coding: utf-8 -*-COMMENT
14 more matches not shown…
Hallucination Indicators5 hits · 50 pts
SeverityFileLineSnippetContext
CRITICALdirsearch.py32from lib.core.exceptions import WordlistLimitErrorCODE
CRITICALtests/core/test_wordlist_backend.py8from lib.core.exceptions import WordlistBackendUnavailableErrorCODE
CRITICALtests/core/test_dictionary_templates.py9from lib.core.exceptions import WordlistLimitErrorCODE
CRITICALlib/core/api.py30from lib.core.exceptions import WordlistLimitErrorCODE
CRITICALlib/core/wordlist_backend.py7from lib.core.exceptions import WordlistBackendUnavailableError, WordlistLimitErrorCODE
Deep Nesting18 hits · 18 pts
SeverityFileLineSnippetContext
LOWsetup.py53CODE
LOWtests/check_packaged_install.py10CODE
LOWscripts/split_wordlists.py140CODE
LOWlib/core/options.py61CODE
LOWlib/core/api.py287CODE
LOWlib/core/wordlist_backend.py34CODE
LOWlib/core/wordlist_backend.py163CODE
LOWlib/core/fuzzer.py495CODE
LOWlib/connection/requester.py240CODE
LOWlib/connection/requester.py414CODE
LOWlib/connection/requester.py611CODE
LOWlib/utils/crawl.py62CODE
LOWlib/controller/controller.py179CODE
LOWlib/controller/controller.py325CODE
LOWlib/controller/controller.py637CODE
LOWlib/controller/session.py59CODE
LOWlib/view/terminal.py107CODE
LOWdb/categories/generate_wpscan_wordlists.py12CODE
Excessive Try-Catch Wrapping12 hits · 18 pts
SeverityFileLineSnippetContext
LOWlib/core/options.py70 except Exception:CODE
MEDIUMlib/core/options.py155 print("Error while parsing Nmap report: " + str(e))CODE
MEDIUMlib/core/options.py224 print("Error in headers file: " + str(e))CODE
LOWlib/core/fuzzer.py456 except Exception as e:CODE
LOWlib/connection/requester.py482 except Exception as e:CODE
LOWlib/connection/requester.py666 except Exception as e:CODE
LOWlib/controller/controller.py633 except Exception:CODE
LOWlib/controller/controller.py657 except Exception:CODE
LOWdb/categories/generate_wpscan_wordlists.py33 except Exception as e:CODE
LOWdb/categories/php/generate_wpscan_wordlists.py19 except Exception as e:CODE
MEDIUMdb/categories/php/generate_wpscan_wordlists.py20 print(f"Error downloading: {e}")CODE
MEDIUMdb/categories/php/generate_wpscan_wordlists.py4def download_file(url, output_path):CODE
Modern Structural Boilerplate12 hits · 14 pts
SeverityFileLineSnippetContext
LOWdirsearch.py35__all__ = [CODE
LOW__init__.py16__all__ = [CODE
LOWlib/core/logger.py25logger = logging.getLogger(__name__)CODE
LOWlib/core/api.py40__all__ = [CODE
LOWlib/core/fuzzer.py90 def set_base_path(self, path: str) -> None:CODE
LOWlib/connection/requester.py338 def set_url(self, url: str) -> None:CODE
LOWlib/connection/requester.py341 def set_query(self, query: str) -> None:CODE
LOWlib/connection/requester.py347 def set_header(self, key: str, value: str) -> None:CODE
LOWlib/connection/requester.py396 def set_auth(self, type: str, credential: str) -> None:CODE
LOWlib/connection/requester.py578 def set_auth(self, type: str, credential: str) -> None:CODE
LOWlib/controller/controller.py500 def set_target(self, url: str) -> None:CODE
LOWlib/controller/controller.py594 def update_progress_bar(self, response: BaseResponse) -> None:CODE
AI Slop Vocabulary2 hits · 4 pts
SeverityFileLineSnippetContext
LOWdb/categories/php/generate_wpscan_wordlists.py16 # Actually, for this task, I will mock the data if download fails or just create placeholdersCOMMENT
LOWdb/categories/php/generate_wpscan_wordlists.py34 # or just use a predefined list if we can't scrape.COMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWlib/core/fuzzer.py311 # Check if the response is unique, not wildcardCOMMENT
LOWlib/report/sqlite_report.py46 # Check if the file is a proper sqlite databaseCOMMENT
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWlib/core/api.py214CODE