AI Slop Code RIsk Monitor

cool-RR/PySnooper

Never use print for debugging again

32.8 High pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for cool-RR/PySnooper, a Python project with 16,577 GitHub stars. SynthScan examined 6,960 lines of code across 37 source files, recording 190 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 32.8 (High 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.

32.8
Adjusted Signal
32.8
Raw Pattern Score
100%
Time Factor
2026-06-08
Last Push
16.6K
Stars
Python
Language
7.0K
Lines of Code
37
Files
190
Pattern Hits
2026-10-12
Scan Date
0.35
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 44.4/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 41.2/100 · MEDIUM

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

Agent Over-Engineering Ratio 51.7/100 · HIGH

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

PR Review Velocity Impact 85.5/100 · CRITICAL

Which changes need focused human review? 190 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

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

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 13MEDIUM 7LOW 170

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 190 distinct pattern matches across 12 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.

Unused Imports61 hits · 59 pts
SeverityFileLineSnippetContext
LOWpysnooper/__init__.py20CODE
LOWpysnooper/__init__.py21CODE
LOWpysnooper/__init__.py21CODE
LOWpysnooper/__init__.py21CODE
LOWpysnooper/__init__.py21CODE
LOWpysnooper/utils.py8CODE
LOWpysnooper/pycompat.py68CODE
LOWpysnooper/pycompat.py70CODE
LOWpysnooper/tracer.py14CODE
LOWtests/test_pysnooper.py8CODE
LOWtests/test_pysnooper.py18CODE
LOWtests/test_chinese.py5CODE
LOWtests/test_chinese.py6CODE
LOWtests/test_chinese.py7CODE
LOWtests/test_chinese.py8CODE
LOWtests/test_chinese.py9CODE
LOWtests/test_chinese.py11CODE
LOWtests/test_chinese.py12CODE
LOWtests/test_chinese.py16CODE
LOWtests/test_chinese.py17CODE
LOWtests/test_chinese.py17CODE
LOWtests/test_chinese.py17CODE
LOWtests/test_chinese.py17CODE
LOWtests/test_chinese.py17CODE
LOWtests/test_not_implemented.py4CODE
LOWtests/test_not_implemented.py6CODE
LOWtests/test_not_implemented.py7CODE
LOWtests/test_not_implemented.py8CODE
LOWtests/test_not_implemented.py9CODE
LOWtests/test_not_implemented.py12CODE
LOWtests/test_not_implemented.py16CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py18CODE
LOWtests/test_not_implemented.py23CODE
LOWtests/test_utils/test_regex.py4CODE
LOWtests/test_multiple_files/test_multiple_files.py4CODE
LOWtests/test_multiple_files/test_multiple_files.py5CODE
LOWtests/test_multiple_files/test_multiple_files.py6CODE
LOWtests/test_multiple_files/test_multiple_files.py7CODE
LOWtests/test_multiple_files/test_multiple_files.py8CODE
LOWtests/test_multiple_files/test_multiple_files.py9CODE
LOWtests/test_multiple_files/test_multiple_files.py11CODE
LOWtests/test_multiple_files/test_multiple_files.py12CODE
LOWtests/test_multiple_files/test_multiple_files.py14CODE
LOWtests/test_multiple_files/test_multiple_files.py15CODE
LOWtests/test_multiple_files/test_multiple_files.py16CODE
LOWtests/test_multiple_files/test_multiple_files.py16CODE
LOWtests/test_multiple_files/test_multiple_files.py16CODE
LOWtests/test_multiple_files/test_multiple_files.py16CODE
1 more matches not shown…
Empty Error Handlers9 hits · 45 pts
SeverityFileLineSnippetContext
HIGHpysnooper/variables.py73except Exception:CODE
HIGHpysnooper/tracer.py80except KeyError:CODE
HIGHpysnooper/tracer.py88except ImportError:CODE
HIGHpysnooper/tracer.py101except Exception:CODE
HIGHpysnooper/tracer.py111except Exception:CODE
HIGHpysnooper/tracer.py118except Exception:CODE
HIGHpysnooper/tracer.py124except utils.file_reading_errors:CODE
HIGHtests/mini_toolbox/pathlib.py1439except OSError:CODE
HIGHtests/samples/exception.py20except:CODE
Overly Generic Function Names43 hits · 28 pts
SeverityFileLineSnippetContext
LOWtests/test_pysnooper.py30 def my_function(foo):CODE
LOWtests/test_pysnooper.py43 CallEntry('def my_function(foo):'),CODE
LOWtests/test_pysnooper.py191 def my_function(foo):CODE
LOWtests/test_pysnooper.py206 CallEntry('def my_function(foo):'),CODE
LOWtests/test_pysnooper.py222 def my_function(foo):CODE
LOWtests/test_pysnooper.py250 CallEntry('def my_function(foo):',CODE
LOWtests/test_pysnooper.py268 CallEntry('def my_function(foo):',CODE
LOWtests/test_pysnooper.py286 CallEntry('def my_function(foo):',CODE
LOWtests/test_pysnooper.py311 def my_function(foo):CODE
LOWtests/test_pysnooper.py324 CallEntry('def my_function(foo):'),CODE
LOWtests/test_pysnooper.py352 def my_function():CODE
LOWtests/test_pysnooper.py368 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py401 def my_function():CODE
LOWtests/test_pysnooper.py417 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py460 def my_function():CODE
LOWtests/test_pysnooper.py475 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py507 def my_function():CODE
LOWtests/test_pysnooper.py522 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py543 def my_function():CODE
LOWtests/test_pysnooper.py557 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py572 def my_function():CODE
LOWtests/test_pysnooper.py586 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py601 def my_function():CODE
LOWtests/test_pysnooper.py615 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py634 def my_function():CODE
LOWtests/test_pysnooper.py647 CallEntry('def my_function():'),CODE
LOWtests/test_pysnooper.py769 def my_function(_foo):CODE
LOWtests/test_pysnooper.py783 CallEntry('def my_function(_foo):'),CODE
LOWtests/test_pysnooper.py809 def my_function(foo):CODE
LOWtests/test_pysnooper.py822 CallEntry('def my_function(foo):'),CODE
LOWtests/test_pysnooper.py905 def my_function(foo):STRING
LOWtests/test_pysnooper.py920 CallEntry('def my_function(foo):'),STRING
LOWtests/test_pysnooper.py939 def my_function(foo):STRING
LOWtests/test_pysnooper.py954 CallEntry('def my_function(foo):'),STRING
LOWtests/test_pysnooper.py965 CallEntry('def my_function(foo):'),STRING
LOWtests/test_pysnooper.py982 def my_function(foo):STRING
LOWtests/test_pysnooper.py1508 def my_function(foo):STRING
LOWtests/test_pysnooper.py1533 def my_method(self, foo):STRING
LOWtests/test_pysnooper.py1553 CallEntry('def my_method(self, foo):'),STRING
LOWtests/test_pysnooper.py1581 def my_method(self, foo):STRING
LOWtests/test_pysnooper.py1631 def my_method(self, foo):STRING
LOWtests/test_pysnooper.py1657 CallEntry('def my_method(self, foo):'),STRING
LOWtests/mini_toolbox/contextlib.py155 def helper(*args, **kwds):CODE
Hyper-Verbose Identifiers29 hits · 23 pts
SeverityFileLineSnippetContext
LOWmisc/generate_authors.py36def iterate_authors_by_chronological_order(branch):CODE
LOWpysnooper/tracer.py73def get_path_and_source_from_frame(frame):CODE
LOWtests/test_mini_toolbox.py9def test_output_capturer_doesnt_swallow_exceptions():CODE
LOW⚡tests/test_ended_by_exception.py23def test_negative_f_lasti_is_not_an_exception():CODE
LOW⚡tests/test_ended_by_exception.py31def test_last_opcode_return_is_normal_return():CODE
LOW⚡tests/test_ended_by_exception.py36def test_last_opcode_not_return_is_exception():CODE
LOW⚡tests/test_ended_by_exception.py41def test_non_return_event_is_never_exception():CODE
LOW⚡tests/test_ended_by_exception.py46def test_unstarted_generator_close_is_not_an_exception():CODE
LOWtests/utils.py43 def is_compatible_with_current_python_version(self):CODE
LOWtests/test_pysnooper.py498def test_single_watch_no_comma(normalize):CODE
LOWtests/test_pysnooper.py570def test_long_variable_with_custom_max_variable_length(normalize):CODE
LOWtests/test_pysnooper.py599def test_long_variable_with_infinite_max_variable_length(normalize):CODE
LOWtests/test_pysnooper.py798def test_confusing_decorator_lines(normalize):CODE
LOWtests/test_pysnooper.py899def test_no_overwrite_by_default():STRING
LOWtests/test_pysnooper.py978def test_error_in_overwrite_argument():STRING
LOWtests/test_pysnooper.py1566def test_class_with_decorated_method(normalize):STRING
LOWtests/test_pysnooper.py1615def test_class_with_decorated_method_and_snoop_applied_to_method(normalize):STRING
LOWtests/test_pysnooper.py1756def test_snooping_on_class_does_not_cause_base_class_to_be_snooped(normalize):STRING
LOWtests/test_pysnooper.py1866def test_normalize_thread_info():STRING
LOWtests/test_pysnooper.py1943def test_nested_exception_group():STRING
LOWtests/test_pysnooper.py2082def test_valid_damaged_zipfile():STRING
LOWtests/test_not_implemented.py26def test_rejecting_coroutine_functions():CODE
LOWtests/test_not_implemented.py44def test_rejecting_async_generator_functions():STRING
LOWtests/mini_toolbox/contextlib.py274 def _reraise_with_existing_context(exc_details):CODE
LOWtests/mini_toolbox/contextlib.py290 def _reraise_with_existing_context(exc_details):CODE
LOWtests/mini_toolbox/pathlib.py68def _try_except_fileexistserror(try_func, except_func, else_func=None):CODE
LOWtests/mini_toolbox/pathlib.py90def _try_except_filenotfounderror(try_func, except_func):CODE
LOWtests/mini_toolbox/pathlib.py106def _try_except_permissionerror_iter(try_iter, except_iter):CODE
LOWtests/test_utils/test_regex.py7def test_ansible_filename_pattern():CODE
Excessive Try-Catch Wrapping13 hits · 18 pts
SeverityFileLineSnippetContext
LOWpysnooper/variables.py33 except Exception:CODE
LOWpysnooper/variables.py61 except Exception:CODE
LOWpysnooper/variables.py73 except Exception:CODE
MEDIUMpysnooper/variables.py30def items(self, frame, normalize=False):CODE
MEDIUMpysnooper/variables.py69def _safe_keys(self, main_value):CODE
LOWpysnooper/utils.py72 except Exception:CODE
LOW⚡pysnooper/tracer.py101 except Exception:CODE
LOW⚡pysnooper/tracer.py111 except Exception:CODE
LOW⚡pysnooper/tracer.py118 except Exception:CODE
LOWpysnooper/tracer.py351 except Exception as e:CODE
LOWtests/mini_toolbox/__init__.py97 except Exception:CODE
LOWtests/samples/exception.py11 except Exception:CODE
MEDIUMtests/samples/exception.py8def bar():CODE
Cross-Language Confusion3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHtests/mini_toolbox/contextlib.py336 self.push(_exit_wrapper)CODE
HIGHtests/mini_toolbox/contextlib.py368 self.push(_exit_wrapper)CODE
HIGHtests/mini_toolbox/contextlib.py430 return self.push(callback)CODE
Deep Nesting13 hits · 13 pts
SeverityFileLineSnippetContext
LOWpysnooper/utils.py11CODE
LOWpysnooper/tracer.py73CODE
LOWpysnooper/tracer.py420CODE
LOWtests/mini_toolbox/pathlib.py106CODE
LOWtests/mini_toolbox/pathlib.py202CODE
LOWtests/mini_toolbox/pathlib.py286CODE
LOWtests/mini_toolbox/pathlib.py331CODE
LOWtests/mini_toolbox/pathlib.py395CODE
LOWtests/mini_toolbox/pathlib.py688CODE
LOWtests/mini_toolbox/pathlib.py733CODE
LOWtests/mini_toolbox/pathlib.py818CODE
LOWtests/mini_toolbox/pathlib.py689CODE
LOWtests/mini_toolbox/pathlib.py734CODE
Dead Code4 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMtests/mini_toolbox/pathlib.py676CODE
MEDIUMtests/mini_toolbox/pathlib.py704CODE
MEDIUMtests/mini_toolbox/pathlib.py728CODE
MEDIUMtests/mini_toolbox/pathlib.py750CODE
AI Response Leakage1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHtests/utils.py123 # Todo: Looking at this class, we could rework the hierarchy.COMMENT
AI Structural Patterns8 hits · 6 pts
SeverityFileLineSnippetContext
LOWpysnooper/tracer.py253CODE
LOWtests/utils.py136CODE
LOWtests/utils.py418CODE
LOWtests/test_pysnooper.py1805CODE
LOWtests/test_pysnooper.py1842CODE
LOWtests/test_pysnooper.py1878CODE
LOWtests/test_pysnooper.py1572CODE
LOWtests/test_pysnooper.py1621CODE
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippetContext
LOWrequirements.txt1#COMMENT
LOW.travis.yml41 # script: skipCOMMENT
LOWtests/mini_toolbox/contextlib.py101 # was passed to throw(). This prevents a StopIterationCOMMENT
LOWtests/mini_toolbox/contextlib.py241COMMENT
Modern Structural Boilerplate2 hits · 2 pts
SeverityFileLineSnippetContext
LOWtests/mini_toolbox/contextlib.py8__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack",CODE
LOWtests/mini_toolbox/pathlib.py51__all__ = [CODE