AI Slop Code RIsk Monitor

basecamp/fizzy

Kanban as it should be. Not as it has been.

5.5 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for basecamp/fizzy, a Ruby project with 8,244 GitHub stars. SynthScan examined 67,410 lines of code across 1097 source files, recording 220 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 5.5 (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.5
Adjusted Signal
5.5
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
8.2K
Stars
Ruby
Language
67.4K
Lines of Code
1.1K
Files
220
Pattern Hits
2026-10-12
Scan Date
0.01
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 17.4/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 7.8/100 · LOW

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

Agent Over-Engineering Ratio 7.6/100 · LOW

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

PR Review Velocity Impact 23.7/100 · LOW

Which changes need focused human review? 220 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 10HIGH 0MEDIUM 27LOW 183

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 220 distinct pattern matches across 10 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.

Hyper-Verbose Identifiers94 hits · 100 pts
SeverityFileLineSnippetContext
LOWapp/mailers/user_mailer.rb2 def email_change_confirmation(email_address:, token:, user:)CODE
LOWapp/models/application_platform.rb83 def extract_list_from_native_user_agent(prefix)CODE
LOWapp/models/color.rb17 def extract_from_legacy_export(value)CODE
LOWapp/models/signup.rb53 def handle_account_creation_error(error)CODE
LOWapp/models/card/readable.rb32 def inaccessible_notifications_from(sources, accessible_user_ids)CODE
LOWapp/models/card/eventable.rb35 def create_system_comment_for(event)CODE
LOWapp/models/card/exportable.rb41 def attachment_representation(attachment)CODE
LOWapp/models/board/accessible.rb43 def clean_inaccessible_data_for(user)CODE
LOWapp/models/board/storage.rb56 def sum_blob_bytes_in_batches(base_scope, record_ids)CODE
LOWapp/models/notification/event_payload.rb100 def card_url_with_comment_anchor(comment)CODE
LOWapp/models/magic_link/code.rb26 def remove_invalid_characters(code)CODE
LOWapp/models/zip_file/reader.rb95 def ensure_declared_within_budget(entry)CODE
LOWapp/models/user/email_address_changeable.rb7 def change_email_address_using_token(token)CODE
LOWapp/models/user/email_address_changeable.rb20 def send_email_address_change_confirmation(new_email_address)CODE
LOWapp/models/user/email_address_changeable.rb41 def generate_email_address_change_token(from: identity.email_address, to:, **options)CODE
LOWapp/models/user/attachable.rb7 def attachable_plain_text_representation(...)CODE
LOWapp/models/user/notifiable.rb18 def find_or_create_bundle_for(notification)CODE
LOWapp/models/user/notifiable.rb26 def expand_pending_bundle_for(notification)CODE
LOWapp/models/search/query.rb35 def remove_invalid_search_characters(terms)CODE
LOWapp/models/account/data_transfer/record_set.rb134 def check_associations_dont_exist(data)CODE
LOWapp/models/account/data_transfer/record_set.rb144 def check_association_doesnt_exist(data, association, associated_id)CODE
LOWapp/models/account/data_transfer/record_set.rb170 def check_unique_keys_available(data)CODE
LOWapp/models/account/data_transfer/record_set.rb182 def check_unique_key_available(column, value)CODE
LOWapp/models/account/data_transfer/manifest.rb78 def set_importable_model_names(record_sets)CODE
LOW…ount/data_transfer/action_text/rich_text_record_set.rb57 def transform_body_for_export(content)CODE
LOW…ount/data_transfer/action_text/rich_text_record_set.rb102 def transform_body_for_import(body)CODE
LOWapp/models/concerns/storage/tracked.rb71 def storage_attachments_for_records(recordables)CODE
LOWapp/javascript/helpers/scroll_helpers.js39function findNearestScrollableYAncestor(refElement) {CODE
LOWapp/javascript/helpers/scroll_helpers.js50function findNearestScrollableXAncestor(refElement) {CODE
LOWapp/controllers/prompts/cards_controller.rb32 def prepending_exact_matches_by_id(cards)CODE
LOWapp/controllers/concerns/authentication.rb16 def require_unauthenticated_access(**options)CODE
LOWapp/controllers/concerns/authentication.rb21 def allow_unauthenticated_access(**options)CODE
LOWapp/controllers/concerns/authorization.rb9 def allow_unauthorized_access(**options)CODE
LOWapp/controllers/concerns/authorization.rb13 def require_access_without_a_user(**options)CODE
LOW…/controllers/concerns/authentication/via_magic_link.rb15 def redirect_to_fake_session_magic_link(email_address, **options)CODE
LOW…/controllers/concerns/authentication/via_magic_link.rb25 def redirect_to_session_magic_link(magic_link, return_to: nil)CODE
LOW…/controllers/concerns/authentication/via_magic_link.rb36 def serve_development_magic_link(magic_link)CODE
LOW…/controllers/concerns/authentication/via_magic_link.rb43 def set_pending_authentication_token(magic_link)CODE
LOWapp/helpers/cards_helper.rb42 def button_to_remove_card_image(card)CODE
LOWapp/helpers/notifications_helper.rb42 def notification_toggle_read_button(notification, url:)CODE
LOW⚡app/helpers/notifications_helper.rb64 def notifications_next_page_link(page)CODE
LOW⚡app/helpers/notifications_helper.rb70 def bundle_email_frequency_options_for(settings)CODE
LOW⚡app/helpers/notifications_helper.rb80 def event_notification_action(event)CODE
LOW⚡app/helpers/notifications_helper.rb88 def comment_notification_body(event)CODE
LOWapp/helpers/filters_helper.rb14 def filter_selected_boards_title(user_filtering)CODE
LOWapp/helpers/accesses_helper.rb18 def access_involvement_advance_button(board, user, show_watchers: true, icon_only: false)CODE
LOWapp/helpers/bridge_helper.rb24 def bridge_share_card_description(card)CODE
LOWapp/helpers/bridge_helper.rb32 def bridge_share_board_description(board)CODE
LOWapp/helpers/clipboard_helper.rb2 def button_to_copy_to_clipboard(url, &)CODE
LOWapp/helpers/entropy_helper.rb2 def entropy_bubble_options_for(card)CODE
LOWapp/helpers/entropy_helper.rb10 def stalled_bubble_options_for(card)CODE
LOW⚡app/helpers/pagination_helper.rb63 def with_automatic_pagination(name, page, **properties)CODE
LOW⚡app/helpers/pagination_helper.rb72 def day_timeline_pagination_frame_tag(day_timeline, &)CODE
LOW⚡app/helpers/pagination_helper.rb76 def day_timeline_pagination_frame_id_for(day)CODE
LOW⚡app/helpers/pagination_helper.rb80 def day_timeline_pagination_link(day_timeline, filter)CODE
LOWtest/webmock_ipaddr_extension.rb38 def request_signature_from_request(net_http, request, body = nil)CODE
LOWtest/integration/active_storage_authorization_test.rb283 def attach_blob_as_rich_text_embed(container)CODE
LOWtest/integration/notifications_test.rb160 def assert_push_delivered_for(notification)CODE
LOWtest/integration/pagination_blob_html_xss_test.rb118 def create_unattached_html_blob(content_type: "text/html;charset=utf-8")CODE
LOWtest/models/card/pinnable_test.rb56 def assert_broadcasted_pin_update(&block)CODE
34 more matches not shown…
Hallucination Indicators10 hits · 100 pts
SeverityFileLineSnippetContext
CRITICALapp/controllers/boards_controller.rb38 @board.account.users.active.alphabetically.includes(:identity).partition { |user| selected_user_ids.include? user.CODE
CRITICALapp/controllers/notifications_controller.rb6 @unread = Current.user.notifications.unread.ordered.preloaded.limit(max_unread_notifications) unless current_page_paCODE
CRITICALapp/controllers/users_controller.rb9 set_page_and_extract_portion_from Current.account.users.active.alphabetically.includes(:identity)CODE
CRITICALapp/controllers/cards/assignments_controller.rb5 @assigned_to = @card.assignees.active.alphabetically.where.not(id: Current.user)CODE
CRITICALapp/controllers/cards/assignments_controller.rb6 @users = @board.users.active.alphabetically.where.not(id: @card.assignees).where.not(id: Current.user)CODE
CRITICALapp/controllers/cards/taggings_controller.rb6 @tags = Current.account.tags.all.alphabetically.where.not(id: @tagged_with)CODE
CRITICALapp/controllers/boards/accesses_controller.rb5 set_page_and_extract_portion_from @board.account.users.active.alphabetically.includes(:identity)CODE
CRITICALapp/controllers/notifications/trays_controller.rb17 Current.user.notifications.unread.preloaded.ordered.limit(MAX_ENTRIES_LIMIT)CODE
CRITICALapp/controllers/notifications/trays_controller.rb21 Current.user.notifications.read.preloaded.ordered.limit(MAX_ENTRIES_LIMIT)CODE
CRITICALscript/load-prod-db-in-dev.rb51 url = Rails.application.routes.url_helpers.root_url(Rails.application.config.action_controller.default_url_options.merCODE
Over-Commented Block71 hits · 71 pts
SeverityFileLineSnippetContext
LOWmise.saas.toml1# SaaS-only mise overlay, loaded when MISE_ENV=saas (mise environmentCOMMENT
LOWapp/models/zip_file/reader.rb1class ZipFile::ReaderCOMMENT
LOWapp/models/concerns/attachments.rb1module AttachmentsCOMMENT
LOWapp/javascript/lib/action_pack/passkey.js1// Web components for the ActionPack::Passkey Ruby helpers.COMMENT
LOWapp/jobs/search_reindex_job.rb1# Repair task — reindexes every searchable Card and Comment in the database.COMMENT
LOWapp/helpers/pagination_helper.rb1module PaginationHelperCOMMENT
LOWtest/integration/pagination_blob_html_xss_test.rb1require "test_helper"COMMENT
LOWtest/channels/solid_cable_adapter_test.rb1require "test_helper"COMMENT
LOWconfig/locales/en.yml1# Files in the config/locales directory are used for internationalization andCOMMENT
LOWconfig/locales/en.yml21#COMMENT
LOWconfig/environments/production.rb61 endCOMMENT
LOWconfig/environments/test.rb1require "active_support/core_ext/integer/time"COMMENT
LOWconfig/initializers/permissions_policy.rb1# Be sure to restart your server when you modify this file.COMMENT
LOWconfig/initializers/content_security_policy.rb1# Be sure to restart your server when you modify this file.COMMENT
LOWconfig/initializers/inflections.rb1# Be sure to restart your server when you modify this file.COMMENT
LOWconfig/initializers/active_storage_no_reuse.rb1# Enforce storage ledger integrity by preventing blob reuse in tracked contexts.COMMENT
LOWlib/rails_ext/active_record_replica_support.rb1# frozen_string_literal: trueCOMMENT
LOWlib/rails_ext/active_record_optimizer_hints.rb1# frozen_string_literal: trueCOMMENT
LOWlib/rails_ext/active_record_optimizer_hints.rb41 # ignore these comments, making this a safe no-op across all databases.COMMENT
LOWlib/rails_ext/active_record_optimizer_hints.rb61 #COMMENT
LOWlib/rails_ext/active_record_date_arithmetic.rb1# frozen_string_literal: trueCOMMENT
LOWlib/rails_ext/active_record_date_arithmetic.rb21 # # => "DATE_SUB(last_active_at, INTERVAL COALESCE(auto_postpone_period, 3600) SECOND)"COMMENT
LOWlib/rails_ext/active_storage_authorization.rb1# HackerOne #3943339: never serve a blob inline with a media type a browser orCOMMENT
LOWlib/action_pack/passkey.rb1# ActionPack::Passkey provides WebAuthn passkey registration and authentication backed by Active Record.COMMENT
LOWlib/action_pack/passkey.rb21# options = ActionPack::Passkey.authentication_optionsCOMMENT
LOWlib/action_pack/railtie.rb1require_relative "web_authn"COMMENT
LOWlib/action_pack/web_authn.rb1# = Action Pack WebAuthnCOMMENT
LOWlib/action_pack/web_authn.rb21#COMMENT
LOWlib/action_pack/passkey/holder.rb1# Adds passkey support to an Active Record model (the "holder" of passkeys).COMMENT
LOWlib/action_pack/passkey/holder.rb21# [+name+]COMMENT
LOWlib/action_pack/passkey/form_helper.rb1# View helpers for rendering passkey registration and sign-in buttons.COMMENT
LOWlib/action_pack/passkey/form_helper.rb41COMMENT
LOWlib/action_pack/passkey/request.rb1# = Action Pack Passkey RequestCOMMENT
LOWlib/action_pack/passkey/request.rb21# endCOMMENT
LOWlib/action_pack/passkey/challenges_controller.rb1# = Action Pack Passkey Challenges ControllerCOMMENT
LOWlib/action_pack/web_authn/relying_party.rb1# = Action Pack WebAuthn Relying PartyCOMMENT
LOWlib/action_pack/web_authn/relying_party.rb21# The relying party identifier, typically the application's domain nameCOMMENT
LOWlib/action_pack/web_authn/public_key_credential.rb1# = Action Pack WebAuthn Public Key CredentialCOMMENT
LOWlib/action_pack/web_authn/public_key_credential.rb21#COMMENT
LOWlib/action_pack/web_authn/public_key_credential.rb41# [+public_key+]COMMENT
LOWlib/action_pack/web_authn/current.rb1# = Action Pack WebAuthn Current AttributesCOMMENT
LOWlib/action_pack/web_authn/cose_key.rb1# = Action Pack WebAuthn COSE KeyCOMMENT
LOWlib/action_pack/web_authn/cose_key.rb21#COMMENT
LOWlib/action_pack/web_authn/cbor_decoder.rb1# = Action Pack WebAuthn CBOR DecoderCOMMENT
LOWlib/action_pack/web_authn/cbor_decoder.rb21# The decoder supports the following CBOR types:COMMENT
LOWlib/action_pack/web_authn/cbor_decoder.rb41# [Simple values]COMMENT
LOWlib/action_pack/web_authn/cbor_decoder.rb81COMMENT
LOWlib/action_pack/web_authn/authenticator/data.rb1# = Action Pack WebAuthn Authenticator DataCOMMENT
LOWlib/action_pack/web_authn/authenticator/data.rb21# data.user_verified? # => trueCOMMENT
LOWlib/action_pack/web_authn/authenticator/attestation.rb1# = Action Pack WebAuthn AttestationCOMMENT
LOWlib/action_pack/web_authn/authenticator/attestation.rb21#COMMENT
LOWlib/action_pack/web_authn/authenticator/response.rb1# = Action Pack WebAuthn Authenticator ResponseCOMMENT
LOWlib/action_pack/web_authn/authenticator/response.rb21# response = ActionPack::WebAuthn::Authenticator::AssertionResponse.new(COMMENT
LOW…ion_pack/web_authn/authenticator/assertion_response.rb1# = Action Pack WebAuthn Assertion ResponseCOMMENT
LOW…ion_pack/web_authn/authenticator/assertion_response.rb21# )COMMENT
LOW…n_pack/web_authn/authenticator/attestation_response.rb1# = Action Pack WebAuthn Attestation ResponseCOMMENT
LOW…/web_authn/authenticator/attestation_verifiers/none.rb1# = Action Pack WebAuthn None Attestation VerifierCOMMENT
LOW…ack/web_authn/public_key_credential/request_options.rb1# = Action Pack WebAuthn Public Key Credential Request OptionsCOMMENT
LOW…ck/web_authn/public_key_credential/creation_options.rb1# = Action Pack WebAuthn Public Key Credential Creation OptionsCOMMENT
LOW…ck/web_authn/public_key_credential/creation_options.rb21# A unique identifier for the user account. Will be Base64URL-encoded in theCOMMENT
11 more matches not shown…
Self-Referential Comments23 hits · 69 pts
SeverityFileLineSnippetContext
MEDIUMtest/integration/active_storage_authorization_test.rb110 # Create the draft card and attachment with proper Current contextCOMMENT
MEDIUMtest/models/webhook/triggerable_test.rb13 # Create a test eventCOMMENT
MEDIUMtest/models/storage/attachment_tracking_test.rb90 # Create a model that doesn't respond to :boardCOMMENT
MEDIUMtest/models/storage/attachment_tracking_test.rb104 # Create a card with nil board association won't happen in practiceCOMMENT
MEDIUMtest/models/storage/totaled_test.rb177 # Create a new account to destroy (don't destroy fixtures)COMMENT
MEDIUMtest/models/account/import_test.rb148 # Create a ZIP with no account.jsonCOMMENT
MEDIUM…data_transfer/action_text/rich_text_record_set_test.rb10 # Create a malicious ActionText record that points to the victim's cardCOMMENT
MEDIUMtest/controllers/cards_controller_test.rb289 # Create a card with custom timestamps (simulating import)COMMENT
MEDIUMconfig/initializers/permissions_policy.rb3# Define an application-wide HTTP permissions policy. For furtherCOMMENT
MEDIUMconfig/initializers/content_security_policy.rb3# Define an application-wide Content Security Policy.COMMENT
MEDIUMlib/action_pack/web_authn/authenticator/attestation.rb31# The following methods are delegated to +authenticator_data+:COMMENT
MEDIUMdb/schema.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMdb/schema.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
MEDIUMdb/queue_schema.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMdb/queue_schema.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
MEDIUMdb/cache_schema.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMdb/cache_schema.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
MEDIUMdb/cable_schema.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMdb/cable_schema.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
MEDIUMdb/schema_sqlite.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMdb/schema_sqlite.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
MEDIUMsaas/db/saas_schema.rb1# This file is auto-generated from the current state of the database. InsteadCOMMENT
MEDIUMsaas/db/saas_schema.rb5# This file is the source Rails uses to define your schema when running `bin/railsCOMMENT
Fake / Example Data10 hits · 10 pts
SeverityFileLineSnippetContext
LOWapp/javascript/controllers/upload_preview_controller.js4 static targets = [ "image", "input", "fileName", "placeholder" ]CODE
LOW…b_authn/public_key_credential/creation_options_test.rb8 name: "user@example.com",CODE
LOW…b_authn/public_key_credential/creation_options_test.rb16 assert_equal "user@example.com", @options.nameCODE
LOW…b_authn/public_key_credential/creation_options_test.rb42 assert_equal "user@example.com", user["name"]CODE
LOW…b_authn/public_key_credential/creation_options_test.rb59 name: "user@example.com",CODE
LOW…b_authn/public_key_credential/creation_options_test.rb81 name: "user@example.com",CODE
LOW…b_authn/public_key_credential/creation_options_test.rb100 name: "user@example.com",CODE
LOW…b_authn/public_key_credential/creation_options_test.rb113 name: "user@example.com",CODE
LOW…b_authn/public_key_credential/creation_options_test.rb124 name: "user@example.com",CODE
LOWdocs/api/sections/authentication.md53 -d '{"email_address": "user@example.com"}' \CODE
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMapp/models/account/seeder.rb24 # ---------------COMMENT
MEDIUMapp/models/account/seeder.rb26 # ---------------COMMENT
Example Usage Blocks4 hits · 6 pts
SeverityFileLineSnippetContext
LOWapp/jobs/search_reindex_job.rb12# Usage:COMMENT
LOWtest/webmock_ipaddr_extension.rb3# Usage:COMMENT
LOWlib/rails_ext/active_record_replica_support.rb6# Usage:COMMENT
LOWlib/rails_ext/active_record_date_arithmetic.rb6# Usage:COMMENT
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippetContext
LOWconfig/deploy.yml19 ssl: true # Set this to false if you *don't* want SSLCODE
LOWconfig/environments/production.rb25 # Set BASE_URL to your instance's public URL (e.g., https://fizzy.example.com)COMMENT
LOWconfig/environments/production.rb109 # Set this to true and configure the email server for immediate delivery to raise delivery errors.COMMENT
LOWconfig/environments/test.rb47 # Set host to be used by links generated in mailer templates.COMMENT
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMlib/action_pack/web_authn/public_key_credential.rb3# Represents a WebAuthn public key credential and orchestrates the registrationCOMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMdb/migrate/20251113163145_ensure_account_id_index.rb78 # a single index, since Triggerable only queries for `subscribed_actions` in conjunction withCOMMENT