Repository Analysis

danger/danger

🚫 Stop saying "you forgot to …" in code review (in Ruby)

6.7 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of danger/danger, a Ruby project with 5,686 GitHub stars. SynthScan v2.0 examined 26,807 lines of code across 239 source files, recording 146 pattern matches distributed across 8 syntactic categories. The overall adjusted score of 6.7 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).

6.7
Adjusted Score
6.7
Raw Score
100%
Time Factor
2026-07-29
Last Push
5.7K
Stars
Ruby
Language
26.8K
Lines of Code
239
Files
146
Pattern Hits
2026-08-02
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 1MEDIUM 10LOW 135

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 146 distinct pattern matches across 8 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.

Over-Commented Block94 hits · 94 pts
SeverityFileLineSnippetContext
LOW.rubocop_todo.yml1# This configuration was generated byCOMMENT
LOWspec/lib/danger/danger_core/message_aggregator_spec.rb81 let(:file_a) { "README.md" }COMMENT
LOWlib/danger/danger_core/standard_error.rb41 def contentsCOMMENT
LOWlib/danger/danger_core/messages/base.rb21 order = file <=> other.fileCOMMENT
LOWlib/danger/danger_core/plugins/dangerfile_git_plugin.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/danger_core/plugins/dangerfile_git_plugin.rb21 # @example Fail really big diffsCOMMENT
LOWlib/danger/danger_core/plugins/dangerfile_git_plugin.rb81 # List of renamed filesCOMMENT
LOWlib/danger/danger_core/plugins/dangerfile_git_plugin.rb121 # The log of commits inside the diffCOMMENT
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb21 #COMMENT
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb41 # danger.import_dangerfile(url: custom_url)COMMENT
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb161 # Download and execute a remote Dangerfile.COMMENT
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb181 # Download and execute a remote Dangerfile.COMMENT
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb201 # A https url where the Dangerfile is.COMMENT
LOW…nger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…nger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb21 # @example Ensure there is a summary for a PRCOMMENT
LOW…nger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb41 # message "This PR changes #{ bitbucket_cloud.html_link(config_files) }"COMMENT
LOW…nger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb121 # The branch to which the PR is going to be merged from.COMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb21 # @example Check if a user is in a specific GitHub org, and message them if soCOMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb41 #COMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb61 #COMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb101 #COMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb141 # @!group PR MetadataCOMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb181 # @!group PR Commit MetadataCOMMENT
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb201 # @return [Octokit::Client]COMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb21 # message 'Hello', 'World', file: "Dangerfile", line: 1COMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb41 # failure ["This is example", "with array"]COMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb61 # markdown "### First issue", "### Second issue"COMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb81 endCOMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb121 side: side,COMMENT
LOW…ger/danger_core/plugins/dangerfile_messaging_plugin.rb181 #COMMENT
LOW…ger_core/plugins/dangerfile_bitbucket_server_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…ger_core/plugins/dangerfile_bitbucket_server_plugin.rb21 # @example Ensure there is a summary for a PRCOMMENT
LOW…ger_core/plugins/dangerfile_bitbucket_server_plugin.rb41 # message "This PR changes #{ bitbucket_server.html_link(config_files) }"COMMENT
LOW…ger_core/plugins/dangerfile_bitbucket_server_plugin.rb121 # The branch to which the PR is going to be merged from.COMMENT
LOW…ger_core/plugins/dangerfile_bitbucket_server_plugin.rb141 @bs.pr_json[:fromRef][:latestCommit].to_sCOMMENT
LOW…ger_core/plugins/dangerfile_bitbucket_server_plugin.rb161 # Returns a list of Markdown links for a file, or files in the head repository.COMMENT
LOW…er/danger_core/plugins/dangerfile_local_only_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb21 # @example Ensure that all MRs have an assignee.COMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb41 # warn("This MR cannot be merged yet.") unless can_mergeCOMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb61 # reviewer = gitlab.api.group_members(gitlab.api.merge_request_approvals(project_id, mr_id).to_hash["approveCOMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb121 # The labels assigned to the Merge RequestCOMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb161COMMENT
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb201 endCOMMENT
LOW…b/danger/danger_core/plugins/dangerfile_vsts_plugin.rb1# frozen_string_literal: trueCOMMENT
LOW…b/danger/danger_core/plugins/dangerfile_vsts_plugin.rb21 # @example Only accept PRs to the develop branchCOMMENT
LOW…b/danger/danger_core/plugins/dangerfile_vsts_plugin.rb41 #COMMENT
LOW…b/danger/danger_core/plugins/dangerfile_vsts_plugin.rb101COMMENT
LOW…b/danger/danger_core/plugins/dangerfile_vsts_plugin.rb141 def base_commitCOMMENT
LOWlib/danger/ci_source/surf.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/ci_source/screwdriver.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/ci_source/appveyor.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/ci_source/appveyor.rb21 #COMMENT
LOWlib/danger/ci_source/xcode_cloud.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/ci_source/buildkite.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/ci_source/jenkins.rb1# frozen_string_literal: trueCOMMENT
LOWlib/danger/ci_source/jenkins.rb21 #COMMENT
34 more matches not shown…
Hyper-Verbose Identifiers34 hits · 38 pts
SeverityFileLineSnippetContext
LOWspec/support/gitlab_helper.rb55 def stub_merge_request_changes(fixture, slug, merge_request_id)CODE
LOWspec/support/gitlab_helper.rb61 def stub_merge_request_commits(fixture, slug, merge_request_id)CODE
LOWspec/support/gitlab_helper.rb67 def stub_merge_request_comments(fixture, slug, merge_request_id)CODE
LOWspec/support/gitlab_helper.rb73 def stub_merge_request_discussions(fixture, slug, merge_request_id)CODE
LOWspec/support/gitlab_helper.rb79 def stub_commit_merge_requests(fixture, slug, commit_sha)CODE
LOWspec/support/ci_helper.rb209 def with_travis_setup_and_is_a_pull_request(request_source: nil)CODE
LOWspec/lib/danger/danger_core/executor_spec.rb183 def prepare_fake_swiftweekly_repository(dir)CODE
LOWspec/lib/danger/plugin_support/gems_resolver_spec.rb28 def fake_bundle_install_path_vendor_gems_in(spec_root)CODE
LOWlib/danger/scm_source/git_repo.rb107 def git_fetch_branch_to_depth(branch, depth)CODE
LOWlib/danger/scm_source/git_repo.rb115 def raise_if_we_cannot_find_the_commit(commitish)CODE
LOWlib/danger/scm_source/git_repo.rb142 def find_merge_base_with_incremental_fetch(repo, from, to)CODE
LOWlib/danger/danger_core/environment_manager.rb80 def raise_error_for_no_request_source(env, ui)CODE
LOWlib/danger/danger_core/environment_manager.rb104 def extract_title_and_subtitle_from_source(repo_url)CODE
LOWlib/danger/danger_core/environment_manager.rb117 def ui_display_no_request_source_error_message(ui, env, title, subtitle)CODE
LOWlib/danger/danger_core/dangerfile.rb123 def method_values_for_plugin_hashes(plugin_hashes)CODE
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb137 def import_dangerfile_from_path(path)CODE
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb151 def import_dangerfile_from_gem(name)CODE
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb171 def import_dangerfile_from_github(slug, branch = nil, path = nil)CODE
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb191 def import_dangerfile_from_gitlab(slug_or_project_id, branch = nil, path = nil)CODE
LOW…danger/danger_core/plugins/dangerfile_danger_plugin.rb204 def import_dangerfile_from_url(url)CODE
LOW…danger/danger_core/plugins/dangerfile_github_plugin.rb246 def dismiss_out_of_range_messages(dismiss = true)CODE
LOW…danger/danger_core/plugins/dangerfile_gitlab_plugin.rb257 def dismiss_out_of_range_messages(dismiss = true)CODE
LOWlib/danger/request_sources/code_insights_api.rb120 def violation_hash_with_severity(violation, severity)CODE
LOWlib/danger/request_sources/code_insights_api.rb129 def report_endpoint_at_commit(commit)CODE
LOWlib/danger/request_sources/code_insights_api.rb133 def annotation_endpoint_at_commit(commit)CODE
LOWlib/danger/request_sources/gitlab.rb294 def dismiss_out_of_range_messages_for(kind)CODE
LOWlib/danger/request_sources/gitlab.rb470 def find_old_position_in_diff(changes, message)CODE
LOWlib/danger/request_sources/github/github.rb301 def delete_old_inline_violations(danger_comments: [], non_danger_comments: [])CODE
LOWlib/danger/request_sources/github/github.rb549 def dismiss_out_of_range_messages_for(kind)CODE
LOWlib/danger/ci_source/support/pull_request_finder.rb62 def generate_remote_pull_request(remote_pull_request)CODE
LOWlib/danger/helpers/comments_helper.rb115 def generate_message_group_comment(message_group:,CODE
LOWlib/danger/helpers/comments_helper.rb133 def generate_inline_comment_body(emoji,CODE
LOWlib/danger/helpers/comments_helper.rb145 def generate_inline_markdown_body(markdown, danger_id: "danger", template: "github")CODE
LOWlib/danger/helpers/comments_parsing_helper.rb19 def parse_tables_from_comment(comment)CODE
Slop Phrases10 hits · 21 pts
SeverityFileLineSnippetContext
MEDIUMlib/danger/danger_core/dangerfile_dsl.rb11 # you can use to pull out extra bits of information. _Warning_COMMENT
LOWlib/danger/ci_source/xcode_cloud.rb13 # If running on GitHub Enterprise, make sure you also set the expected values forCOMMENT
MEDIUMlib/danger/ci_source/teamcity.rb64 # TeamCity provides `%teamcity.build.branch%`, which you can use at the top of your Simple Command Runner:COMMENT
MEDIUMlib/danger/ci_source/github_actions.rb9 # And so, you can use GITHUB_TOKEN secret as `DANGER_GITHUB_API_TOKEN` environment variable.COMMENT
MEDIUMlib/danger/ci_source/circle.rb20 # With "Only build pull requests" enabled, you can add `bundle exec danger` to your `config.yml` (Circle 2.0).COMMENT
LOWlib/danger/ci_source/code_build.rb9 # In CodeBuild, make sure to correctly forward `CODEBUILD_BUILD_ID`, `CODEBUILD_SOURCE_VERSION`, `CODEBUILD_SOURCE_REPCOMMENT
LOWlib/danger/ci_source/code_build.rb10 # In CodeBuild with batch builds, make sure to correctly forward `CODEBUILD_BUILD_ID`, `CODEBUILD_WEBHOOK_TRIGGER`, `CCOMMENT
LOWlib/danger/ci_source/codefresh.rb21 # Don't forget to add the `DANGER_GITHUB_API_TOKEN` variable to your pipeline settings so that Danger can properly poCOMMENT
MEDIUMlib/danger/commands/init.rb133 ui.say "It's worth noting that you #{'should not'.bold.white} re-use this token for OSS repos."CODE
LOWlib/danger/commands/init.rb136 ui.say "Additionally, don't forget to add your new GitHub account as a collaborator to your Closed Source projecCODE
Magic Placeholder Names1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHlib/danger/ci_source/appveyor.rb28 # DANGER_GITHUB_API_TOKEN: <YOUR_TOKEN_HERE>COMMENT
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMlib/danger/danger_core/executor.rb20 # Create a silent Cork instance if cork is nil, as it's likely a testCOMMENT
MEDIUMlib/danger/plugin_support/plugin_parser.rb144 # Create the center params, `thing: OK, other: Thing`COMMENT
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMlib/danger/danger_core/standard_error.rb55 # -------------------------------------------COMMENT
MEDIUMlib/danger/danger_core/standard_error.rb59 # -------------------------------------------COMMENT
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWlib/danger/danger_core/dangerfile.rb297 # Print results in the terminalCOMMENT
LOWlib/danger/ci_source/drone.rb63 # Check if this build is valid for CI with drone 0.6 or laterCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMlib/danger/helpers/comments_parsing_helper.rb67 # The new method uses a more robust data-danger-tableCOMMENT