See what sticks
This report presents the forensic synthetic code analysis of antiwork/gumroad, a Ruby project with 9,403 GitHub stars. SynthScan v2.0 examined 706,521 lines of code across 5971 source files, recording 1280 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 2.4 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).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
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 1280 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 | …idekiq/suspend_accounts_with_payment_address_worker.rb | 15 | def suspend_users_with_same_payment_address(suspended_user) | CODE |
| LOW | …idekiq/suspend_accounts_with_payment_address_worker.rb | 26 | def suspend_users_with_same_stripe_fingerprint(suspended_user) | CODE |
| LOW | app/sidekiq/generate_canada_sales_report_job.rb | 118 | def determine_country_name_and_province_name(purchase) | CODE |
| LOW | …idekiq/generate_fees_by_creator_location_report_job.rb | 71 | def determine_country_name_and_state_name(purchase) | CODE |
| LOW | app/sidekiq/google_calendar_invite_job.rb | 45 | def insert_or_refresh_and_insert_event(gcal_api, integration, event) | CODE |
| LOW | app/sidekiq/post_to_individual_ping_endpoint_worker.rb | 45 | def send_ping_failure_notification(post_url, response_code, user_id = nil) | CODE |
| LOW | app/sidekiq/transcode_video_for_streaming_worker.rb | 49 | def create_hls_ets_transcode_job(streamable, original_video_key, input_video_height) | CODE |
| LOW | app/sidekiq/transcode_video_for_streaming_worker.rb | 112 | def create_hls_mediaconvert_transcode_job(streamable, original_video_key, input_video_height, transcoder) | CODE |
| LOW | app/sidekiq/remove_deleted_files_from_s3_job.rb | 67 | def gather_transcoded_video_keys(file) | CODE |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 112 | def revalidate_snapshotted_members(snapshotted_ids) | CODE |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 166 | def mark_members_sent_in_this_blast(members) | CODE |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 177 | def enrich_with_gathered_records(members_with_specifics) | CODE |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 194 | def enrich_with_purchases_specifics(members_with_specifics) | CODE |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 211 | def enrich_with_url_redirects(members_with_specifics) | CODE |
| LOW | …/sidekiq/create_global_sales_tax_summary_report_job.rb | 164 | def prefetch_partial_refund_adjustments(purchases_scope) | CODE |
| LOW | …/sidekiq/create_global_sales_tax_summary_report_job.rb | 211 | def resolve_geoip_fallback_purchases(purchases_scope, unresolved_us_tuple_keys, aggregation) | CODE |
| LOW | …/sidekiq/create_global_sales_tax_summary_report_job.rb | 324 | def refund_totals_by_purchase(purchase_ids) | CODE |
| LOW | app/sidekiq/generate_sales_report_job.rb | 104 | def update_job_status_to_completed(country_code, start_time, end_time, sales_type, download_url) | CODE |
| LOW | app/sidekiq/send_year_in_review_email_job.rb | 72 | def calculate_stats_by_country(data) | CODE |
| LOW | …q/retry_stripe_rejected_payout_setup_for_seller_job.rb | 48 | def payout_setup_failure_notes(user) | CODE |
| LOW | app/sidekiq/update_product_files_archive_worker.rb | 117 | def delete_temp_zip_file_if_exists(zip_archive_filename) | CODE |
| LOW | app/sidekiq/concerns/transcode_event_handler.rb | 5 | def handle_transcoding_job_notification(job_id, state, transcoded_video_key = nil) | CODE |
| LOW | app/mailers/community_chat_recap_mailer.rb | 10 | def community_chat_recap_notification(user_id, seller_id, community_chat_recap_ids) | CODE |
| LOW | app/mailers/comment_mailer.rb | 8 | def notify_seller_of_new_comment(comment_id) | CODE |
| LOW | app/mailers/creator_mailer.rb | 55 | def scheduled_payout_chargeback_hold(scheduled_payout_id:) | CODE |
| LOW | app/mailers/merchant_registration_mailer.rb | 8 | def account_deauthorized_to_user(user_id, charge_processor_id) | CODE |
| LOW | app/mailers/merchant_registration_mailer.rb | 15 | def account_needs_registration_to_user(affiliate_id, charge_processor_id) | CODE |
| LOW | app/mailers/merchant_registration_mailer.rb | 47 | def stripe_payouts_under_review(user_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 262 | def unremovable_discord_member(discord_user_id, discord_server_name, purchase_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 270 | def unstampable_pdf_notification(link_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 276 | def chargeback_lost_no_refund_policy(dispute_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 362 | def stripe_document_verification_failed(user_id, error_message) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 369 | def stripe_identity_verification_failed(user_id, error_message) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 376 | def singapore_identity_verification_reminder(user_id, deadline) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 548 | def refund_policy_enabled_email(seller_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 555 | def refund_policy_enforced_notification(seller_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 561 | def product_level_refund_policies_reverted(seller_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 566 | def upcoming_refund_policy_change(user_id) | CODE |
| LOW⚡ | app/mailers/contacting_creator_mailer.rb | 571 | def paypal_suspension_notification(user_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 131 | def video_preview_conversion_error(link_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 150 | def invalid_account_holder_name(user_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 163 | def flagged_for_explicit_nsfw_tos_violation(user_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 180 | def subscription_product_deleted(link_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 198 | def gumroad_day_credit_notification(user_id, amount_cents) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 215 | def subscription_cancelled_by_customer(subscription_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 221 | def subscription_autocancelled(subscription_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 290 | def preorder_release_reminder(link_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 319 | def purchase_refunded_for_fraud(purchase_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 347 | def payout_setup_retry_exhausted(user_id, marker_type) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 389 | def suspended_due_to_stripe_risk(user_id) | CODE |
| LOW | app/mailers/contacting_creator_mailer.rb | 418 | def tax_form_transaction_report(user_id, year, csv_tempfile) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 33 | def daily_finance_ledger_report(date) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 49 | def stripe_currency_balances_report(balances_csv) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 119 | def us_states_sales_summary_report_failed(subdivision_codes, month, year, error_class, error_message) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 132 | def finance_report_job_failed(job_name, args, error_class, error_message) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 146 | def finance_report_delivery_backstop_triggered(job_name, args, fire_time, last_completed_at) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 157 | def us_states_sales_tax_taxjar_upload_failed(date, error_class, error_message) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 177 | def global_sales_tax_summary_report(month, year, s3_read_url) | CODE |
| LOW | app/mailers/accounting_mailer.rb | 185 | def global_sales_tax_summary_report_failed(month, year, error_class, error_message) | CODE |
| LOW | app/mailers/application_mailer.rb | 34 | def from_email_address_with_name(name = "", email = NOREPLY_EMAIL) | CODE |
| 666 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | app/sidekiq/pdf_unstampable_notifier_job.rb | 13 | product.product_files.alive.pdf.pdf_stamp_enabled.where(stampable_pdf: nil).find_each do |product_file| | CODE |
| CRITICAL | app/sidekiq/pdf_unstampable_notifier_job.rb | 30 | product.sales.successful_gift_or_nongift.not_is_gift_sender_purchase.not_recurring_charge.includes(:url_redirect).fi | CODE |
| CRITICAL | app/sidekiq/recurring_charge_worker.rb | 40 | new_price = subscription.link.prices.is_buy.alive.find_by(recurrence: latest_applicable_plan_change.recurrence) | CODE |
| CRITICAL | app/sidekiq/schedule_membership_price_updates_job.rb | 31 | new_product_price = subscription.link.prices.is_buy.alive.find_by(recurrence: plan_change.recurrence) || | CODE |
| CRITICAL | app/sidekiq/schedule_membership_price_updates_job.rb | 75 | subscription.subscription_plan_changes.for_product_price_change.alive.where.not(id: new_plan_change.id).each(&:mar | CODE |
| CRITICAL | app/sidekiq/schedule_abandoned_cart_emails_job.rb | 41 | Workflow.distinct.alive.abandoned_cart_type.published.joins(seller: :links).merge(User.alive.not_suspended).merge(Li | CODE |
| CRITICAL | app/models/offer_code.rb | 405 | if product.offer_codes.alive.is_cancellation_discount.where.not(id: id).exists? | CODE |
| CRITICAL | app/models/product_file.rb | 395 | link.sales.successful_gift_or_nongift.not_is_gift_sender_purchase.not_recurring_charge.includes(:url_redirect).fin | CODE |
| CRITICAL | app/models/subscription.rb | 180 | installments = link.installments.not_workflow_installment.alive.published.where("published_at >= ?", created_at) | CODE |
| CRITICAL | app/models/link.rb | 967 | user.custom_fields.not_is_post_purchase.global.to_a.concat(custom_fields.not_is_post_purchase) | CODE |
| CRITICAL | app/presenters/url_redirect_presenter.rb | 126 | purchase_custom_fields: purchase.purchase_custom_fields.is_post_purchase.with_attached_files.where.not(custom_ | CODE |
| CRITICAL | app/presenters/profile_presenter.rb | 38 | memberships = seller.products.membership.alive.not_archived.includes(ProductPresenter::ASSOCIATIONS_FOR_CARD) | CODE |
| CRITICAL | app/presenters/utm_link_presenter.rb | 56 | posts = *seller.installments.audience_type.shown_on_profile.not_workflow_installment.published.includes(:seller).o | CODE |
| CRITICAL | app/javascript/pages/Settings/Main/Show.tsx | 374 | {form.data.user.seller_refund_policy.allowed_refund_periods_in_days.map(({ key, value }) => ( | CODE |
| CRITICAL | app/controllers/third_party_analytics_controller.rb | 25 | user_snippets = @product.user.third_party_analytics.universal.alive.where(location: [params[:location], "all"]).pluc | CODE |
| CRITICAL | app/services/pages/profile_data.rb | 33 | seller.products.alive.not_archived.not_draft.includes(:thumbnail_alive).order(created_at: :desc).limit(MAX_ITEMS).ma | CODE |
| CRITICAL | …tration/paypal/paypal_merchant_account_manager_spec.rb | 267 | creator.merchant_accounts.alive.paypal.where.not(charge_processor_merchant_id: new_paypal_merchant_id) | CODE |
| CRITICAL | spec/requests/products/dropbox_spec.rb | 94 | cancelled_db_file = product.user.dropbox_files.reload.where.not(state: "successfully_uploaded").first | CODE |
| CRITICAL | spec/requests/products/edit/membership_tiers_spec.rb | 369 | expect(@product.tier_category.variants.reload.alive.in_order.pluck(:name)).to eq ["Second tier", "Untitled"] | CODE |
| CRITICAL | spec/requests/products/edit/digital_versions_spec.rb | 91 | expect(product.variant_categories.first.variants.reload.alive.in_order.pluck(:name)).to eq ["Basic Bundle", "First | CODE |
| CRITICAL | spec/requests/emails/edit_spec.rb | 507 | expect(follower_installment.reload.product_files_archives.alive.sole.url.split("/").last).to eq("Updated_Follower_Po | CODE |
| CRITICAL | spec/modules/with_product_files_spec.rb | 546 | expect(installment.product_files_archives.alive.first.url.split("/").last).to include(installment.name.split(" " | CODE |
| CRITICAL | spec/controllers/api/v2/thumbnails_controller_spec.rb | 58 | expect(@product.thumbnail.file.blob.metadata.slice("width", "height")).to eq("width" => 1006, "height" => 1006) | CODE |
| CRITICAL | spec/controllers/api/v2/offer_codes_controller_spec.rb | 180 | expect(result).to eq(success: true, offer_code: @product.reload.offer_codes.alive.first.as_json(api_scopes: ["ed | CODE |
| CRITICAL | spec/controllers/api/v2/offer_codes_controller_spec.rb | 233 | expect(result).to eq(success: true, offer_code: @product.reload.offer_codes.alive.first.as_json(api_scopes: ["vi | CODE |
| CRITICAL | spec/controllers/api/v2/offer_codes_controller_spec.rb | 297 | expect(result).to eq(success: true, offer_code: @product.reload.offer_codes.alive.first.as_json(api_scopes: ["ed | CODE |
| CRITICAL | spec/services/product_duplicator_service_spec.rb | 77 | expect(duplicate_product.prices.alive.first.attributes.except(*do_not_compare)).to eq(product.prices.alive.first.att | CODE |
| CRITICAL | spec/services/product_duplicator_service_spec.rb | 187 | expect(duplicate_product.variant_categories.alive.first.variants.pluck(:name)).to eq ["Untitled", "Second"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/ci/restore_test_db.sh | 1 | #!/bin/bash | COMMENT |
| LOW | docker/ci/dump_test_db.sh | 1 | #!/bin/bash | COMMENT |
| LOW | docker/base/generate_tag_for_test_image.sh | 1 | #!/bin/bash | COMMENT |
| LOW | docker/base/generate_tag_for_test_image.sh | 21 | # - *.md any markdown file (verified: no specs read .md fixtures, | COMMENT |
| LOW | app/sidekiq/upload_us_states_sales_tax_to_taxjar_job.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 61 | COMMENT | |
| LOW | app/sidekiq/send_post_blast_emails_job.rb | 101 | # also follows) KEEPS their row when they leave just one role, so a follower who | COMMENT |
| LOW | …merchant_account_payment_method_availability_worker.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/sidekiq/verify_finance_reports_delivery_job.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/sidekiq/verify_finance_reports_delivery_job.rb | 61 | args_builder = VERIFIED_JOBS[class_name] | COMMENT |
| LOW | app/sidekiq/update_product_files_archive_worker.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/sidekiq/concerns/finance_report_failure_alert.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …sidekiq/concerns/finance_report_completion_tracking.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …lementations/stripe/stripe_merchant_account_manager.rb | 1041 | # Suspend the account and inform the creator via email. | COMMENT |
| LOW | …lementations/stripe/stripe_merchant_account_manager.rb | 1221 | # rejected account Stripe leaves a permanent supportability intervention | COMMENT |
| LOW | app/business/payments/charging/flow_of_funds.rb | 21 | COMMENT | |
| LOW | …ging/implementations/paypal/paypal_charge_processor.rb | 141 | # refunded. Real incident: a partial refund issued for two FAILED (undelivered, never-credited) | COMMENT |
| LOW | …ging/implementations/paypal/paypal_charge_processor.rb | 701 | order_api_used: true, | COMMENT |
| LOW | …ging/implementations/stripe/stripe_charge_processor.rb | 601 | ) | COMMENT |
| LOW | …mplementations/stripe/stripe_charge_radar_processor.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …ging/errors/charge_processor_fx_quote_invalid_error.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/business/payments/payouts/payouts.rb | 81 | private_class_method :add_below_minimum_payout_note | COMMENT |
| LOW | app/business/payments/payouts/payout_estimates.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …ts/payouts/processor/paypal/paypal_payout_processor.rb | 21 | # Public: Determines if it's possible for this processor to payout | COMMENT |
| LOW | …ts/payouts/processor/paypal/paypal_payout_processor.rb | 81 | true | COMMENT |
| LOW | …ts/payouts/processor/stripe/stripe_payout_processor.rb | 121 | def self.get_payout_details(user, balances) | COMMENT |
| LOW | …ts/payouts/processor/stripe/stripe_payout_processor.rb | 561 | COMMENT | |
| LOW | …iness/payments/reports/finance_event_ledger_reports.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | …iness/payments/reports/finance_event_ledger_reports.rb | 21 | # time (Purchase#succeeded_at, Refund#created_at, and the Dispute state machine's | COMMENT |
| LOW | …usiness/card_data_handling/card_data_handling_error.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/payment.rb | 41 | # | COMMENT |
| LOW | app/models/credit.rb | 141 | COMMENT | |
| LOW | app/models/service_charge.rb | 21 | belongs_to :credit_card, optional: true | COMMENT |
| LOW | app/models/balance.rb | 21 | has_many :credits | COMMENT |
| LOW | app/models/resend_event_info.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/resend_event_info.rb | 21 | # "name": "X-Gum-Mailer-Class", | COMMENT |
| LOW | app/models/resend_event_info.rb | 41 | # "name": "X-Gum-Email-Provider", | COMMENT |
| LOW | app/models/purchase_url_parameter.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/walks_free_trial.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/asset_preview.rb | 121 | end | COMMENT |
| LOW | app/models/asset_preview.rb | 141 | # the cache. Renders only ever read the cache. | COMMENT |
| LOW | app/models/dispute.rb | 21 | validate :only_one_disputable_present | COMMENT |
| LOW | app/models/mailer_info.rb | 41 | end | COMMENT |
| LOW | app/models/purchase.rb | 141 | COMMENT | |
| LOW | app/models/purchase.rb | 161 | # | COMMENT |
| LOW | app/models/purchase.rb | 181 | # purchase triggers the creation of the giftee purchase, which always has | COMMENT |
| LOW | app/models/purchase.rb | 1541 | end | COMMENT |
| LOW | app/models/purchase.rb | 2541 | # filter_map skips purchases whose scoped has_one original_purchase is nil | COMMENT |
| LOW | app/models/purchase.rb | 2621 | end | COMMENT |
| LOW | app/models/purchase.rb | 3201 | } | COMMENT |
| LOW | app/models/purchase.rb | 3381 | # same canonical gross back with a positive sign. It reads the gross that was | COMMENT |
| LOW | app/models/purchase.rb | 3841 | # Private: Returns true if a custom file receipt should be sent for this | COMMENT |
| LOW | app/models/sendgrid_event_info.rb | 41 | def email_provider | COMMENT |
| LOW | app/models/post_email_blast.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/installment_rule.rb | 21 | validate :to_be_published_at_must_exist_for_non_workflow_posts | COMMENT |
| LOW | app/models/merchant_account.rb | 21 | # For Stripe Connect (direct-charge) accounts: a cached snapshot of the account's Stripe | COMMENT |
| LOW | app/models/niger_bank_account.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/link.rb | 1241 | COMMENT | |
| LOW | app/models/admin/sales_report.rb | 21 | validates :start_date, comparison: { less_than_or_equal_to: -> { Date.current }, message: "cannot be in the future", i | COMMENT |
| LOW | app/models/admin/sales_report.rb | 121 | # holds the exact value we read (see REPLACE_ENTRY_SCRIPT), so a stale | COMMENT |
| 208 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …omponents/Settings/PaymentsPage/BankAccountSection.tsx | 796 | "placeholder" | "maxLength" | "pattern" | "inputMode" | "title" | CODE |
| LOW | app/javascript/components/Admin/EmptyState.tsx | 8 | <div className="placeholder"> | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 183 | "buyer_name": "Jane Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 196 | "buyer_name": "John Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 209 | "buyer_name": "John Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 222 | "buyer_name": "Jane Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 296 | "buyer_name": "Jane Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 309 | "buyer_name": "John Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 322 | "buyer_name": "John Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 335 | "buyer_name": "Jane Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 375 | "buyer_name": "Jane Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 388 | "buyer_name": "John Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 401 | "buyer_name": "John Doe", | CODE |
| LOW | …ript/components/ApiDocumentation/Endpoints/Payouts.tsx | 414 | "buyer_name": "Jane Doe", | CODE |
| LOW | …ript/components/ProductEdit/ProductTab/TiersEditor.tsx | 419 | const placeholderExtension = editor.extensionManager.extensions.find(({ name }) => name === "placeholder"); | CODE |
| LOW | app/javascript/data/card_payment_method_data.test.ts | 42 | address: "123 Main St", | CODE |
| LOW | app/javascript/data/card_payment_method_data.test.ts | 51 | line1: "123 Main St", | CODE |
| LOW | app/javascript/data/payment_method_result.test.ts | 84 | address: "123 Main St", | CODE |
| LOW | app/javascript/data/payment_method_result.test.ts | 119 | address: "123 Main St", | CODE |
| LOW | …/sidekiq/million_dollar_milestone_check_worker_spec.rb | 30 | street_address: "123 Main St", | CODE |
| LOW | …ec/sidekiq/update_product_files_archive_worker_spec.rb | 109 | { "type" => "paragraph", "content" => [{ "type" => "text", "text" => "Lorem ipsum" }] }, | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 11 | @purchase = create(:purchase, link:, seller: link.user, email: "to@example.org") | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 24 | expect(mail.to).to eq(["to@example.org"]) | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 34 | @purchase = create(:purchase, link:, seller: link.user, email: "to@example.org") | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 152 | email: "to@example.org", | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 983 | let(:seller) { create(:named_seller, name: "John Doe") } | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 1003 | expect(mail.body).to have_link("John Doe", href: "http://seller.test.gumroad.com:31337", exact: true, count: 3) | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 1011 | let(:seller1) { create(:user, name: "John Doe", username: "johndoe") } | CODE |
| LOW | spec/mailers/customer_mailer_spec.rb | 1164 | expect(mail.body).to have_link("John Doe", href: "http://johndoe.test.gumroad.com:31337", exact: true, count | CODE |
| LOW | spec/mailers/community_chat_recap_mailer_spec.rb | 8 | let(:seller) { create(:user, name: "John Doe") } | CODE |
| LOW | spec/mailers/concerns/rescue_smtp_errors_spec.rb | 12 | mail(from: "foo@bar.com", body: "") | CODE |
| LOW | …youts/processor/paypal/paypal_payout_processor_spec.rb | 143 | let(:user) { create(:user_with_compliance_info, payment_address: "user@example.com") } | CODE |
| LOW | spec/models/url_redirect_spec.rb | 345 | { "type" => "paragraph", "content" => [{ "type" => "text", "text" => "Lorem ipsum" }] }, | CODE |
| LOW⚡ | spec/models/url_redirect_spec.rb | 582 | old_variant_rich_content = create(:rich_content, entity: old_variant, title: "Old variant page title", descripti | CODE |
| LOW⚡ | spec/models/url_redirect_spec.rb | 583 | create(:rich_content, entity: variant1, title: "Variant 1 page title", description: [{ "type" => "paragraph", "c | CODE |
| LOW⚡ | spec/models/url_redirect_spec.rb | 584 | variant2_rich_content = create(:rich_content, entity: variant2, title: "Variant 2 page title", description: [{ " | CODE |
| LOW | spec/models/url_redirect_spec.rb | 611 | @rich_content = create(:product_rich_content, entity: @product, title: "Page title", description: [{ "type" => " | CODE |
| LOW | spec/models/url_redirect_spec.rb | 624 | create(:rich_content, entity: variant1, title: "Variant 1 page title", description: [{ "type" => "paragraph", "c | CODE |
| LOW | spec/models/url_redirect_spec.rb | 625 | variant2_rich_content = create(:rich_content, entity: variant2, title: "Variant 2 page title", description: [{ " | CODE |
| LOW | spec/models/url_redirect_spec.rb | 792 | { "type" => "paragraph", "content" => [{ "type" => "text", "text" => "Lorem ipsum" }] }, | CODE |
| LOW | spec/models/url_redirect_spec.rb | 800 | { "type" => "paragraph", "content" => [{ "type" => "text", "text" => "Lorem ipsum" }] }, | CODE |
| LOW | spec/models/resend_event_info_spec.rb | 173 | let(:seller) { create(:user, name: "John Doe", username: "johndoe") } | CODE |
| LOW | spec/models/purchase_spec.rb | 632 | purchase.email = "testingtesting123@example.org" | CODE |
| LOW | spec/models/purchase_spec.rb | 4851 | expect(purchase.email).to eq("foo@bar.com") | CODE |
| LOW | spec/models/gift_spec.rb | 10 | expect(gift.giftee_email).to eq("foo@bar.com") | CODE |
| LOW | spec/models/user_spec.rb | 2583 | expect(user.email).to eq "user@example.com" | CODE |
| LOW | spec/models/user_spec.rb | 2591 | expect(user.support_email).to eq "user@example.com" | CODE |
| LOW | spec/models/rich_content_spec.rb | 69 | { "type" => "paragraph", "content" => [{ "type" => "text", "text" => "Lorem ipsum" }] }, | CODE |
| LOW | spec/models/billing_detail_spec.rb | 60 | full_name: "John Doe", | CODE |
| LOW | spec/models/billing_detail_spec.rb | 61 | street_address: "123 Main Street", | CODE |
| LOW | spec/models/link_spec.rb | 3965 | let(:product) { create(:product, description: "<h1><span>Heading in span</span></h1><b>Bold</b><p><style>color: re | CODE |
| LOW | spec/models/concerns/product/structured_data_spec.rb | 6 | let(:user) { create(:user, name: "John Doe") } | CODE |
| LOW | spec/models/concerns/product/structured_data_spec.rb | 174 | "name" => "John Doe" | CODE |
| LOW | spec/models/concerns/purchase/paypal_spec.rb | 7 | let(:card_visual) { "user@example.com" } | CODE |
| LOW | spec/presenters/url_redirect_presenter_spec.rb | 122 | @user = create(:user, name: "John Doe") | CODE |
| LOW | spec/presenters/url_redirect_presenter_spec.rb | 148 | name: "John Doe", | CODE |
| LOW | spec/presenters/url_redirect_presenter_spec.rb | 198 | @product.update!(custom_receipt: "Lorem ipsum <b>dolor</b> sit amet https://example.com") | CODE |
| LOW | spec/presenters/url_redirect_presenter_spec.rb | 264 | @user.update!(name: "John Doe") | CODE |
| LOW | spec/presenters/url_redirect_presenter_spec.rb | 267 | name: "John Doe", | CODE |
| LOW | spec/presenters/url_redirect_presenter_spec.rb | 568 | @user = create(:user, name: "John Doe", disable_reviews_after_year: true) | CODE |
| 119 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/payments/integrations/paypal_integration_rest_api.rb | 15 | # Create a partner (Gumroad) referral for the given merchant which pre-fills the data when that merchant signs up for | COMMENT |
| MEDIUM | app/models/purchase.rb | 1743 | # Creating a url redirect for purchases which are failed but will appear to have gone through to buyer. create_url_r | COMMENT |
| MEDIUM | app/presenters/rendering_extension.rb | 46 | # Creating a new Gumroad requires a confirmed email (the server enforces | COMMENT |
| MEDIUM | app/modules/user/async_devise_notification.rb | 3 | # This module is responsible for sending Devise email notifications via ActiveJob. | COMMENT |
| MEDIUM | app/services/order/charge_service.rb | 20 | # Create a combined charge for all purchases belonging to the same seller | COMMENT |
| MEDIUM | …rvices/dispute_evidence/create_from_dispute_service.rb | 3 | # Create a dispute_evidence record that will be submitted to Stripe | COMMENT |
| MEDIUM | app/services/onetime/backfill_audience_members_index.rb | 87 | # Creating the index here instead would race the CreateAudienceMembersIndex migration's | COMMENT |
| MEDIUM | app/services/creator_analytics/following.rb | 28 | # This method is used for displaying the running total of followers. | COMMENT |
| MEDIUM | app/services/purchase/create_service.rb | 151 | # Creating the dependent analytics row on an unsaved parent raises | COMMENT |
| MEDIUM | config/anycable.yml | 1 | # This file contains per-environment settings for AnyCable. | COMMENT |
| MEDIUM | config/.rails-rubocop.yml | 152 | # Defining a method with parameters needs parentheses. | COMMENT |
| MEDIUM | config/initializers/rpush.rb | 27 | # Define a custom logger. | COMMENT |
| MEDIUM | config/initializers/wrap_parameters.rb | 5 | # This file contains settings for ActionController::ParamsWrapper which | COMMENT |
| MEDIUM | config/initializers/permissions_policy.rb | 5 | # Define an application-wide HTTP permissions policy. For further | COMMENT |
| MEDIUM | config/initializers/content_security_policy.rb | 5 | # Define an application-wide content security policy. | COMMENT |
| MEDIUM | config/initializers/rack_attack.rb | 132 | # Creating a brand account sends a Devise confirmation email to whatever | COMMENT |
| MEDIUM | spec/models/concerns/attribute_blockable_spec.rb | 411 | # Create a custom test model with its own blockable attributes | COMMENT |
| MEDIUM | spec/models/concerns/affiliate/cookies_spec.rb | 210 | # Create a padded cookie ID that won't match the affiliate's current cookie_id format | COMMENT |
| MEDIUM | spec/requests/workflows_spec.rb | 1630 | # Create a seller with colon in name (simulating legacy data) | COMMENT |
| MEDIUM | spec/requests/settings/payments_spec.rb | 321 | # Create a fresh user with Stripe Connect but no phone number to simulate the reported bug | COMMENT |
| MEDIUM | spec/requests/discover/blackfriday_spec.rb | 104 | # Create the BLACKFRIDAY2025 offer code and associate it with the product | COMMENT |
| MEDIUM | spec/requests/emails/edit_spec.rb | 83 | create(:seller_profile_posts_section, seller:) # Create a profile section | CODE |
| MEDIUM | spec/requests/emails/create_spec.rb | 508 | # Create a draft email from the "Share" tab of a bundle product | COMMENT |
| MEDIUM | spec/requests/checkout/subscription_restart_spec.rb | 63 | # Create a real Stripe PaymentIntent on the Connect account that requires 3DS action. | COMMENT |
| MEDIUM | …ec/requests/subscription/tiered_membership_sca_spec.rb | 21 | # Create a real Stripe PaymentIntent on the Connect account that requires 3DS action. | COMMENT |
| MEDIUM | spec/support/factories/subscriptions.rb | 27 | # Create a temporary payment_option without validation to satisfy subscription validation | COMMENT |
| MEDIUM | spec/controllers/purchases_controller_spec.rb | 1560 | # Create a purchase with the same external_id as the charge (the bug scenario) | COMMENT |
| MEDIUM | spec/controllers/payouts/exportables_controller_spec.rb | 97 | # Create a payment before the OLDEST_DISPLAYABLE_PAYOUT_PERIOD_END_DATE | COMMENT |
| MEDIUM | spec/controllers/concerns/search_products_spec.rb | 6 | # Create a test controller that includes the concern | COMMENT |
| MEDIUM | spec/services/post_email_api_spec.rb | 53 | # Create an email with local part longer than 64 characters | COMMENT |
| MEDIUM | .buildkite/scripts/create_github_release.sh | 54 | # Create the GitHub Release | COMMENT |
| MEDIUM | db/schema.rb | 1 | # This file is auto-generated from the current state of the database. Instead | COMMENT |
| MEDIUM | db/schema.rb | 5 | # This file is the source Rails uses to define your schema when running `bin/rails | COMMENT |
| MEDIUM | db/seeds/010_stripe_merchant_account_seeds.rb | 3 | # Create the shared Stripe merchant account | COMMENT |
| MEDIUM | db/seeds/030_paypal_merchant_account_seeds.rb | 3 | # Create the shared PayPal merchant accounts | COMMENT |
| MEDIUM | db/seeds/020_braintree_merchant_account_seeds.rb | 3 | # Create the shared Braintree merchant accounts | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …lementations/stripe/stripe_merchant_account_manager.rb | 98 | # outside of production to facilitate testing and debugging. | COMMENT |
| MEDIUM | app/models/customer_email_info.rb | 7 | # Queries `email_info_charges` first to leverage the index since there is no `purchase_id` on the associated | COMMENT |
| LOW | app/models/order.rb | 86 | # Since the data is identical, we can just use one of the purchases as the source of that data. | COMMENT |
| MEDIUM | app/models/charge.rb | 248 | # Queries `email_info_charges` first to leverage the index since there is no `purchase_id` on the associated | COMMENT |
| MEDIUM | app/modules/product/stats.rb | 7 | # Essentially returns a sum of "active customers" (for each product) | COMMENT |
| MEDIUM | …rs/global_affiliates/product_eligibility_controller.rb | 20 | # endpoint (GET /l/:permalink.json) to leverage its URL routing — that | COMMENT |
| MEDIUM | spec/services/subscription/updater_service_spec.rb | 1075 | # don't enqueue sale notification for the upgrade purchase to facilitate testing | COMMENT |
| MEDIUM | spec/services/subscription/updater_service_spec.rb | 2315 | # don't enqueue sale notification for the upgrade purchase to facilitate testing | COMMENT |
| MEDIUM | lib/utilities/compliance/countries.rb | 42 | # This list reflects countries under comprehensive OFAC sanctions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/web/database_migration.sh | 33 | # Set MIGRATION_LOCK_INDEX to the index of MIGRATION_LOCK_KEY to enable the lock | COMMENT |
| LOW | app/sidekiq/recurring_charge_worker.rb | 32 | # Check if the user has initiated any plan changes that must be applied at | COMMENT |
| LOW | app/controllers/secure_redirect_controller.rb | 46 | # Check if confirmation text matches any of the allowed texts | COMMENT |
| LOW | app/services/ssl_certificates/generate.rb | 61 | # Check if we have hit the rate limit. | COMMENT |
| LOW | config/environments/production.rb | 73 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. | COMMENT |
| LOW | config/environments/staging.rb | 74 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. | COMMENT |
| LOW | spec/requests/discover/discover_domain_spec.rb | 43 | # Set sales_volume to make sure featured products are predictable | COMMENT |
| LOW | spec/support/stripe_retry_helper.rb | 52 | # Check if current spec has VCR cassette | COMMENT |
| LOW | .github/workflows/tests.yml | 164 | # Check if both images already exist (content-addressed cache hit). | COMMENT |
| LOW | .buildkite/scripts/deploy_production.sh | 10 | # Check if we're in the payouts time window (UTC 10:00 to UTC 12:00) | COMMENT |
| LOW | lib/utilities/sidekiq_utility.rb | 14 | # Set process to quiet mode. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/modules/product/prices.rb | 137 | # if more routes open up to change product price, make sure to wrap in transaction and use this method | COMMENT |
| LOW | config/puma.rb | 41 | # you need to make sure to reconnect any threads in the `on_worker_boot` | COMMENT |
| MEDIUM | config/initializers/friendly_id.rb | 58 | # 'slug', but you can change it if you wish. | COMMENT |
| MEDIUM | config/initializers/friendly_id.rb | 62 | # By default, slug has no size limit, but you can change it if you wish. | COMMENT |
| LOW | config/initializers/friendly_id.rb | 101 | # ASCII. If you use this, don't forget to add "babosa" to your Gemfile. | COMMENT |
| LOW | config/initializers/friendly_id.rb | 101 | # ASCII. If you use this, don't forget to add "babosa" to your Gemfile. | COMMENT |
| MEDIUM | …implementations/paypal/paypal_charge_processor_spec.rb | 10 | # - After this point, you can use the PayPal express checkout token for all further operations available in the charge | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …migrate/20190413210021_sync_indexes_with_production.rb | 5 | # ========== | COMMENT |
| MEDIUM | …migrate/20190413210021_sync_indexes_with_production.rb | 7 | # ========== | COMMENT |
| MEDIUM | …migrate/20190413210021_sync_indexes_with_production.rb | 34 | # ========== | COMMENT |
| MEDIUM | …migrate/20190413210021_sync_indexes_with_production.rb | 36 | # ========== | COMMENT |
| MEDIUM | db/migrate/20200821142223_create_versions.rb | 21 | # ------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …sidekiq/regenerate_sales_related_products_infos_job.rb | 3 | # WARNING: This job can be very slow, and add a lot of rows to the DB. | COMMENT |
| LOW⚡ | app/models/installment.rb | 594 | # NOTE: This method is now only used in one place (PostPresenter), and shouldn't be expected to create any new records | COMMENT |
| LOW | docs/deploying.md | 68 | #### Step 1: Hotfix branch creation | COMMENT |
| LOW | docs/deploying.md | 101 | #### Step 2: Make changes in the branch as required | COMMENT |
| LOW | docs/deploying.md | 105 | #### Step 3: Actual deployment | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/concerns/unused_columns.rb | 11 | # Example usage: | COMMENT |
| LOW | .agents/skills/gumroad-prod-console/scripts/setup.sh | 6 | # Usage: | COMMENT |
| LOW | …ents/skills/gumroad-prod-console/scripts/prod_query.sh | 3 | # Usage: | COMMENT |
| LOW | spec/support/capybara_helpers.rb | 107 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | spec/services/username_generator_service_spec.rb | 10 | it "returns a username generated by OpenAI", :vcr do | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/services/ai/store_agent_service.rb | 16 | # keeps an LLM hallucination or a prompt injection from silently changing a store. | COMMENT |