For empowering community 🌱
This report summarizes scanner evidence for forem/forem, a Ruby project with 22,817 GitHub stars. SynthScan examined 507,281 lines of code across 5370 source files, recording 1108 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 2.8 (Low 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.
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.
Can maintainers explain intent, assumptions, and trade-offs? 928 finding(s).
Are imports declared and package/API names verified? 180 finding(s).
Are wrappers, guards, and repeated structures necessary? 451 finding(s).
Which changes need focused human review? 1108 finding(s).
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.
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.
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.
The scanner identified 1108 distinct pattern matches across 13 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …dedFlows/adminFlows/config/monetizationSection.spec.js | 8 | function withinMonetizationSection(callback) { | CODE |
| LOW | cypress/e2e/seededFlows/adminFlows/shared/utilities.js | 7 | export function verifyAndDismissFlashMessage(message, flashTypeId) { | CODE |
| LOW | app/mailers/devise_mailer.rb | 46 | def confirmation_instructions(record, token, opts = {}) | CODE |
| LOW | app/mailers/devise_mailer.rb | 72 | def reset_password_instructions(record, token, opts = {}) | CODE |
| LOW | app/mailers/devise_mailer.rb | 137 | def determine_subforem_domain(subforem_id) | CODE |
| LOW | app/mailers/application_mailer.rb | 29 | def generate_unsubscribe_token(id, email_type) | CODE |
| LOW | app/mailers/application_mailer.rb | 95 | def determine_subforem_domain(subforem_id) | CODE |
| LOW | app/mailers/custom_mailer.rb | 80 | def setup_custom_email_footer(email) | CODE |
| LOW | app/mailers/concerns/deliverable.rb | 45 | def customerio_delivery_options(options) | CODE |
| LOW | app/decorators/article_decorator.rb | 62 | def title_with_query_preamble(user_signed_in) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 70 | def subscription_to_article_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 78 | def subscription_to_comment_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 86 | def subscription_to_comment_ancestry_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 94 | def subscription_to_commentable_article_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 102 | def subscription_to_notifiable_for(user, **notifiable) | CODE |
| LOW | app/decorators/notification_decorator.rb | 297 | def preloaded_subscriptions_for(user) | CODE |
| LOW | app/decorators/notification_decorator.rb | 339 | def preloaded_comment_replies_for(user) | CODE |
| LOW | app/models/reaction.rb | 103 | def surrogate_key_for_article(article_id) | CODE |
| LOW | app/models/reaction.rb | 107 | def surrogate_key_for_commentable(commentable) | CODE |
| LOW | app/models/reaction.rb | 155 | def contradictory_mod_reactions(category:, reactable_id:, reactable_type:, user:) | CODE |
| LOW | app/models/article.rb | 898 | def legacy_truncate_title_for_feed(source_title = title.to_s.gsub("<", "<").gsub(">", ">")) | CODE |
| LOW | app/models/article.rb | 1654 | def set_ai_disclosure_from_front_matter(hash) | CODE |
| LOW | app/models/article.rb | 1711 | def remove_tag_adjustments_from_tag_list(distinct_adjustments) | CODE |
| LOW | app/models/article.rb | 1716 | def add_tag_adjustments_to_tag_list(distinct_adjustments) | CODE |
| LOW | app/models/article.rb | 1895 | def touch_actor_latest_article_updated_at(destroying: false) | CODE |
| LOW | app/models/tag.rb | 243 | def submission_template_customized(param_0 = nil) | CODE |
| LOW | app/models/user_activity.rb | 56 | def assign_recent_article_metadata(recent_articles) | CODE |
| LOW | app/models/user_activity.rb | 70 | def legacy_assign_recent_article_metadata(recent_articles) | CODE |
| LOW | app/models/notification_subscription.rb | 29 | def update_notification_subscriptions(notifiable) | CODE |
| LOW | app/models/scheduled_automation.rb | 205 | def calculate_hourly_next_run(from_time) | CODE |
| LOW | app/models/scheduled_automation.rb | 227 | def calculate_weekly_next_run(from_time) | CODE |
| LOW | app/models/scheduled_automation.rb | 246 | def calculate_custom_interval_next_run(from_time) | CODE |
| LOW | app/models/campaign.rb | 50 | def plucked_article_attributes(limit: 5, attributes: %i[path title comments_count created_at]) | CODE |
| LOW | app/models/tweet.rb | 60 | def create_tweet_from_api_status(status) | CODE |
| LOW | app/models/tweet.rb | 81 | def extract_metadata_attributes(tweet, status) | CODE |
| LOW | app/models/tweet.rb | 95 | def extract_serializable_attributes(tweet, status) | CODE |
| LOW | app/models/user_block.rb | 23 | def cached_blocked_ids_for_blocker(blocker_id) | CODE |
| LOW | app/models/notification.rb | 45 | def send_new_follower_notification(follow, is_read: false) | CODE |
| LOW | app/models/notification.rb | 58 | def send_new_follower_notification_without_delay(follow, is_read: false) | CODE |
| LOW | app/models/notification.rb | 66 | def send_to_mentioned_users_and_followers(notifiable, _action = nil) | CODE |
| LOW⚡ | app/models/notification.rb | 88 | def send_co_author_invitation_notification(invitation) | CODE |
| LOW⚡ | app/models/notification.rb | 96 | def send_new_comment_notifications_without_delay(comment) | CODE |
| LOW⚡ | app/models/notification.rb | 103 | def send_new_badge_achievement_notification(badge_achievement) | CODE |
| LOW⚡ | app/models/notification.rb | 107 | def send_reaction_notification(reaction, receiver) | CODE |
| LOW⚡ | app/models/notification.rb | 114 | def send_reaction_notification_without_delay(reaction, receiver) | CODE |
| LOW⚡ | app/models/notification.rb | 121 | def send_mention_notification(mention) | CODE |
| LOW⚡ | app/models/notification.rb | 127 | def send_mention_notification_without_delay(mention) | CODE |
| LOW⚡ | app/models/notification.rb | 133 | def send_welcome_notification(receiver_id, broadcast_id) | CODE |
| LOW⚡ | app/models/notification.rb | 137 | def send_moderation_notification(notifiable) | CODE |
| LOW⚡ | app/models/notification.rb | 147 | def send_tag_adjustment_notification(tag_adjustment) | CODE |
| LOW⚡ | app/models/notification.rb | 151 | def send_milestone_notification(type:, article_id:) | CODE |
| LOW⚡ | app/models/notification.rb | 155 | def remove_all_by_action_without_delay(notifiable_ids:, notifiable_type:, action: nil) | CODE |
| LOW | app/models/notification.rb | 177 | def fast_destroy_old_notifications(destroy_before_timestamp = ENV.fetch("FAST_DESTROY_OLD_NOTIFICATIONS_DAYS", 85).t | CODE |
| LOW | app/models/notification.rb | 230 | def reaction_notification_attributes(reaction, receiver) | CODE |
| LOW | app/models/badge_achievement.rb | 103 | def find_positive_reactors_to_user_articles(user) | CODE |
| LOW | app/models/organization.rb | 256 | def validate_header_cta_links(links) | CODE |
| LOW | app/models/billboard.rb | 552 | def extract_internal_article_paths(html) | CODE |
| LOW | app/models/billboard.rb | 660 | def extracted_process_markdown(markdown) | CODE |
| LOW | app/models/github_issue.rb | 58 | def comment_repo_and_issue_id(url) | CODE |
| LOW | app/models/github_issue.rb | 62 | def issue_or_pull_repo_and_issue_id(url) | CODE |
| 391 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .rubocop_todo.yml | 1 | # This configuration was generated by | COMMENT |
| LOW | .rubocop.yml | 81 | COMMENT | |
| LOW | .rubocop.yml | 541 | COMMENT | |
| LOW | cypress/plugins/index.js | 1 | /// <reference types="cypress" /> | COMMENT |
| LOW | cypress/support/commands.js | 1 | import { getInterceptsForLingeringUserRequests } from '../util/networkUtils'; | COMMENT |
| LOW | cypress/support/commands.js | 521 | // resolve(origVal); | COMMENT |
| LOW | cypress/support/e2e.js | 1 | // *********************************************************** | COMMENT |
| LOW | cypress/e2e/seededFlows/searchFlows/searchForm.spec.js | 1 | // describe('Search form', () => { | COMMENT |
| LOW | …edFlows/articleFlows/playOrPauseAnimatedImages.spec.js | 1 | // describe('play or pause animated images', () => { | COMMENT |
| LOW | …edFlows/articleFlows/playOrPauseAnimatedImages.spec.js | 21 | // } | COMMENT |
| LOW | …edFlows/articleFlows/playOrPauseAnimatedImages.spec.js | 41 | // // .as('pauseButtons') | COMMENT |
| LOW | …edFlows/articleFlows/playOrPauseAnimatedImages.spec.js | 61 | // describe('user prefers reduced motion', () => { | COMMENT |
| LOW | …edFlows/articleFlows/playOrPauseAnimatedImages.spec.js | 81 | // cy.get('@pauseButtons').last().as('lastButton'); | COMMENT |
| LOW | app/mailers/concerns/deliverable.rb | 1 | module Deliverable | COMMENT |
| LOW | app/mailers/concerns/deliverable.rb | 121 | if customerio_recipient | COMMENT |
| LOW | app/queries/comments/community_wellness_query.rb | 1 | # This query will return an array of hashes that have the following structure: | COMMENT |
| LOW | app/queries/articles/active_threads_query.rb | 1 | module Articles | COMMENT |
| LOW | app/models/article.rb | 21 | # we cache. | COMMENT |
| LOW | app/models/article.rb | 401 | if: -> { saved_change_to_published? && published_before_last_save && !published? } | COMMENT |
| LOW | app/models/article.rb | 461 | ).freeze | COMMENT |
| LOW | app/models/tag.rb | 1 | # We allow content creators to "tag" their content. This model helps | COMMENT |
| LOW | app/models/tag.rb | 61 | before_save :calculate_hotness_score | COMMENT |
| LOW | app/models/tag.rb | 141 | # can push up changes and refactor towards improvements without unleashing a large pull request | COMMENT |
| LOW | app/models/tag.rb | 161 | # @note This method will also add the follower's "points" for the given tag. In the | COMMENT |
| LOW | app/models/tag.rb | 201 | COMMENT | |
| LOW | app/models/tag.rb | 281 | # | COMMENT |
| LOW | app/models/tag.rb | 321 | # each article (see SHA | COMMENT |
| LOW | app/models/poll.rb | 41 | # | COMMENT |
| LOW | app/models/ab_experiment.rb | 1 | # This object wraps the FieldTest logic to provide a bit of insulation | COMMENT |
| LOW | app/models/ab_experiment.rb | 21 | COMMENT | |
| LOW | app/models/ab_experiment.rb | 61 | COMMENT | |
| LOW | app/models/ab_experiment.rb | 81 | # @param user [User] who are we running the experiment with | COMMENT |
| LOW | app/models/ab_experiment.rb | 101 | end | COMMENT |
| LOW | app/models/admin_menu.rb | 81 | # | COMMENT |
| LOW | app/models/campaign.rb | 41 | # values for the selected articles. Which means be mindful | COMMENT |
| LOW | app/models/cross_model_slug.rb | 1 | # | COMMENT |
| LOW | app/models/async_info.rb | 1 | # Responsible for generating the asynchronus data of a user. This is data that we send on the wire | COMMENT |
| LOW | app/models/page.rb | 41 | COMMENT | |
| LOW | app/models/article_activity.rb | 1 | # Per-article rolled-up analytics cache. One row per Article. | COMMENT |
| LOW | app/models/co_author_invitation.rb | 1 | # An article author's request to credit another user as a co-author. The invitee confirms or | COMMENT |
| LOW | app/models/navigation_link.rb | 61 | # @param url [String] the URL of the navigation link. | COMMENT |
| LOW | app/models/user.rb | 241 | .where("users.score >= 0") | COMMENT |
| LOW | app/models/user.rb | 601 | if ENV["ENABLE_REFRESH_SEGMENT_WORKERS"] == "true" | COMMENT |
| LOW | app/models/user.rb | 621 | # `user.has_role?(:tech_admin)`. | COMMENT |
| LOW | app/models/user.rb | 721 | favorite_base_allowance - spent_this_period | COMMENT |
| LOW | app/models/settings/general.rb | 101 | setting :stripe_publishable_key, type: :string, default: ApplicationConfig["STRIPE_PUBLISHABLE_KEY"] | COMMENT |
| LOW | app/models/settings/general.rb | 121 | # - If this data is ever used for ads (e.g. billboard targeting), it must be allowed for | COMMENT |
| LOW | app/models/settings/ai_functions.rb | 1 | module Settings | COMMENT |
| LOW | app/models/articles/feeds.rb | 21 | COMMENT | |
| LOW | app/models/articles/feeds.rb | 41 | # @note the days_since_published is something carried | COMMENT |
| LOW | app/models/articles/feeds/variant_assembler.rb | 21 | # | COMMENT |
| LOW | app/models/articles/feeds/variant_assembler.rb | 41 | # @param variant [#to_sym,String,Symbol] the name of the variant we're assembling | COMMENT |
| LOW | app/models/articles/feeds/relevancy_lever.rb | 41 | ) do | COMMENT |
| LOW | app/policies/application_policy.rb | 1 | ## | COMMENT |
| LOW | app/policies/application_policy.rb | 21 | # @example | COMMENT |
| LOW | app/policies/application_policy.rb | 41 | # | COMMENT |
| LOW | app/policies/application_policy.rb | 61 | # | COMMENT |
| LOW | app/policies/application_policy.rb | 81 | # | COMMENT |
| LOW | app/policies/authorizer.rb | 1 | ## | COMMENT |
| LOW | app/policies/authorizer.rb | 101 | # you. | COMMENT |
| 193 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/models/article.rb | 1692 | # This method is called before validation, so that the tag_list can be validated. | COMMENT |
| MEDIUM | app/models/article.rb | 2165 | # Create the expected embed tags | COMMENT |
| MEDIUM | app/models/email.rb | 47 | # Define the mapping of merge tags to user attributes | COMMENT |
| MEDIUM | app/models/page_template.rb | 64 | # Create a fork of this template | COMMENT |
| MEDIUM | app/models/articles/feeds/variant_assembler.rb | 3 | # This module is responsible for assembling a named variant into the data structure used to | COMMENT |
| MEDIUM | app/models/articles/feeds/lever_catalog_builder.rb | 3 | # This class is responsible for publishing/registering the available relevancy and order levers. | COMMENT |
| MEDIUM | app/models/users/deleted_user.rb | 2 | # This module represents a deleted user. In particular as it | COMMENT |
| MEDIUM | app/policies/application_policy.rb | 94 | # This method provides a means for creating consistent DOM classes for "policy" related HTML elements. | COMMENT |
| MEDIUM | app/policies/authorizer.rb | 2 | # This module is providing a "crease in the code" for refactoring. | COMMENT |
| MEDIUM | app/policies/authorizer.rb | 30 | # This class is responsible for assisting in moving us away from | COMMENT |
| MEDIUM | app/view_objects/data_info.rb | 4 | # This module provides some much needed character escaping to ensure | COMMENT |
| MEDIUM | app/lib/menu.rb | 1 | # This class is responsible for helping to build a menu. | COMMENT |
| MEDIUM | app/lib/string_attribute_cleaner.rb | 1 | # This module provides a method for generating a configurable before_validation | COMMENT |
| MEDIUM | app/workers/scheduled_automations/process_worker.rb | 81 | # Create the automation | COMMENT |
| MEDIUM | app/controllers/application_controller.rb | 219 | # This method is envisioned as a :before_action callback. | COMMENT |
| MEDIUM | app/controllers/application_controller.rb | 296 | # This method is used by Devise to decide which is the path to redirect | COMMENT |
| MEDIUM | app/controllers/stories_controller.rb | 284 | # Create a relation that preserves the order when .ids is called by find_each_respecting_scope | COMMENT |
| MEDIUM | app/controllers/podcasts_controller.rb | 65 | # Create the podcast object to add errors to for the view | COMMENT |
| MEDIUM | app/helpers/application_helper.rb | 544 | # This function is responsible for adding a policy class (and possibly the hidden class). It's | COMMENT |
| MEDIUM | app/services/open_graph.rb | 1 | # This class provides methods for getting structured metadata properties for | COMMENT |
| MEDIUM | app/services/feature_flag.rb | 1 | # This module provides mechanisms for toggling on and off features. | COMMENT |
| MEDIUM | app/services/community_bots/create_bot.rb | 27 | # Create the bot user directly | COMMENT |
| MEDIUM | app/services/community_bots/create_bot.rb | 47 | # Create an API secret for the bot | COMMENT |
| MEDIUM | app/services/community_bots/create_bot.rb | 147 | # Create a temp file with the correct extension | COMMENT |
| MEDIUM | app/services/community_bots/create_bot.rb | 153 | # Create a file object that can be used by the uploader | COMMENT |
| MEDIUM | app/services/spam/handler.rb | 2 | # This module is responsible for handling spam in our various user input sources. | COMMENT |
| MEDIUM | app/services/images/generate_subforem_images.rb | 100 | # Create a temporary file | COMMENT |
| MEDIUM | app/services/moderator/unpublish_all_articles.rb | 2 | # Create a corresponding audit_log record | COMMENT |
| MEDIUM | app/services/articles/page_view_updater.rb | 2 | # This module is responsible for updating a specific page view for a given article and user. | COMMENT |
| MEDIUM | app/services/ai/image_generator.rb | 329 | # Create a temporary file | COMMENT |
| MEDIUM | app/services/ai/forem_tags.rb | 180 | # Create a new tag with a different name | COMMENT |
| MEDIUM | app/services/ai/context_note_generator.rb | 20 | # Create the context note with the response | COMMENT |
| MEDIUM | config/initializers/rpush.rb | 26 | # Define a custom logger. | COMMENT |
| MEDIUM | config/initializers/sidekiq.rb | 59 | # Create a new configuration hash with the correct pool size | COMMENT |
| MEDIUM | config/initializers/permissions_policy.rb | 1 | # Define an application-wide HTTP permissions policy. For further | COMMENT |
| MEDIUM | config/initializers/content_security_policy.rb | 3 | # Define an application-wide content security policy | COMMENT |
| MEDIUM | spec/models/collection_spec.rb | 84 | # Create a collection with one user | COMMENT |
| MEDIUM | spec/models/reaction_spec.rb | 405 | # Create a new reaction | COMMENT |
| MEDIUM | spec/models/navigation_link_spec.rb | 79 | # Creating a different URL | COMMENT |
| MEDIUM | spec/models/article_spec.rb | 3523 | # Create a new reaction | COMMENT |
| MEDIUM | spec/models/organization_spec.rb | 306 | # Create an organization and article, verify the article has cached the initial profile | COMMENT |
| MEDIUM | spec/models/billboard_spec.rb | 1305 | # Create a config for the placement area | COMMENT |
| MEDIUM | spec/models/reaction_ring_detection_spec.rb | 25 | # Create a privileged reaction (not public) | COMMENT |
| MEDIUM | spec/models/ahoy/store_spec.rb | 14 | # Create a real instance of Ahoy::Store to test behavior | COMMENT |
| MEDIUM | spec/requests/stripe_subscriptions_spec.rb | 236 | # Create a mock product and price | COMMENT |
| MEDIUM | spec/requests/stripe_subscriptions_spec.rb | 243 | # Create a mock customer | COMMENT |
| MEDIUM | spec/requests/stripe_subscriptions_spec.rb | 254 | # Create a mock subscription using the created price | COMMENT |
| MEDIUM | spec/requests/subforems_spec.rb | 427 | # Create an unsupported relationship first | COMMENT |
| MEDIUM | spec/requests/user_subscriptions_spec.rb | 111 | # Create the UserSubscription directly so it results in a | COMMENT |
| MEDIUM | spec/requests/poll_votes_controller_spec.rb | 173 | # Create a vote to complete the survey | COMMENT |
| MEDIUM | spec/requests/poll_text_responses_controller_spec.rb | 100 | # Create a response to complete the survey | COMMENT |
| MEDIUM | spec/requests/surveys_spec.rb | 49 | # Create a vote for a poll that is NOT in the survey | COMMENT |
| MEDIUM | …equests/admin/scheduled_automations_controller_spec.rb | 26 | automation # Create the automation | CODE |
| MEDIUM | …equests/admin/scheduled_automations_controller_spec.rb | 252 | automation # Create the automation first | CODE |
| MEDIUM | …ec/requests/admin/badge_automations_controller_spec.rb | 36 | automation # Create the automation | CODE |
| MEDIUM | …ec/requests/admin/badge_automations_controller_spec.rb | 295 | automation # Create the automation | CODE |
| MEDIUM | spec/requests/notifications/reads_spec.rb | 29 | # Create an org admin with an organization | COMMENT |
| MEDIUM | spec/system/sidebar_tooltip_spec.rb | 5 | # Create a user and sign in to ensure sidebar is visible | COMMENT |
| MEDIUM | spec/system/sidebar_tooltip_spec.rb | 9 | # Create a root subforem so the sidebar appears | COMMENT |
| MEDIUM | spec/support/seeds/seeds_e2e.rb | 452 | # Create a follow notification to test against | COMMENT |
| 26 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ess/e2e/creatorOnboardingFlows/creatorSettings.spec.js | 24 | .invoke('attr', 'placeholder') | CODE |
| LOW | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 10 | email: 'test@test.com', | CODE |
| LOW | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 31 | cy.findByRole('article').findByText('test@test.com').should('exist'); | CODE |
| LOW | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 42 | cy.findByRole('article').findByText('test@test.com').should('exist'); | CODE |
| LOW | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 57 | cy.findByRole('article').findByText('test@test.com').should('exist'); | CODE |
| LOW | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 63 | cy.findByRole('article').findByText('test@test.com').should('exist'); | CODE |
| LOW⚡ | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 80 | cy.findByRole('table').findByText('test@test.com').should('exist'); | CODE |
| LOW⚡ | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 86 | cy.findByRole('table').findByText('test@test.com').should('exist'); | CODE |
| LOW⚡ | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 91 | cy.findByRole('table').findByText('test@test.com').should('not.exist'); | CODE |
| LOW⚡ | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 95 | cy.findByRole('table').findByText('test@test.com').should('exist'); | CODE |
| LOW⚡ | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 103 | cy.findByRole('table').findByText('test@test.com').should('exist'); | CODE |
| LOW⚡ | …/e2e/seededFlows/adminFlows/users/invitedUsers.spec.js | 109 | cy.findByRole('table').findByText('test@test.com').should('not.exist'); | CODE |
| LOW | …mponents/__stories__/TagAutocompleteOption.stories.jsx | 33 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eget ultricies enim, quis finibus erat. Phasellus | CODE |
| LOW | …mponents/__stories__/TagAutocompleteOption.stories.jsx | 33 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eget ultricies enim, quis finibus erat. Phasellus | CODE |
| LOW | app/javascript/listings/__tests__/BodyMarkdown.test.jsx | 31 | expect(textArea.getAttribute('placeholder')).toEqual('...'); | CODE |
| LOW | app/javascript/Search/__tests__/Search.test.jsx | 46 | expect(searchInput.getAttribute('placeholder')).toEqual(locale('core.search_placeholder')); | CODE |
| LOW | …ript/crayons/Dropdown/__stories__/Dropdown.stories.jsx | 29 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …ript/crayons/Dropdown/__stories__/Dropdown.stories.jsx | 29 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …avascript/crayons/Dropdown/__tests__/Dropdown.test.jsx | 10 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …avascript/crayons/Dropdown/__tests__/Dropdown.test.jsx | 10 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …avascript/crayons/Dropdown/__tests__/Dropdown.test.jsx | 24 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …avascript/crayons/Dropdown/__tests__/Dropdown.test.jsx | 24 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …avascript/crayons/Dropdown/__tests__/Dropdown.test.jsx | 35 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …avascript/crayons/Dropdown/__tests__/Dropdown.test.jsx | 35 | Hey, I'm a dropdown content! Lorem ipsum dolor sit amet, | CODE |
| LOW | …s/RadioButton/__stories__/radioButton.html.stories.jsx | 48 | This is some description for a textfield lorem ipsum... | CODE |
| LOW | …lements/Checkbox/__stories__/checkbox.html.stories.jsx | 52 | This is some description for a textfield lorem ipsum... | CODE |
| LOW | …ns/formElements/Text/__stories__/text.html.stories.jsx | 34 | This is some description for a textfield lorem ipsum... | CODE |
| LOW | …utocomplete/__tests__/MultiSelectAutocomplete.test.jsx | 712 | expect(input).toHaveAttribute('placeholder', ''); | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 16 | <p className="fs-xs">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 16 | <p className="fs-xs">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 17 | <p className="fs-s">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 17 | <p className="fs-s">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 18 | <p className="fs-base">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 18 | <p className="fs-base">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 19 | <p className="fs-l">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 19 | <p className="fs-l">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 20 | <p className="fs-xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 20 | <p className="fs-xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 21 | <p className="fs-2xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 21 | <p className="fs-2xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 22 | <p className="fs-3xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 22 | <p className="fs-3xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 23 | <p className="fs-4xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 23 | <p className="fs-4xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 24 | <p className="fs-5xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 24 | <p className="fs-5xl">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 28 | <p className="fs-xs fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 28 | <p className="fs-xs fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 29 | <p className="fs-s fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 29 | <p className="fs-s fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 30 | <p className="fs-base fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 30 | <p className="fs-base fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 31 | <p className="fs-l fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 31 | <p className="fs-l fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 32 | <p className="fs-xl fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 32 | <p className="fs-xl fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 33 | <p className="fs-2xl fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 33 | <p className="fs-2xl fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 34 | <p className="fs-3xl fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| LOW⚡ | …/crayons/typography/__stories__/typography.stories.jsx | 34 | <p className="fs-3xl fw-medium">Lorem ipsum dolor sit amet.</p> | CODE |
| 120 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/mailers/digest_mailer.rb | 59 | # Check if user follows any subforems OR has a custom onboarding subforem | COMMENT |
| LOW | app/mailers/digest_mailer.rb | 105 | # Check if user follows any subforems | COMMENT |
| LOW | app/models/article.rb | 1353 | # Set subforem_id to default subforem ID if not already set and a default subforem exists | COMMENT |
| LOW | app/models/article.rb | 1525 | # Check if the value actually changed, not just if Rails marked it as changed | COMMENT |
| LOW | app/models/article.rb | 1752 | # Check if user is a member/admin of the collection's organization | COMMENT |
| LOW | app/models/article.rb | 2171 | # Check if the body_markdown contains only the expected embed tags | COMMENT |
| LOW⚡ | app/models/poll.rb | 75 | # Check if poll allows multiple votes | COMMENT |
| LOW⚡ | app/models/poll.rb | 80 | # Check if poll is a scale poll | COMMENT |
| LOW⚡ | app/models/poll.rb | 85 | # Check if poll is a text input poll | COMMENT |
| LOW | app/models/survey_completion.rb | 19 | # Check if a user has completed any of the given surveys | COMMENT |
| LOW | app/models/blocked_email_domain.rb | 11 | # Check if a domain is blocked (exact match or subdomain match) | COMMENT |
| LOW | app/models/billboard_placement_area_config.rb | 56 | # Check if we should fetch a billboard based on delivery rate | COMMENT |
| LOW | app/models/billboard_placement_area_config.rb | 98 | # Check if column exists (for backward compatibility before migration runs) | COMMENT |
| LOW | app/models/billboard.rb | 467 | # Check if 'bb' parameter exists and update it or append if not exists | COMMENT |
| LOW | app/models/billboard.rb | 502 | # Check if a user should be excluded from seeing this billboard based on survey completion | COMMENT |
| LOW | app/models/billboard.rb | 592 | # Check if approved changed from true to false or published changed from true to false. | COMMENT |
| LOW | app/models/survey.rb | 21 | # Check if a user has completed all polls in this survey in their latest session | COMMENT |
| LOW | app/models/survey.rb | 31 | # Check if user has voted, skipped, or submitted a text response for all distinct polls in the latest session | COMMENT |
| LOW | app/models/survey.rb | 43 | # Check if a user can submit this survey (based on allow_resubmission setting) | COMMENT |
| LOW | app/models/survey.rb | 79 | # Check if a user has a completion record for this survey | COMMENT |
| LOW | app/policies/liquid_tag_policy.rb | 17 | # Check if the given #user can utilize the given #liquid_tag | COMMENT |
| LOW | app/lib/redcarpet/render/html_rouge.rb | 25 | # Check if the URL is an image and process accordingly | COMMENT |
| LOW | …ions/track_promotional_billboard_impressions_worker.rb | 48 | # Check if we should pause promotional billboards | COMMENT |
| LOW | app/workers/spam/reaction_ring_detection_worker.rb | 34 | # Check if user has enough reactions in the past 3 months | COMMENT |
| LOW | app/workers/scheduled_automations/process_worker.rb | 49 | # Check if automation already exists | COMMENT |
| LOW | app/workers/emails/survey_daily_email_worker.rb | 20 | # Check if target is already hit or time has passed | COMMENT |
| LOW | app/workers/linked_domains/update_score_worker.rb | 11 | # Check if updated in the last hour | COMMENT |
| LOW | app/controllers/poll_skips_controller.rb | 10 | # Check if this poll belongs to a survey and if resubmission is allowed | COMMENT |
| LOW | app/controllers/poll_skips_controller.rb | 23 | # Check if this skip completes a survey | COMMENT |
| LOW | app/controllers/organizations_controller.rb | 131 | # Check if user is already a member (active or pending) | COMMENT |
| LOW | app/controllers/subforems_controller.rb | 84 | # Check if relationship already exists | COMMENT |
| LOW | app/controllers/omniauth_callbacks_controller.rb | 190 | # Check if this is a mobile authentication request. | COMMENT |
| LOW | app/controllers/auth_pass_controller.rb | 48 | # Set headers to allow the iframe to be embedded | COMMENT |
| LOW | app/controllers/poll_text_responses_controller.rb | 8 | # Check if this poll belongs to a survey and if resubmission is allowed | COMMENT |
| LOW | app/controllers/poll_text_responses_controller.rb | 15 | # Check if this response completes a survey | COMMENT |
| LOW | app/controllers/surveys_controller.rb | 18 | # Check if user can submit this survey | COMMENT |
| LOW | app/controllers/stories_controller.rb | 291 | # Check if a limit was applied to this relation and respect it | COMMENT |
| LOW | app/controllers/poll_votes_controller.rb | 22 | # Check if this poll belongs to a survey and if submission is allowed | COMMENT |
| LOW | app/controllers/poll_votes_controller.rb | 33 | # Check if this vote completes a survey | COMMENT |
| LOW | app/controllers/admin/subforems_controller.rb | 39 | # Check if we have the required parameters for create_from_scratch! | COMMENT |
| LOW | …/controllers/concerns/development_dependency_checks.rb | 13 | # Check if Sidekiq is running with a small retry mechanism | COMMENT |
| LOW | app/services/email_digest_article_collector.rb | 230 | # Check if user has a custom onboarding subforem (not nil and not default) | COMMENT |
| LOW | app/services/survey_completion_service.rb | 8 | # Check if the survey is now completed by the user | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 48 | # Check if user has enough reactions in the past 3 months | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 141 | # Check if concentration is suspiciously high | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 162 | # Check if they react to authors outside the shared group | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 184 | # Check if they follow the original user or are followed by them | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 188 | # Check if they're in the same organization (users can belong to multiple orgs) | COMMENT |
| LOW | app/services/spam/domain_detector.rb | 68 | # Check if this user's email domain should be automatically blocked | COMMENT |
| LOW | app/services/spam/handler.rb | 76 | # Check if we should trigger spam detection | COMMENT |
| LOW | app/services/scheduled_automations/executor.rb | 29 | # Check if automation is already running | COMMENT |
| LOW | …scheduled_automations/article_content_badge_awarder.rb | 96 | # Check if user already received this badge recently (within the last week) | COMMENT |
| LOW | …scheduled_automations/article_content_badge_awarder.rb | 168 | # Check if user received this badge within the last week | COMMENT |
| LOW | …ices/scheduled_automations/first_post_badge_awarder.rb | 100 | # Check if this is the user's first published article under this organization | COMMENT |
| LOW | …ices/scheduled_automations/first_post_badge_awarder.rb | 112 | # Check if user already has this badge (to avoid duplicates) | COMMENT |
| LOW | …es/scheduled_automations/warm_welcome_badge_awarder.rb | 99 | # Check if user already received this badge recently (within the last 6.5 days) | COMMENT |
| LOW | …es/scheduled_automations/warm_welcome_badge_awarder.rb | 125 | # Check if user received this badge within the last 6.5 days (to be safe) | COMMENT |
| LOW | …es/scheduled_automations/warm_welcome_badge_awarder.rb | 141 | # Check if comment is spam using existing spam detection | COMMENT |
| LOW | app/services/articles/feeds/custom.rb | 309 | # Check if all articles are published within the last week | COMMENT |
| LOW | app/services/ai/trend_detector.rb | 88 | # Check if this cluster matches an existing active trend in the DB | COMMENT |
| 27 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/tag.rb | 98 | # No additional conditions; just return the current scope | COMMENT |
| MEDIUM | app/models/ab_experiment.rb | 29 | # This method helps us leverage existing methods for different | COMMENT |
| LOW | app/models/notification.rb | 35 | # No additional conditions; just return the current scope | COMMENT |
| MEDIUM | app/policies/liquid_tag_policy.rb | 1 | # This Policy is responsible for enforcing weither or not the user can utilize | COMMENT |
| MEDIUM | app/policies/liquid_tag_policy.rb | 17 | # Check if the given #user can utilize the given #liquid_tag | COMMENT |
| MEDIUM | app/policies/reaction_policy.rb | 3 | # We don't have a robust concept of a Privileged Reaction class, but instead must switch the | COMMENT |
| MEDIUM | app/javascript/onboarding/__tests__/Onboarding.test.jsx | 224 | window.location = { href: '' }; // Simplified mock; you might need a more robust solution | CODE |
| LOW | app/controllers/concerns/api/follows_controller.rb | 6 | # API authentication might set current_user or might just set @user | COMMENT |
| MEDIUM | app/assets/stylesheets/config/_import.scss | 10 | // in config/_colors.scss. We only utilize some of these variables | COMMENT |
| MEDIUM | app/services/webpage_extractor.rb | 3 | # This is a simplified regex; for production, we might want something more robust. | COMMENT |
| MEDIUM | app/services/ai/comment_check.rb | 9 | # holistic YES/NO prompt is replaced by narrow TypeSafe Noul questions combined by the | COMMENT |
| MEDIUM | app/services/ai/article_check.rb | 10 | # holistic YES/NO prompt is replaced by a battery of narrow TypeSafe Noul questions whose | COMMENT |
| MEDIUM | config/initializers/0_application_config.rb | 17 | # Normalize Redis URLs to be more robust across environments | COMMENT |
| MEDIUM | …icies/shared_examples/authorization_shared_examples.rb | 1 | # This cluster of shared examples all help facilitate bombarding policies with lots of test situations. | COMMENT |
| LOW | spec/lib/url_spec.rb | 316 | # so we just create something that quacks like one. | COMMENT |
| MEDIUM | spec/services/markdown_processor/parser_spec.rb | 802 | # I don't want to delve into the implementation details of liquid to test what the parse | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/user.rb | 449 | # NOTE: This method is only used in the EmailDigestArticleCollector and does | COMMENT |
| LOW | …p/workers/events/manage_broadcast_billboards_worker.rb | 31 | # Step 1: Any billboard owned by an event that IS currently active, should be approved. | COMMENT |
| LOW | …p/workers/events/manage_broadcast_billboards_worker.rb | 43 | # Step 2: Any billboard owned by a broadcast_config event that is NOT currently active AND NOT upcoming, should be | COMMENT |
| LOW⚡ | app/controllers/api/v0/mobile_auth_controller.rb | 25 | # Step 2: Form an OmniAuth Mock Hash | COMMENT |
| LOW⚡ | app/controllers/api/v0/mobile_auth_controller.rb | 34 | # Step 3: Match Identity to a User | COMMENT |
| LOW⚡ | …g/initializers/ahoy_messages_controller_monkeypatch.rb | 2 | # Step 2: Define a module to override the click method | COMMENT |
| LOW | …g/initializers/ahoy_messages_controller_monkeypatch.rb | 18 | # Step 4: Prepend the module to Ahoy::MessagesController | COMMENT |
| LOW⚡ | docs/rust_native_extensions.md | 45 | ### Step 1: Candidate Selection | COMMENT |
| LOW⚡ | docs/rust_native_extensions.md | 50 | ### Step 2: Pure-Rust Implementation in `forem_core` & Thin `magnus` Binding | COMMENT |
| LOW⚡ | docs/rust_native_extensions.md | 54 | ### Step 3: Clean Module Boundary (Single Source of Truth) | COMMENT |
| LOW | docs/rust_native_extensions.md | 73 | ### Step 4: Differential Equivalence & Edge-Case Verification | COMMENT |
| LOW | docs/rust_native_extensions.md | 78 | ### Step 5: Mandatory Benchmark & Allocation Proof | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/liquid_tags/bluesky_tag.rb | 28 | # Now that we've parsed the input, you can use the values to | COMMENT |
| LOW | app/services/images/generate_social_image_magickally.rb | 703 | # Don't forget to close and unlink (delete) the tempfile after you're done with it. | COMMENT |
| MEDIUM | app/services/ai/community_copy.rb | 293 | /let me know if you need anything else!?$/i, | CODE |
| MEDIUM | config/i18n-tasks.yml | 134 | ## In these cases you can use the built-in PatternMapper to map patterns to keys, e.g.: | COMMENT |
| MEDIUM | spec/spec_helper.rb | 65 | # with RSpec, but feel free to customize to your heart's content. | COMMENT |
| MEDIUM | spec/requests/api/v1/feedback_messages_spec.rb | 77 | # If you handle invalid params or other scenarios, you can add more specs here. | COMMENT |
| MEDIUM | spec/services/ai/community_copy_spec.rb | 136 | dirty_response = "Okay, here's the tagline: Code. Share. Grow. Let me know if you need anything else!" | CODE |
| MEDIUM | spec/services/ai/community_copy_spec.rb | 275 | "Okay, here's the tagline: Code. Share. Grow. Let me know if you need anything else!", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/services/ai/article_quality_assessor.rb | 239 | - Content that feels like it was generated by AI | CODE |
| HIGH | spec/services/concepts/anchor_generator_spec.rb | 18 | allow(ai_client).to receive(:call).and_return("Synthetic description generated by Gemini.") | CODE |
| HIGH | spec/services/concepts/anchor_generator_spec.rb | 23 | expect(concept.description).to eq("Synthetic description generated by Gemini.") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …p/workers/events/manage_broadcast_billboards_worker.rb | 31 | # Step 1: Any billboard owned by an event that IS currently active, should be approved. | COMMENT |
| LOW | …p/workers/events/manage_broadcast_billboards_worker.rb | 43 | # Step 2: Any billboard owned by a broadcast_config event that is NOT currently active AND NOT upcoming, should be | COMMENT |
| LOW⚡ | app/controllers/api/v0/mobile_auth_controller.rb | 25 | # Step 2: Form an OmniAuth Mock Hash | COMMENT |
| LOW⚡ | app/controllers/api/v0/mobile_auth_controller.rb | 34 | # Step 3: Match Identity to a User | COMMENT |
| LOW⚡ | …g/initializers/ahoy_messages_controller_monkeypatch.rb | 2 | # Step 2: Define a module to override the click method | COMMENT |
| LOW | …g/initializers/ahoy_messages_controller_monkeypatch.rb | 18 | # Step 4: Prepend the module to Ahoy::MessagesController | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/services/ai/article_enhancer.rb | 32 | # @param ai_client [Ai::Base] Optional Gemini client for dependency injection (useful for testing). | COMMENT |
| MEDIUM | app/services/ai/github_repo_recap.rb | 29 | # @param github_client [Github::OauthClient] Optional GitHub client for dependency injection | COMMENT |
| MEDIUM | app/services/ai/github_repo_recap.rb | 30 | # @param ai_client [Ai::Base] Optional AI client for dependency injection | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/models/article.rb | 28 | # @note [@jeremyf] I have added the profile_image attribute, even though that's not one of the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spec/requests/api/v1/docs/billboards_spec.rb | 223 | ### Usage: | COMMENT |
| LOW | spec/support/shared_examples/trackable.rb | 3 | # Usage: | COMMENT |