Repository Analysis

coderamp-labs/gitingest

Replace 'hub' with 'ingest' in any GitHub URL to get a prompt-friendly extract of a codebase

15.7 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of coderamp-labs/gitingest, a Python project with 15,051 GitHub stars. SynthScan v2.0 examined 11,101 lines of code across 95 source files, recording 149 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 15.7 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).

15.7
Adjusted Score
15.7
Raw Score
100%
Time Factor
2026-07-14
Last Push
15.1K
Stars
Python
Language
11.1K
Lines of Code
95
Files
149
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 10LOW 139

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 149 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 Identifiers59 hits · 60 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py30def get_ensure_git_installed_call_count() -> int:CODE
LOWtests/test_notebook_utils.py14def test_process_notebook_all_cells(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py48def test_process_notebook_with_worksheets(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py80def test_process_notebook_multiple_worksheets(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py118def test_process_notebook_code_only(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py139def test_process_notebook_markdown_only(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py161def test_process_notebook_raw_only(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py183def test_process_notebook_empty_cells(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py206def test_process_notebook_invalid_cell_type(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_notebook_utils.py225def test_process_notebook_with_output(write_notebook: WriteNotebookFunc) -> None:CODE
LOWtests/test_git_utils.py35def test_validate_github_token_valid(token: str) -> None:CODE
LOWtests/test_git_utils.py52def test_validate_github_token_invalid(token: str) -> None:CODE
LOWtests/test_git_utils.py113def test_create_git_auth_header(token: str) -> None:CODE
LOWtests/test_git_utils.py129def test_create_git_repo_helper_calls(CODE
LOWtests/test_git_utils.py195def test_create_git_auth_header_with_ghe_url(token: str, url: str, expected_hostname: str) -> None:CODE
LOWtests/test_git_utils.py234def test_create_git_repo_with_ghe_urls(CODE
LOWtests/test_git_utils.py264def test_create_git_repo_ignores_non_github_urls(CODE
LOWtests/test_gitignore_feature.py35def test_load_gitignore_patterns(tmp_path: Path) -> None:CODE
LOWtests/test_gitignore_feature.py52async def test_ingest_with_gitignore(repo_path: Path) -> None:CODE
LOWtests/test_clone.py70async def test_clone_nonexistent_repository(repo_exists_true: AsyncMock) -> None:CODE
LOWtests/test_clone.py121async def test_clone_without_commit(repo_exists_true: AsyncMock, gitpython_mocks: dict) -> None:CODE
LOWtests/test_clone.py149async def test_clone_creates_parent_directory(tmp_path: Path, gitpython_mocks: dict) -> None:CODE
LOWtests/test_clone.py170async def test_clone_with_specific_subpath(gitpython_mocks: dict) -> None:CODE
LOWtests/test_clone.py192async def test_clone_with_include_submodules(gitpython_mocks: dict) -> None:CODE
LOWtests/test_clone.py209async def test_check_repo_exists_with_auth_token(mocker: MockerFixture) -> None:CODE
LOWtests/test_pattern_utils.py7def test_process_patterns_empty_patterns() -> None:CODE
LOWtests/test_pattern_utils.py20def test_parse_patterns_valid() -> None:CODE
LOWtests/test_pattern_utils.py33def test_process_patterns_include_and_ignore_overlap() -> None:CODE
LOWtests/test_ingestion.py201def test_include_ignore_patterns(CODE
LOWtests/test_summary.py86def _calculate_expected_lines(ref_type: str, *, is_main_branch: bool) -> int:CODE
LOWtests/test_cli.py62def test_cli_with_stdout_output() -> None:CODE
LOWtests/test_cli.py93def _invoke_isolated_cli_runner(args: list[str]) -> Result:CODE
LOWtests/query_parser/test_query_parser.py42async def test_parse_url_valid_https(url: str, stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py51async def test_parse_url_valid_http(url: str, stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py90async def test_parse_query_mixed_case(stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py106async def test_parse_url_with_subpaths(CODE
LOWtests/query_parser/test_query_parser.py129async def test_parse_url_invalid_repo_structure(stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py144async def test_parse_local_dir_path_local_path() -> None:CODE
LOWtests/query_parser/test_query_parser.py160async def test_parse_local_dir_path_relative_path() -> None:CODE
LOWtests/query_parser/test_query_parser.py176async def test_parse_remote_repo_empty_source(stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py199async def test_parse_url_branch_and_commit_distinction(CODE
LOWtests/query_parser/test_query_parser.py222async def test_parse_local_dir_path_uuid_uniqueness() -> None:CODE
LOWtests/query_parser/test_query_parser.py237async def test_parse_url_with_query_and_fragment(stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py254async def test_parse_url_unsupported_host(stub_resolve_sha: dict[str, AsyncMock]) -> None:CODE
LOWtests/query_parser/test_query_parser.py270async def test_parse_query_with_branch() -> None:CODE
LOWtests/query_parser/test_query_parser.py304async def test_parse_repo_source_with_various_url_patterns(CODE
LOWtests/query_parser/test_query_parser.py330async def _assert_basic_repo_fields(url: str, sha_mock: AsyncMock) -> IngestionQuery:CODE
LOWtests/query_parser/test_git_host_agnostic.py31async def test_parse_query_without_host(CODE
LOWtests/server/test_flow_integration.py49async def test_remote_repository_analysis(request: pytest.FixtureRequest) -> None:CODE
LOWtests/server/test_flow_integration.py74async def test_invalid_repository_url(request: pytest.FixtureRequest) -> None:CODE
LOWtests/server/test_flow_integration.py171async def test_repository_with_patterns(request: pytest.FixtureRequest) -> None:CODE
LOWsrc/server/server_utils.py18async def rate_limit_exception_handler(request: Request, exc: Exception) -> Response:CODE
LOWsrc/static/llms.txt334def ingest_with_token_rotation(repo_url: str, token_manager):CODE
LOWsrc/gitingest/clone.py130async def _perform_post_clone_operations(CODE
LOWsrc/gitingest/utils/query_parser_utils.py101async def _try_domains_for_user_and_repo(user_name: str, repo_name: str, token: str | None = None) -> str:CODE
LOWsrc/gitingest/utils/query_parser_utils.py133def _is_valid_git_commit_hash(commit: str) -> bool:CODE
LOWsrc/gitingest/utils/query_parser_utils.py219def _get_user_and_repo_from_path(path: str) -> tuple[str, str]:CODE
LOWsrc/gitingest/utils/os_utils.py6async def ensure_directory_exists_or_create(path: Path) -> None:CODE
LOWsrc/gitingest/utils/git_utils.py187async def fetch_remote_branches_or_tags(url: str, *, ref_type: str, token: str | None = None) -> list[str]:CODE
Unused Imports50 hits · 50 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py7CODE
LOWtests/test_git_utils.py7CODE
LOWtests/test_clone.py7CODE
LOWtests/test_ingestion.py7CODE
LOWtests/test_cli.py3CODE
LOWtests/query_parser/test_query_parser.py8CODE
LOWtests/query_parser/test_git_host_agnostic.py7CODE
LOWsrc/server/form_types.py3CODE
LOWsrc/server/routers_utils.py3CODE
LOWsrc/server/models.py3CODE
LOWsrc/server/server_config.py3CODE
LOWsrc/server/s3_utils.py3CODE
LOWsrc/server/query_processor.py3CODE
LOWsrc/server/main.py3CODE
LOWsrc/server/routers/__init__.py3CODE
LOWsrc/server/routers/__init__.py4CODE
LOWsrc/server/routers/__init__.py5CODE
LOWsrc/gitingest/query_parser.py3CODE
LOWsrc/gitingest/ingestion.py3CODE
LOWsrc/gitingest/output_formatter.py3CODE
LOWsrc/gitingest/__init__.py3CODE
LOWsrc/gitingest/__init__.py3CODE
LOWsrc/gitingest/entrypoint.py3CODE
LOWsrc/gitingest/__main__.py4CODE
LOWsrc/gitingest/clone.py3CODE
LOWsrc/gitingest/utils/query_parser_utils.py3CODE
LOWsrc/gitingest/utils/auth.py3CODE
LOWsrc/gitingest/utils/logging_config.py7CODE
LOWsrc/gitingest/utils/ignore_patterns.py3CODE
LOWsrc/gitingest/utils/ingestion_utils.py3CODE
LOWsrc/gitingest/utils/compat_typing.py4CODE
LOWsrc/gitingest/utils/compat_typing.py9CODE
LOWsrc/gitingest/utils/compat_typing.py9CODE
LOWsrc/gitingest/utils/compat_typing.py14CODE
LOWsrc/gitingest/utils/compat_typing.py6CODE
LOWsrc/gitingest/utils/compat_typing.py11CODE
LOWsrc/gitingest/utils/compat_typing.py11CODE
LOWsrc/gitingest/utils/compat_typing.py16CODE
LOWsrc/gitingest/utils/pattern_utils.py3CODE
LOWsrc/gitingest/utils/file_utils.py3CODE
LOWsrc/gitingest/utils/notebook.py3CODE
LOWsrc/gitingest/utils/git_utils.py3CODE
LOWsrc/gitingest/schemas/ingestion.py3CODE
LOWsrc/gitingest/schemas/filesystem.py3CODE
LOWsrc/gitingest/schemas/cloning.py3CODE
LOWsrc/gitingest/schemas/__init__.py3CODE
LOWsrc/gitingest/schemas/__init__.py4CODE
LOWsrc/gitingest/schemas/__init__.py4CODE
LOWsrc/gitingest/schemas/__init__.py4CODE
LOWsrc/gitingest/schemas/__init__.py5CODE
Self-Referential Comments5 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_gitignore_feature.py24 # Create a file that should be includedCOMMENT
MEDIUMtests/test_gitignore_feature.py28 # Create a file that should be excludedCOMMENT
MEDIUMsrc/server/main.py87 # Define the default allowed hosts for the applicationCOMMENT
MEDIUMsrc/server/metrics_server.py10# Create a logger for this moduleCOMMENT
MEDIUMsrc/server/metrics_server.py13# Create a separate FastAPI app for metricsCOMMENT
Redundant / Tautological Comments7 hits · 13 pts
SeverityFileLineSnippetContext
LOWsrc/server/query_processor.py98 # Check if file exists on S3COMMENT
LOWsrc/server/query_processor.py281 # Check if digest already exists on S3 before cloningCOMMENT
LOWsrc/server/main.py48 # Set traces_sample_rate to capture transactions for tracingCOMMENT
LOWsrc/server/main.py50 # Set profile_session_sample_rate to profile sessionsCOMMENT
LOWsrc/server/main.py52 # Set profile_lifecycle to automatically run the profilerCOMMENT
LOWsrc/gitingest/utils/logging_config.py138 # Check if we're in Kubernetes or production environmentCOMMENT
LOWsrc/gitingest/utils/notebook.py47 # Check if the notebook contains worksheetsCOMMENT
Excessive Try-Catch Wrapping10 hits · 10 pts
SeverityFileLineSnippetContext
LOWsrc/server/routers_utils.py54 except Exception as exc:CODE
LOWsrc/server/s3_utils.py383 except Exception as exc:CODE
LOWsrc/server/s3_utils.py462 except Exception as exc:CODE
LOWsrc/server/query_processor.py131 except Exception as exc:CODE
LOWsrc/server/query_processor.py187 except Exception as metadata_exc:CODE
LOWsrc/server/query_processor.py270 except Exception as exc:CODE
LOWsrc/server/query_processor.py307 except Exception as exc:CODE
LOWsrc/gitingest/__main__.py187 except Exception as exc:CODE
LOWsrc/gitingest/utils/git_utils.py104 except Exception as exc:CODE
LOWsrc/gitingest/schemas/filesystem.py134 except Exception as exc:CODE
Decorative Section Separators3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_cli.py72 # ─── core expectations (stdout) ────────────────────────────────────-COMMENT
MEDIUMsrc/static/llms.txt136# ================================================COMMENT
MEDIUMsrc/static/llms.txt138# ================================================COMMENT
Modern Structural Boilerplate4 hits · 4 pts
SeverityFileLineSnippetContext
LOWsrc/server/routers/__init__.py7__all__ = ["dynamic", "index", "ingest"]CODE
LOWsrc/gitingest/__init__.py5__all__ = ["ingest", "ingest_async"]CODE
LOWsrc/gitingest/utils/compat_typing.py18__all__ = ["Annotated", "ParamSpec", "StrEnum", "TypeAlias"]CODE
LOWsrc/gitingest/schemas/__init__.py7__all__ = ["CloneConfig", "FileSystemNode", "FileSystemNodeType", "FileSystemStats", "IngestionQuery"]CODE
AI Slop Vocabulary3 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMtests/conftest.py228 """Provide comprehensive GitPython mocks for testing."""STRING
MEDIUMtests/conftest.py233 """Set up comprehensive GitPython mocks."""STRING
LOWsrc/gitingest/query_parser.py79 # If no extra path parts, just returnCOMMENT
Deep Nesting3 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/server/s3_utils.py486CODE
LOWsrc/gitingest/ingestion.py123CODE
LOWsrc/gitingest/clone.py32CODE
AI Structural Patterns3 hits · 3 pts
SeverityFileLineSnippetContext
LOWsrc/gitingest/entrypoint.py35CODE
LOWsrc/gitingest/entrypoint.py151CODE
LOWsrc/gitingest/__main__.py117CODE
Over-Commented Block2 hits · 2 pts
SeverityFileLineSnippetContext
LOW.github/workflows/codeql.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOWsrc/static/llms.txt121```COMMENT