AI Slop Code RIsk Monitor

paper-trail-gem/paper_trail

Track changes to your rails models

5.3 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for paper-trail-gem/paper_trail, a Ruby project with 7,030 GitHub stars. SynthScan examined 15,374 lines of code across 224 source files, recording 70 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 5.3 (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.3
Adjusted Signal
5.3
Raw Pattern Score
100%
Time Factor
2026-09-25
Last Push
7.0K
Stars
Ruby
Language
15.4K
Lines of Code
224
Files
70
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 23.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 6.3/100 · LOW

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

PR Review Velocity Impact 22.9/100 · LOW

Which changes need focused human review? 70 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 5LOW 65

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 70 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 Block39 hits · 39 pts
SeverityFileLineSnippetContext
LOW.rubocop_todo.yml1# This configuration was generated byCOMMENT
LOWspec/spec_helper.rb41 endCOMMENT
LOWspec/support/paper_trail_spec_migrator.rb1# frozen_string_literal: trueCOMMENT
LOWspec/dummy_app/app/models/elephant.rb1# frozen_string_literal: trueCOMMENT
LOWspec/dummy_app/config/environments/production.rb41 # See everything in the log (default is :info)COMMENT
LOWspec/dummy_app/config/environments/production.rb61 # config.action_mailer.raise_delivery_errors = falseCOMMENT
LOW…c/dummy_app/config/initializers/backtrace_silencers.rb1# frozen_string_literal: trueCOMMENT
LOWspec/dummy_app/config/initializers/mime_types.rb1# frozen_string_literal: trueCOMMENT
LOWspec/dummy_app/config/initializers/session_store.rb1# frozen_string_literal: trueCOMMENT
LOWspec/dummy_app/config/initializers/inflections.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail.rb61 # Set variables for the current request, eg. whodunnit.COMMENT
LOWlib/paper_trail.rb121 endCOMMENT
LOWlib/paper_trail/version_concern.rb81 #COMMENT
LOWlib/paper_trail/version_concern.rb101 Queries::Versions::WhereObject.new(self, args).executeCOMMENT
LOWlib/paper_trail/version_concern.rb121 # attribute had a given value. Imagine, in the example above, that someoneCOMMENT
LOWlib/paper_trail/version_concern.rb141 # `where_object_changes` which will find both the changes before andCOMMENT
LOWlib/paper_trail/version_concern.rb241 # @api privateCOMMENT
LOWlib/paper_trail/version_concern.rb321 changes = ActiveSupport::HashWithIndifferentAccess.new(object_changes_deserialized)COMMENT
LOWlib/paper_trail/cleaner.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail/request.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail/request.rb21 #COMMENT
LOWlib/paper_trail/reifier.rb41 # unversioned attributes to `nil`.COMMENT
LOWlib/paper_trail/reifier.rb121 # this method returns the constant `Dog`. If `attrs["species"]` is blank,COMMENT
LOWlib/paper_trail/has_paper_trail.rb21 # Each version of the model is available in the `versions` association.COMMENT
LOWlib/paper_trail/has_paper_trail.rb41 # - :skip - Fields to ignore completely. As with `ignore`, updates toCOMMENT
LOWlib/paper_trail/compatibility.rb1# frozen_string_literal: trueCOMMENT
LOW…ail/attribute_serializers/cast_attribute_serializer.rb21 # ```COMMENT
LOW…b/paper_trail/queries/versions/where_object_changes.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail/events/base.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail/events/base.rb301 # Returns a boolean indicating whether to store serialized version diffsCOMMENT
LOWlib/paper_trail/frameworks/rails/railtie.rb1# frozen_string_literal: trueCOMMENT
LOWlib/paper_trail/frameworks/rails/controller.rb21 #COMMENT
LOWlib/paper_trail/frameworks/rails/controller.rb41 #COMMENT
LOWlib/paper_trail/frameworks/rails/controller.rb61 # ```COMMENT
LOWlib/generators/paper_trail/install/install_generator.rb81 endCOMMENT
LOW…enerators/paper_trail/install/templates/paper_trail.rb1# frozen_string_literal: trueCOMMENT
LOW…enerators/paper_trail/install/templates/paper_trail.rb21## Define error handling behaviour.COMMENT
LOWdoc/bug_report_template.rb1# frozen_string_literal: trueCOMMENT
Hyper-Verbose Identifiers20 hits · 20 pts
SeverityFileLineSnippetContext
LOWspec/support/custom_object_changes_adapter.rb21 def where_object_changes_from(klass, attributes)CODE
LOWlib/paper_trail/version_concern.rb145 def where_object_changes_from(args = {})CODE
LOWlib/paper_trail/reifier.rb74 def init_model_by_finding_item_id(klass, version)CODE
LOWlib/paper_trail/reifier.rb131 def version_reification_class(version, attrs)CODE
LOWlib/paper_trail/model_config.rb134 def assert_concrete_activerecord_class(class_name)CODE
LOWlib/paper_trail/model_config.rb141 def assert_valid_recording_order_for_on_destroy(recording_order)CODE
LOWlib/paper_trail/model_config.rb172 def check_versions_association_name(options)CODE
LOWlib/paper_trail/model_config.rb192 def ensure_versions_option_is_hash(options)CODE
LOWlib/paper_trail/model_config.rb237 def setup_callbacks_from_options(options_on = [])CODE
LOWlib/paper_trail/record_trail.rb204 def assign_and_reset_version_association(version)CODE
LOWlib/paper_trail/events/base.rb61 def assert_metadatum_key_is_permitted(key)CODE
LOWlib/paper_trail/events/base.rb80 def nonskipped_attributes_before_change(is_touch)CODE
LOWlib/paper_trail/events/base.rb95 def attribute_in_previous_version(attr_name, is_touch)CODE
LOWlib/paper_trail/events/base.rb197 def merge_metadata_from_controller_into(data)CODE
LOWlib/paper_trail/events/base.rb206 def merge_metadata_from_model_into(data)CODE
LOWlib/paper_trail/events/base.rb234 def metadatum_from_model_method(event, method)CODE
LOWlib/paper_trail/events/base.rb265 def object_attrs_for_paper_trail(is_touch)CODE
LOWlib/paper_trail/events/base.rb285 def recordable_object_changes(changes)CODE
LOWlib/paper_trail/events/update.rb57 def merge_object_changes_into(data)CODE
LOWlib/generators/paper_trail/migration_generator.rb21 def add_paper_trail_migration(template, extra_options = {})CODE
AI Slop Vocabulary5 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUM.rubocop.yml172# The semantic style is too nuanced to lint, so the cop is disabled.COMMENT
MEDIUM.rubocop.yml194# and it's not clear that it can be linted. Certainly, the defaultCOMMENT
LOWspec/paper_trail/version_limit_spec.rb56 # just create them out-of-order:COMMENT
LOWspec/models/widget_spec.rb888 # Workaround for AR 3. When we drop AR 3 support, we can simply useCOMMENT
LOWlib/paper_trail/record_trail.rb174 # `@record.update_columns` skips dirty-tracking, so we can't just useCOMMENT
Self-Referential Comments3 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMspec/models/pet_spec.rb55 # Creating an object from the base class is correctly identified as "Animal"COMMENT
MEDIUMspec/generators/paper_trail/install_generator_spec.rb73 contains "# This file is automatically generated"CODE
MEDIUM…enerators/paper_trail/install/templates/paper_trail.rb3# This file is automatically generated by `rails generate paper_trail:install`COMMENT
Slop Phrases2 hits · 3 pts
SeverityFileLineSnippetContext
LOWlib/paper_trail/frameworks/rails/controller.rb37 # in your `versions` table, so don't forget to add any new columnsCOMMENT
LOWlib/paper_trail/frameworks/rails/controller.rb37 # in your `versions` table, so don't forget to add any new columnsCOMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWlib/paper_trail/version_number.rb14 # Set PRE to nil unless it's a pre-release (beta, rc, etc.)COMMENT