For empowering community 🌱
This report presents the forensic synthetic code analysis of forem/forem, a Ruby project with 22,747 GitHub stars. SynthScan v2.0 examined 406,155 lines of code across 4980 source files, recording 899 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 3.0 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 899 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 | 31 | def confirmation_instructions(record, token, opts = {}) | CODE |
| LOW | app/mailers/devise_mailer.rb | 70 | 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 | 85 | def determine_subforem_domain(subforem_id) | CODE |
| LOW | app/decorators/article_decorator.rb | 62 | def title_with_query_preamble(user_signed_in) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 55 | def subscription_to_article_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 63 | def subscription_to_comment_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 71 | def subscription_to_comment_ancestry_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 79 | def subscription_to_commentable_article_for(user) | CODE |
| LOW⚡ | app/decorators/notification_decorator.rb | 87 | def subscription_to_notifiable_for(user, **notifiable) | CODE |
| LOW | app/models/reaction.rb | 99 | def surrogate_key_for_article(article_id) | CODE |
| LOW | app/models/reaction.rb | 103 | def surrogate_key_for_commentable(commentable) | CODE |
| LOW | app/models/reaction.rb | 149 | def contradictory_mod_reactions(category:, reactable_id:, reactable_type:, user:) | CODE |
| LOW | app/models/article.rb | 1485 | def remove_tag_adjustments_from_tag_list(distinct_adjustments) | CODE |
| LOW | app/models/article.rb | 1490 | def add_tag_adjustments_to_tag_list(distinct_adjustments) | CODE |
| LOW | app/models/article.rb | 1661 | def touch_actor_latest_article_updated_at(destroying: false) | CODE |
| LOW | app/models/tag.rb | 211 | def submission_template_customized(param_0 = nil) | 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/async_info.rb | 83 | def feed_style_preference_variable(user) | 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 | 82 | def send_new_comment_notifications_without_delay(comment) | CODE |
| LOW⚡ | app/models/notification.rb | 89 | def send_new_badge_achievement_notification(badge_achievement) | CODE |
| LOW⚡ | app/models/notification.rb | 93 | def send_reaction_notification(reaction, receiver) | CODE |
| LOW⚡ | app/models/notification.rb | 100 | def send_reaction_notification_without_delay(reaction, receiver) | CODE |
| LOW⚡ | app/models/notification.rb | 107 | def send_mention_notification(mention) | CODE |
| LOW⚡ | app/models/notification.rb | 113 | def send_mention_notification_without_delay(mention) | CODE |
| LOW⚡ | app/models/notification.rb | 119 | def send_welcome_notification(receiver_id, broadcast_id) | CODE |
| LOW⚡ | app/models/notification.rb | 123 | def send_moderation_notification(notifiable) | CODE |
| LOW⚡ | app/models/notification.rb | 133 | def send_tag_adjustment_notification(tag_adjustment) | CODE |
| LOW⚡ | app/models/notification.rb | 137 | def send_milestone_notification(type:, article_id:) | CODE |
| LOW⚡ | app/models/notification.rb | 141 | def remove_all_by_action_without_delay(notifiable_ids:, notifiable_type:, action: nil) | CODE |
| LOW | app/models/notification.rb | 163 | def fast_destroy_old_notifications(destroy_before_timestamp = ENV.fetch("FAST_DESTROY_OLD_NOTIFICATIONS_DAYS", 85).t | CODE |
| LOW | app/models/notification.rb | 216 | 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 | 242 | def validate_header_cta_links(links) | CODE |
| LOW | app/models/billboard.rb | 494 | def extract_internal_article_paths(html) | CODE |
| LOW | app/models/billboard.rb | 594 | 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 |
| LOW | app/models/agent_session.rb | 32 | def curated_messages_in_range(range) | CODE |
| LOW | app/models/user.rb | 944 | def enqueue_trackable_event_destroyed(*) | CODE |
| LOW | app/models/settings/base.rb | 150 | def convert_string_to_value_type(type, value, separator: nil) | CODE |
| LOW | app/models/concerns/reactable.rb | 20 | def sync_reactions_count_for_batch(records) | CODE |
| LOW | app/models/concerns/user_subscription_sourceable.rb | 25 | def user_subscription_attributes(subscriber) | CODE |
| LOW | app/view_objects/cloud_cover_url.rb | 30 | def url_without_prefix_nesting(url, width) | CODE |
| LOW | app/liquid_tags/codesandbox_tag.rb | 29 | def parse_id_or_url_and_options(input) | CODE |
| LOW | app/liquid_tags/organization_tag.rb | 26 | def parse_slug_to_organization(org_slug) | CODE |
| LOW | app/liquid_tags/survey_tag.rb | 113 | function setAndLockAnsweredPoll(poll, votedOptionIds) { | CODE |
| 260 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/models/article.rb | 1468 | # This method is called before validation, so that the tag_list can be validated. | COMMENT |
| MEDIUM | app/models/article.rb | 1832 | # Create the expected embed tags | COMMENT |
| MEDIUM | app/models/email.rb | 19 | # Define the mapping of merge tags to user attributes | COMMENT |
| MEDIUM | app/models/user_query.rb | 61 | # Create a safe query with user limit | 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 | 201 | # This method is envisioned as a :before_action callback. | COMMENT |
| MEDIUM | app/controllers/application_controller.rb | 278 | # This method is used by Devise to decide which is the path to redirect | COMMENT |
| MEDIUM⚡ | app/controllers/poll_text_responses_controller.rb | 14 | # Create a new text response with the session_start | COMMENT |
| MEDIUM | app/controllers/stories_controller.rb | 243 | # 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 | 493 | # This function is responsible for adding a policy class (and possibly the hidden class). It's | COMMENT |
| MEDIUM | app/services/read_only_database_service.rb | 106 | # Create a new connection pool for read-only database | 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 | 46 | # Create an API secret for the bot | COMMENT |
| MEDIUM | app/services/community_bots/create_bot.rb | 146 | # Create a temp file with the correct extension | COMMENT |
| MEDIUM | app/services/community_bots/create_bot.rb | 152 | # 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 | 169 | # Create a new tag with a different name | COMMENT |
| MEDIUM | app/services/ai/context_note_generator.rb | 19 | # Create the context note with the response | COMMENT |
| MEDIUM | config/initializers/rpush.rb | 26 | # Define a custom logger. | COMMENT |
| MEDIUM | config/initializers/sidekiq.rb | 58 | # 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 | 2991 | # 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 | 1222 | # Create a config for the placement area | COMMENT |
| MEDIUM | spec/models/user_query_spec.rb | 144 | # Create a simple user query for testing | COMMENT |
| MEDIUM | spec/models/reaction_ring_detection_spec.rb | 16 | # Create a privileged reaction (not public) | COMMENT |
| MEDIUM | spec/models/ahoy/store_spec.rb | 8 | # Create a real instance of Ahoy::Store to test behavior | COMMENT |
| MEDIUM | spec/requests/billboards_spec.rb | 426 | # Create a few live billboards which should not be returned | 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/moderations_spec.rb | 194 | # Create a reaction for second_article so it gets filtered out of inbox | COMMENT |
| MEDIUM | spec/requests/subforems_spec.rb | 426 | # 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 | 77 | # Create a vote to complete the survey | COMMENT |
| MEDIUM | spec/requests/poll_text_responses_controller_spec.rb | 61 | # 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 |
| 33 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 | 501 | }); | 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/decorators/user_decorator.rb | 21 | DEFAULT_PROFILE_SUMMARY = -> { I18n.t("stories_controller.404_bio_not_found") } | 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 | # @note I would prefer that this constant were in the {Article::CachedEntity} namespace, but it | COMMENT |
| LOW | app/models/article.rb | 341 | after_update_commit :update_dependent_embeds_if_key_info_changed | 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 | after_save :update_suggested_tags, if: :saved_change_to_suggested? | COMMENT |
| LOW | app/models/tag.rb | 121 | COMMENT | |
| LOW | app/models/tag.rb | 141 | # @return [ActiveRecord::Relation<Tag>] with the "points" attribute and limited field selection | COMMENT |
| LOW | app/models/tag.rb | 241 | # attribute; for example when we want to render the tags a user is following and the points we've | COMMENT |
| LOW | app/models/tag.rb | 281 | 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 | 101 | # NOTE: [@jeremyf] trying to puzzle this one out. My read is that if the "grandchild" of the | 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/navigation_link.rb | 61 | # @param url [String] the URL of the navigation link. | COMMENT |
| LOW | app/models/user.rb | 541 | ############################################################################## | COMMENT |
| LOW | app/models/user.rb | 561 | # call it from controllers or views. Favor `user.admin?` over | COMMENT |
| LOW | app/models/user.rb | 621 | # The name of the tags moderated by the user. | 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 | 81 | COMMENT | |
| LOW | app/policies/liquid_tag_policy.rb | 1 | # This Policy is responsible for enforcing weither or not the user can utilize | COMMENT |
| LOW | app/view_objects/data_info.rb | 1 | # Throughout Forem, we encode JSON information in our Ruby templates. | COMMENT |
| LOW | app/liquid_tags/liquid_tag_base.rb | 1 | # @abstract | COMMENT |
| LOW | app/liquid_tags/liquid_tag_base.rb | 21 | # things tidier, but that's not a hard preference. | COMMENT |
| LOW | app/liquid_tags/twitch_tag.rb | 21 | height: @height | COMMENT |
| LOW | app/lib/string_attribute_cleaner.rb | 1 | # This module provides a method for generating a configurable before_validation | COMMENT |
| LOW | app/workers/reaction_counter_sync_worker.rb | 1 | class ReactionCounterSyncWorker | COMMENT |
| LOW | app/workers/articles/update_article_activity_worker.rb | 1 | module Articles | COMMENT |
| 131 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 | 633 | 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 |
| 102 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/mailers/digest_mailer.rb | 30 | # Check if user follows any subforems OR has a custom onboarding subforem | COMMENT |
| LOW | app/mailers/digest_mailer.rb | 40 | # Check if user follows any subforems | COMMENT |
| LOW | app/models/article.rb | 1159 | # Set subforem_id to default subforem ID if not already set and a default subforem exists | COMMENT |
| LOW | app/models/article.rb | 1321 | # Check if the value actually changed, not just if Rails marked it as changed | COMMENT |
| LOW | app/models/article.rb | 1526 | # Check if user is a member/admin of the collection's organization | COMMENT |
| LOW | app/models/article.rb | 1838 | # 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 | 51 | # Check if we should fetch a billboard based on delivery rate | COMMENT |
| LOW | app/models/billboard_placement_area_config.rb | 84 | # Check if column exists (for backward compatibility before migration runs) | COMMENT |
| LOW | app/models/billboard.rb | 423 | # Check if 'bb' parameter exists and update it or append if not exists | COMMENT |
| LOW | app/models/billboard.rb | 458 | # Check if a user should be excluded from seeing this billboard based on survey completion | COMMENT |
| LOW | app/models/billboard.rb | 531 | # Check if approved changed from true to false or published changed from true to false. | COMMENT |
| LOW⚡ | app/models/survey.rb | 17 | # Check if a user has completed all polls in this survey in their latest session | COMMENT |
| LOW⚡ | app/models/survey.rb | 27 | # Check if user has voted or skipped all polls in the latest session | COMMENT |
| LOW⚡ | app/models/survey.rb | 36 | # Check if a user can submit this survey (based on allow_resubmission setting) | COMMENT |
| LOW | app/models/survey.rb | 72 | # 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 | 16 | # Check if the URL is an image and process accordingly | COMMENT |
| LOW | …ions/track_promotional_billboard_impressions_worker.rb | 42 | # Check if we should pause promotional billboards | COMMENT |
| LOW | app/workers/spam/reaction_ring_detection_worker.rb | 37 | # 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/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 | 36 | # 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 | 82 | # Check if this is a mobile authentication request. | COMMENT |
| LOW | app/controllers/auth_pass_controller.rb | 46 | # 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 | 22 | # 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 | 250 | # Check if a limit was applied to this relation and respect it | COMMENT |
| LOW | app/controllers/poll_votes_controller.rb | 21 | # Check if this poll belongs to a survey and if resubmission is allowed | COMMENT |
| LOW | app/controllers/poll_votes_controller.rb | 51 | # 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 | 201 | # 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 | 124 | # Check if concentration is suspiciously high | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 151 | # Check if they react to authors outside the shared group | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 173 | # Check if they follow the original user or are followed by them | COMMENT |
| LOW | app/services/spam/reaction_ring_detector.rb | 177 | # 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 | 82 | # 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 | 122 | # 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 |
| LOW | app/services/ai/comment_check.rb | 81 | # Check if the response contains "YES", ignoring case and leading/trailing whitespace. | COMMENT |
| 26 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/tag.rb | 94 | # 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 | 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 | 191 | # so we just create something that quacks like one. | COMMENT |
| MEDIUM | spec/services/markdown_processor/parser_spec.rb | 723 | # I don't want to delve into the implementation details of liquid to test what the parse | 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 |
| MEDIUM | app/services/user_query_validator.rb | 339 | # This is a basic implementation and could be enhanced with a proper SQL parser | COMMENT |
| LOW | app/services/images/generate_social_image_magickally.rb | 175 | # 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 | 132 | 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 | 271 | "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 | 99 | - 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 | app/queries/billboards/filtered_ads_query.rb | 243 | # For billboards that do exclude survey completions, we need to check if the user | 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/user.rb | 428 | # 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/workers/articles/handle_spam_worker.rb | 24 | # Create AI client for dependency injection | COMMENT |
| MEDIUM | app/services/ai/article_enhancer.rb | 10 | # @param ai_client [Ai::Base] Optional AI 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 | 26 | # @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 |