Repository Analysis

anishathalye/dotbot

A tool that bootstraps your dotfiles ⚡️

13.6 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of anishathalye/dotbot, a Python project with 7,959 GitHub stars. SynthScan v2.0 examined 6,418 lines of code across 51 source files, recording 87 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 13.6 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).

13.6
Adjusted Score
13.6
Raw Score
100%
Time Factor
2026-07-12
Last Push
8.0K
Stars
Python
Language
6.4K
Lines of Code
51
Files
87
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

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

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 3LOW 84

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 87 distinct pattern matches across 7 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 Identifiers55 hits · 49 pts
SeverityFileLineSnippetContext
LOWtests/test_bin_dotbot.py16def test_find_python_executable(CODE
LOWtests/test_plugins.py30def test_plugin_absolute_path(CODE
LOWtests/test_plugins.py100def test_plugin_command_line_and_config(CODE
LOWtests/test_plugins.py165def test_plugin_multiple_directives(CODE
LOWtests/test_plugins.py195def test_plugin_duplicate_loading(CODE
LOWtests/test_link.py15def test_link_canonicalization(CODE
LOWtests/test_link.py73def test_link_environment_user_expansion_link_name(CODE
LOWtests/test_link.py90def test_link_environment_variable_expansion_target(CODE
LOWtests/test_link.py110def test_link_environment_variable_expansion_target_extended(CODE
LOWtests/test_link.py130def test_link_environment_variable_expansion_link_name(CODE
LOWtests/test_link.py168def test_link_environment_variable_unset(CODE
LOWtests/test_link.py185def test_link_force_leaves_when_nonexistent(CODE
LOWtests/test_link.py208def test_link_force_overwrite_symlink(CODE
LOWtests/test_link.py224def test_link_force_directory(CODE
LOWtests/test_link.py242def test_link_backup_directory(CODE
LOWtests/test_link.py285def test_link_backup_not_created_if_link(CODE
LOWtests/test_link.py302def test_link_backup_created_if_force(CODE
LOWtests/test_link.py323def test_link_backup_error_if_dest_already_exists(CODE
LOWtests/test_link.py429def test_link_backup_relink_force_with_existing_incorrect_symlink(CODE
LOWtests/test_link.py459def test_link_backup_relink_real_file_skips_delete(CODE
LOWtests/test_link.py498def test_link_backup_relink_with_existing_incorrect_symlink_glob(CODE
LOWtests/test_link.py667def test_link_glob_ignore_no_glob_chars(CODE
LOWtests/test_link.py882def test_link_glob_multi_star(CODE
LOWtests/test_link.py998def test_link_glob_single_match(CODE
LOWtests/test_link.py1125def test_link_if_defaults_windows(CODE
LOWtests/test_link.py1203def test_link_no_canonicalize(CODE
LOWtests/test_link.py1320def test_link_relink_leaves_file(CODE
LOWtests/test_link.py1335def test_link_relink_overwrite_symlink(CODE
LOWtests/test_link.py1350def test_link_relink_relative_leaves_file(CODE
LOWtests/test_link.py1382def test_target_is_not_overwritten_by_symlink_trickery(CODE
LOWtests/test_link.py1567def test_symlink_exists_when_hardlink_requested(CODE
LOWtests/test_link.py1594def test_hardlink_already_exists(CODE
LOWtests/test_link.py1619def test_broken_symlink_shows_invalid_link_message(CODE
LOWtests/test_link.py1804def test_link_dry_run_overwrite(CODE
LOWtests/test_link.py1850def test_link_error_creating_link(CODE
LOWtests/test_link.py1892def test_link_error_creating_directory(CODE
LOWtests/test_clean.py32def test_clean_environment_variable_expansion(CODE
LOWtests/test_clean.py185def test_clean_dry_run_recursive(CODE
LOWtests/test_create.py46def test_default_mode_override(CODE
LOWtests/test_shell.py80def test_shell_cli_verbosity_stderr(CODE
LOWtests/test_shell.py94def test_shell_cli_verbosity_stderr_with_explicit_stdout_off(CODE
LOWtests/test_shell.py119def test_shell_cli_verbosity_stderr_with_defaults_stdout_off(CODE
LOWtests/test_shell.py148def test_shell_single_v_verbosity_stdout(CODE
LOWtests/test_shell.py162def test_shell_single_v_verbosity_stderr(CODE
LOWtests/test_shell.py215def test_shell_stdout_disabled_by_default(CODE
LOWtests/test_shell.py235def test_shell_can_override_defaults(CODE
LOWtests/test_shell.py281def test_shell_quiet_enabled_with_description(CODE
LOWtests/test_shell.py309def test_shell_quiet_enabled_without_description(CODE
LOWtests/test_cli.py186def test_plugin_loading_directory(CODE
LOWtests/test_cli.py234def test_disable_builtin_plugins(CODE
LOWtests/test_cli.py249def test_plugin_context_plugin(CODE
LOWtests/test_cli.py271def test_plugin_dispatcher_no_plugins(CODE
LOWtests/test_cli.py294def test_dry_run_unaware_plugin(CODE
LOWtests/test_cli.py317def test_dry_run_aware_plugin(CODE
LOWtests/test_cli.py337def test_dry_run_aware_plugin_no_dry_run(CODE
Unused Imports13 hits · 13 pts
SeverityFileLineSnippetContext
LOWsrc/dotbot/__init__.py1CODE
LOWsrc/dotbot/__init__.py2CODE
LOWsrc/dotbot/__init__.py3CODE
LOWsrc/dotbot/context.py4CODE
LOWsrc/dotbot/context.py4CODE
LOWsrc/dotbot/context.py7CODE
LOWsrc/dotbot/util/__init__.py1CODE
LOWsrc/dotbot/plugins/__init__.py1CODE
LOWsrc/dotbot/plugins/__init__.py2CODE
LOWsrc/dotbot/plugins/__init__.py3CODE
LOWsrc/dotbot/plugins/__init__.py4CODE
LOWsrc/dotbot/messenger/__init__.py1CODE
LOWsrc/dotbot/messenger/__init__.py2CODE
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_bin_dotbot.py26 # Create a link to sh.COMMENT
MEDIUMtests/conftest.py183 # Create an isolated temporary directory from which to operate.COMMENT
MEDIUMtests/test_link.py442 # Create an incorrect symlink at the destination.COMMENT
Modern Structural Boilerplate7 hits · 7 pts
SeverityFileLineSnippetContext
LOWsrc/dotbot/__init__.py5__all__ = ["Plugin", "__version__", "main"]CODE
LOWsrc/dotbot/context.py26 def set_base_directory(self, base_directory: str) -> None:CODE
LOWsrc/dotbot/context.py35 def set_defaults(self, defaults: Dict[str, Any]) -> None:CODE
LOWsrc/dotbot/util/__init__.py3__all__ = ["shell_command"]CODE
LOWsrc/dotbot/plugins/__init__.py6__all__ = ["Clean", "Create", "Link", "Shell"]CODE
LOWsrc/dotbot/messenger/__init__.py4__all__ = ["Level", "Messenger"]CODE
LOWsrc/dotbot/messenger/messenger.py11 def set_level(self, level: Level) -> None:CODE
Deep Nesting5 hits · 5 pts
SeverityFileLineSnippetContext
LOWsrc/dotbot/dispatcher.py53CODE
LOWsrc/dotbot/cli.py108CODE
LOWsrc/dotbot/plugins/link.py31CODE
LOWsrc/dotbot/plugins/link.py289CODE
LOWsrc/dotbot/plugins/clean.py43CODE
Excessive Try-Catch Wrapping3 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/dotbot/dispatcher.py79 except Exception as err: # noqa: BLE001CODE
LOWsrc/dotbot/dispatcher.py106 except Exception as err: # noqa: BLE001CODE
LOWsrc/dotbot/config.py29 except Exception as e:CODE
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOWsrc/dotbot/util/common.py21 if platform.system() == "Windows":COMMENT