AI Slop Code Risk Monitor

pry/pry

SlopCodeMonitor badge for pry/pry Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

A runtime developer console and IRB alternative with powerful introspection capabilities.

5.8 Moderate pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for pry/pry, a Ruby project with 6,840 GitHub stars. SynthScan examined 33,262 lines of code across 224 source files, recording 150 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 5.8 (Moderate pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

5.8
Adjusted Signal
5.8
Raw Pattern Score
100%
Time Factor
2026-10-20
Last Push
6.8K
Stars
Ruby
Language
33.3K
Lines of Code
224
Files
150
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

Use each vector to guide manual verification of the underlying findings.

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 24.7/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 148 finding(s).

Hallucinated Dependency & Supply Chain Risk 0.5/100 · LOW

Are imports declared and package/API names verified? 2 finding(s).

Agent Over-Engineering Ratio 3.7/100 · LOW

Are wrappers, guards, and repeated structures necessary? 25 finding(s).

PR Review Velocity Impact 24.6/100 · LOW

Which changes need focused human review? 150 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

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

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 0MEDIUM 19LOW 131

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 150 distinct pattern matches across 6 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Over-Commented Block99 hits · 99 pts
SeverityFileLineSnippetContext
LOW.rubocop_todo.yml1# This configuration was generated byCOMMENT
LOWspec/commands/play_spec.rb21 # @t.process_command 'play --lines 1', @eval_strCOMMENT
LOWspec/commands/save_file_spec.rb101 # endCOMMENT
LOWspec/commands/save_file_spec.rb161 # def @o.babyCOMMENT
LOWspec/commands/save_file_spec.rb181 # File.read(@path).should == str.lines.to_a[1..-2].joinCOMMENT
LOWspec/commands/edit_spec.rb641 # @param [Integer] linenoCOMMENT
LOWspec/commands/whereami_spec.rb121 # though, as we don't hook stdout.COMMENT
LOWlib/pry/ring.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/class_command.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/class_command.rb101COMMENT
LOWlib/pry/class_command.rb121 def setup; endCOMMENT
LOWlib/pry/class_command.rb141 # def subcommands(cmd)COMMENT
LOWlib/pry/class_command.rb161 # method, as it may be called by Pry at any time for introspection reasons.COMMENT
LOWlib/pry/class_command.rb181 #COMMENT
LOWlib/pry/pry_class.rb41 # endCOMMENT
LOWlib/pry/pry_class.rb201COMMENT
LOWlib/pry/pry_class.rb221 # is attached to the return value when the length of inspect is greater thanCOMMENT
LOWlib/pry/pry_class.rb261 endCOMMENT
LOWlib/pry/editor.rb141 endCOMMENT
LOWlib/pry/prompt.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/prompt.rb21 # # In [4]:COMMENT
LOWlib/pry/prompt.rb41 @prompts = {}COMMENT
LOWlib/pry/prompt.rb61 endCOMMENT
LOWlib/pry/exceptions.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/exceptions.rb41 # something wrong.COMMENT
LOWlib/pry/method.rb21 extend Helpers::BaseHelpersCOMMENT
LOWlib/pry/method.rb141 alias from_module from_classCOMMENT
LOWlib/pry/indent.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/indent.rb81 # Clean the indentation of a fragment of ruby.COMMENT
LOWlib/pry/indent.rb121 @module_nesting = []COMMENT
LOWlib/pry/indent.rb181 # This is what's used between the prompt and the cursor in pry.COMMENT
LOWlib/pry/indent.rb201 #COMMENT
LOWlib/pry/indent.rb281 endCOMMENT
LOWlib/pry/indent.rb321 # @return StringCOMMENT
LOWlib/pry/indent.rb361 # Update the internal state relating to module nesting on 'end'.COMMENT
LOWlib/pry/input_lock.rb41 # 1) There are no owners, in this case we are good to go.COMMENT
LOWlib/pry/wrapped_module.rb181 # @return [Fixnum, nil] The associated line for the module (i.eCOMMENT
LOWlib/pry/wrapped_module.rb221COMMENT
LOWlib/pry/wrapped_module.rb281 endCOMMENT
LOWlib/pry/code.rb21 endCOMMENT
LOWlib/pry/code.rb61 # Attempt to extract the source code for module (or class) `mod`.COMMENT
LOWlib/pry/code.rb281COMMENT
LOWlib/pry/code_object.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/slop.rb41COMMENT
LOWlib/pry/slop.rb81 # config - A Hash of configuration options to pass to Slop.newCOMMENT
LOWlib/pry/slop.rb181 #COMMENT
LOWlib/pry/slop.rb201 #COMMENT
LOWlib/pry/slop.rb301 # Specify code to be executed when these options are parsed.COMMENT
LOWlib/pry/slop.rb321 raise ArgumentError, "You must specify a callable object or a block to #run"COMMENT
LOWlib/pry/slop.rb341 options.any? { |o| o.key == method_name.to_s.chop } || superCOMMENT
LOWlib/pry/slop.rb361 # Fetch a Slop::Option object.COMMENT
LOWlib/pry/slop.rb381 # Examples:COMMENT
LOWlib/pry/core_extensions.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/core_extensions.rb21 METHODCOMMENT
LOWlib/pry/core_extensions.rb41 # my_method()COMMENT
LOWlib/pry/core_extensions.rb61 # be defined on its singleton class (as in `class << self; end`).COMMENT
LOWlib/pry/core_extensions.rb81 # The scope is clear of local variables. Don't add any.COMMENT
LOWlib/pry/core_extensions.rb121 # The default definee (http://yugui.jp/articles/846) is set such that newCOMMENT
LOWlib/pry/pry_instance.rb1# frozen_string_literal: trueCOMMENT
LOWlib/pry/pry_instance.rb61 # @param [Hash] optionsCOMMENT
39 more matches not shown…
Self-Referential Comments15 hits · 45 pts
SeverityFileLineSnippetContext
MEDIUMlib/pry/class_command.rb6 # This class implements the bare-minimum functionality that a command shouldCOMMENT
MEDIUMlib/pry/code_object.rb4 # This class is responsible for taking a string (identifying aCOMMENT
MEDIUMlib/pry/slop.rb123 # Create a new instance of Slop and optionally build options via a block.COMMENT
MEDIUMlib/pry/repl.rb18 # Create an instance of {REPL} wrapping the given {Pry}.COMMENT
MEDIUMlib/pry/pry_instance.rb60 # Create a new {Pry} instance.COMMENT
MEDIUMlib/pry/pry_instance.rb114 # Initialize this instance by pushing its initial context into the bindingCOMMENT
MEDIUMlib/pry/repl_file_loader.rb57 # Define a few extra commands useful for flipping back & forthCOMMENT
MEDIUMlib/pry/command.rb113 # Create a new command with the given properties.COMMENT
MEDIUMlib/pry/command_set.rb10 # This class is used to create sets of commands. Commands can be imported fromCOMMENT
MEDIUMlib/pry/slop/commands.rb11 # Create a new instance of Slop::Commands and optionally buildCOMMENT
MEDIUMlib/pry/helpers/documentation_helpers.rb5 # This class contains methods useful for extractingCOMMENT
MEDIUMlib/pry/method/weird_method_locator.rb5 # This class is responsible for locating the *real* `Pry::Method`COMMENT
MEDIUMlib/pry/method/disowned.rb21 # Create a new Disowned method.COMMENT
MEDIUMlib/pry/wrapped_module/candidate.rb5 # This class represents a single candidate for a module/class definition.COMMENT
MEDIUMlib/pry/wrapped_module/candidate.rb112 # This method is used by `Candidate#source_location` as aCOMMENT
Hyper-Verbose Identifiers25 hits · 25 pts
SeverityFileLineSnippetContext
LOWlib/pry/editor.rb31 def edit_tempfile_with_content(initial_content, line = 1)CODE
LOWlib/pry/editor.rb60 def build_editor_invocation_string(file, line, blocking)CODE
LOWlib/pry/editor.rb115 def start_line_syntax_for_editor(file_name, line_number)CODE
LOWlib/pry/method.rb114 def lookup_method_via_binding(CODE
LOWlib/pry/method.rb210 def instance_resolution_order(klass)CODE
LOWlib/pry/method.rb238 def singleton_class_resolution_order(klass)CODE
LOWlib/pry/method.rb564 def method_name_from_first_line(first_ln)CODE
LOWlib/pry/slop.rb552 def execute_multiple_switches(option, argument, index)CODE
LOWlib/pry/command.rb329 def check_for_command_collision(command_match, arg_string)CODE
LOWlib/pry/command_set.rb173 def find_command_by_match_or_listing(match_or_listing)CODE
LOWlib/pry/code/loc.rb98 def handle_multiline_entries_from_edit_command(line, max_width)CODE
LOWlib/pry/commands/help.rb98 def display_filtered_search_results(search)CODE
LOWlib/pry/commands/help.rb111 def display_filtered_commands(search)CODE
LOWlib/pry/commands/edit.rb107 def ensure_file_name_is_valid(file_name)CODE
LOWlib/pry/commands/show_info.rb61 def code_object_with_accessible_source(code_object)CODE
LOWlib/pry/commands/show_info.rb77 def content_and_header_for_code_object(code_object)CODE
LOWlib/pry/commands/show_info.rb81 def content_and_headers_for_all_module_candidates(mod)CODE
LOWlib/pry/commands/amend_line.rb83 def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number)CODE
LOWlib/pry/commands/code_collector.rb139 def pry_array_content_as_string(array, ranges)CODE
LOWlib/pry/commands/hist.rb143 def check_for_juxtaposed_replay(replay_sequence)CODE
LOWlib/pry/commands/cat/file_formatter.rb59 def detect_code_type_from_file(file_name)CODE
LOWlib/pry/commands/ls/local_vars.rb35 def colorized_assignment_style(lhs, rhs, desired_width = 7)CODE
LOWlib/pry/helpers/command_helpers.rb106 def one_index_range_or_number(range_or_number)CODE
LOWlib/pry/helpers/documentation_helpers.rb57 def strip_comments_from_c_code(code)CODE
LOWlib/pry/wrapped_module/candidate.rb99 def first_line_of_module_definition(file, line)CODE
AI Slop Vocabulary5 hits · 14 pts
SeverityFileLineSnippetContext
LOWlib/pry/editor.rb146 # we can just use the program's name and ignore any absolute paths.COMMENT
MEDIUMlib/pry/cli.rb15 # utilize this facility in order to add and process their own PryCOMMENT
MEDIUMlib/pry/wrapped_module.rb364 # TODO: make this more robust as valid user-defined files calledCOMMENT
MEDIUMlib/pry/code_object.rb18 # TODO: This class is a clusterfuck. We need a much more robustCOMMENT
MEDIUMlib/pry/repl_file_loader.rb33 # Switch to non-interactive mode. EssentiallyCOMMENT
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippetContext
LOWlib/pry/history.rb101 # Check if the line match any option in the histignoreCOMMENT
LOWlib/pry/pry_instance.rb293 # Output the result or pass to an exception handler (if result is an exception).COMMENT
LOWlib/pry/commands/find_method.rb52 # Output the result of the search.COMMENT
LOWlib/pry/testable/pry_tester.rb32 # Check if this is a multiline paste.COMMENT
Fake / Example Data2 hits · 3 pts
SeverityFileLineSnippetContext
LOWlib/pry/helpers/command_helpers.rb61 # Lorem ipsum dolor sit amet, consectetur adipisicing elit,COMMENT
LOWlib/pry/helpers/command_helpers.rb61 # Lorem ipsum dolor sit amet, consectetur adipisicing elit,COMMENT