A platform for community discussion. Free, open, simple.
This report summarizes scanner evidence for discourse/discourse, a Ruby project with 48,041 GitHub stars. SynthScan examined 2,985,312 lines of code across 21547 source files, recording 4565 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 1.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? 4042 finding(s).
Are imports declared and package/API names verified? 498 finding(s).
Are wrappers, guards, and repeated structures necessary? 1912 finding(s).
Which changes need focused human review? 4565 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 4565 distinct pattern matches across 17 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 | app/mailers/invite_mailer.rb | 71 | def send_password_instructions(user) | CODE |
| LOW | app/mailers/user_notifications.rb | 293 | def account_second_factor_disabled(user, opts = {}) | CODE |
| LOW | app/mailers/user_notifications.rb | 534 | def user_invited_to_private_message(user, opts) | CODE |
| LOW | app/mailers/user_notifications.rb | 587 | def prepare_digest_localizations(user, topics) | CODE |
| LOW | app/mailers/user_notifications.rb | 1022 | def build_user_email_token_by_template(template, user, email_token) | CODE |
| LOW | app/models/topic_posters_summary.rb | 79 | def shuffle_last_poster_to_back_in(summary) | CODE |
| LOW | app/models/user_profile.rb | 77 | def upload_profile_background(upload) | CODE |
| LOW | app/models/category.rb | 1472 | def check_permissions_compatibility(parent_permissions, child_permissions) | CODE |
| LOW⚡ | app/models/reviewable_post.rb | 90 | def perform_reject_and_keep_deleted(performed_by, _args) | CODE |
| LOW⚡ | app/models/reviewable_post.rb | 94 | def perform_approve_and_restore(performed_by, _args) | CODE |
| LOW⚡ | app/models/reviewable_post.rb | 100 | def perform_approve_and_unhide(performed_by, _args) | CODE |
| LOW⚡ | app/models/reviewable_post.rb | 107 | def perform_reject_and_delete(performed_by, _args) | CODE |
| LOW⚡ | app/models/reviewable_post.rb | 113 | def perform_reject_and_suspend(performed_by, args) | CODE |
| LOW⚡ | app/models/reviewable_post.rb | 120 | def perform_reject_and_silence(performed_by, args) | CODE |
| LOW | app/models/reviewable_user.rb | 200 | def perform_delete_user_block(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 186 | def perform_unsilence_user_and_ignore(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 234 | def perform_ignore_and_do_nothing(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 259 | def perform_agree_and_suspend(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 266 | def perform_agree_and_silence(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 297 | def perform_delete_and_block_user(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 306 | def perform_agree_and_restore(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 357 | def perform_delete_and_ignore(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 363 | def perform_delete_and_ignore_replies(performed_by, args) | CODE |
| LOW | app/models/reviewable_flagged_post.rb | 376 | def perform_delete_and_agree_replies(performed_by, args) | CODE |
| LOW | app/models/topic_user.rb | 73 | def auto_notification_for_staging( | CODE |
| LOW | app/models/topic_user.rb | 152 | def notification_level_change(user_id, topic_id, notification_level, reason_id) | CODE |
| LOW | app/models/discourse_connect.rb | 120 | def lookup_or_create_user_unsafe(ip_address) | CODE |
| LOW | app/models/discourse_connect.rb | 245 | def match_email_or_create_user(ip_address) | CODE |
| LOW | app/models/discourse_connect.rb | 343 | def change_external_attributes_and_override(sso_record, user) | CODE |
| LOW | app/models/topic.rb | 63 | def filtered_topic_thumbnails(extra_sizes: []) | CODE |
| LOW | app/models/topic.rb | 540 | def enqueue_og_image_regeneration_after_counter_change(previous_count:, current_count:) | CODE |
| LOW | app/models/topic.rb | 1508 | def participant_groups_summary(options = {}) | CODE |
| LOW | app/models/topic.rb | 1699 | def inherit_auto_close_from_category(timer_type: :close) | CODE |
| LOW | app/models/topic.rb | 2059 | def convert_to_private_message(user) | CODE |
| LOW | app/models/topic.rb | 2159 | def update_category_topic_count_by(num) | CODE |
| LOW | app/models/topic.rb | 2235 | def rate_limit_topic_invitation(invited_by) | CODE |
| LOW | app/models/topic.rb | 2255 | def cannot_permanently_delete_reason(user) | CODE |
| LOW | app/models/topic.rb | 2337 | def invite_to_private_message(invited_by, target_user, guardian) | CODE |
| LOW | app/models/topic.rb | 2395 | def apply_per_day_rate_limit_for(key, method_name) | CODE |
| LOW | app/models/group.rb | 480 | def filter_posts_for_guardian(result, guardian, opts = nil) | CODE |
| LOW | app/models/group.rb | 940 | def trigger_user_removed_event(user) | CODE |
| LOW | app/models/group.rb | 1282 | def send_membership_notification(user) | CODE |
| LOW | app/models/category_list.rb | 282 | def categories_with_descendants(categories = @categories) | CODE |
| LOW | app/models/user_notification_schedule.rb | 20 | def create_do_not_disturb_timings(delete_existing: false) | CODE |
| LOW | app/models/theme_modifier_set.rb | 81 | def add_theme_setting_modifier(modifier_name, setting_name) | CODE |
| LOW | app/models/theme_modifier_set.rb | 86 | def refresh_theme_setting_modifiers(target_setting_name: nil, target_setting_value: nil) | CODE |
| LOW | app/models/remote_theme.rb | 444 | def update_theme_color_schemes(theme, schemes) | CODE |
| LOW | app/models/remote_theme.rb | 518 | def create_theme_site_settings(theme, theme_site_settings) | CODE |
| LOW⚡ | app/models/reviewable_queued_post.rb | 153 | def perform_approve_post_closed(performed_by, args) | CODE |
| LOW⚡ | app/models/reviewable_queued_post.rb | 157 | def perform_reject_and_suspend(performed_by, args) | CODE |
| LOW⚡ | app/models/reviewable_queued_post.rb | 164 | def perform_reject_and_silence(performed_by, args) | CODE |
| LOW | app/models/reviewable_queued_post.rb | 180 | def perform_revise_and_reject_post(performed_by, args) | CODE |
| LOW | app/models/reviewable_queued_post.rb | 239 | def perform_delete_and_block_user(performed_by, args) | CODE |
| LOW | app/models/post_action.rb | 114 | def add_moderator_post_if_needed(moderator, disposition, delete_post = false) | CODE |
| LOW | app/models/theme.rb | 866 | def resolve_group_settings_for_user(settings_hash, guardian) | CODE |
| LOW | app/models/theme.rb | 1074 | def convert_list_to_json_schema(setting_row, setting) | CODE |
| LOW | app/models/unsubscribe_key.rb | 31 | def get_unsubscribe_strategy_for(key) | CODE |
| LOW | app/models/upload.rb | 447 | def target_jpeg_image_quality(local_path, test_quality) | CODE |
| LOW | app/models/upload.rb | 520 | def sync_optimized_videos_secure_status(mark_secure) | CODE |
| LOW | app/models/post.rb | 612 | def sync_category_description(category = nil) | CODE |
| 1827 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/user_api_key_client.rb | 21 | COMMENT | |
| LOW | app/models/draft.rb | 341 | end | COMMENT |
| LOW | app/models/draft.rb | 361 | # | COMMENT |
| LOW | app/models/tag_group_membership.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/sidebar_url.rb | 101 | COMMENT | |
| LOW | app/models/single_sign_on_record.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/single_sign_on_record.rb | 21 | # created_at :datetime not null | COMMENT |
| LOW | app/models/child_theme.rb | 21 | COMMENT | |
| LOW | app/models/user_custom_field.rb | 21 | # Table name: user_custom_fields | COMMENT |
| LOW | app/models/user_ip_address_history.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/user_ip_address_history.rb | 21 | # | COMMENT |
| LOW | app/models/directory_item.rb | 241 | # Table name: directory_items | COMMENT |
| LOW | app/models/directory_item.rb | 261 | # index_directory_items_on_likes_given (likes_given) | COMMENT |
| LOW | app/models/topic_group.rb | 81 | # | COMMENT |
| LOW | app/models/group_history.rb | 41 | records = records.where("#{filter}_id" => id) | COMMENT |
| LOW | app/models/group_history.rb | 61 | # acting_user_id :integer not null | COMMENT |
| LOW | app/models/directory_column.rb | 61 | # | COMMENT |
| LOW | app/models/onceoff_log.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/topic_tag.rb | 41 | counters_to_update[:public_topic_count] = -1 | COMMENT |
| LOW | app/models/topic_tag.rb | 61 | # | COMMENT |
| LOW | app/models/topic_allowed_group.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/topic_allowed_group.rb | 21 | # index_topic_allowed_groups_on_topic_id_and_group_id (topic_id,group_id) UNIQUE | COMMENT |
| LOW | app/models/user_profile.rb | 221 | # bio_cooked_version :integer | COMMENT |
| LOW | app/models/user_profile.rb | 241 | # | COMMENT |
| LOW | app/models/topic_view_item.rb | 61 | ) | COMMENT |
| LOW | app/models/topic_view_item.rb | 81 | # index_topic_views_on_viewed_at_and_topic_id (viewed_at,topic_id) | COMMENT |
| LOW | app/models/user_profile_view.rb | 61 | profile_views.joins("INNER JOIN users ON users.id = user_profile_views.user_id") | COMMENT |
| LOW | app/models/user_profile_view.rb | 81 | # | COMMENT |
| LOW | app/models/category.rb | 861 | ids.each { |id| category_groups.build(group_id: id) } | COMMENT |
| LOW | app/models/category.rb | 1521 | COMMENT | |
| LOW | app/models/category.rb | 1541 | # default_slow_mode_seconds :integer | COMMENT |
| LOW | app/models/category.rb | 1561 | # posts_year :integer default(0) | COMMENT |
| LOW | app/models/category.rb | 1581 | # updated_at :datetime not null | COMMENT |
| LOW | app/models/tag.rb | 361 | COMMENT | |
| LOW | app/models/tag.rb | 381 | # | COMMENT |
| LOW | app/models/user_required_fields_version.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/ignored_user.rb | 21 | SQL | COMMENT |
| LOW | app/models/backup_draft_post.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/backup_draft_post.rb | 21 | # index_backup_draft_posts_on_post_id (post_id) UNIQUE | COMMENT |
| LOW | app/models/color_scheme_color.rb | 21 | # id :integer not null, primary key | COMMENT |
| LOW | app/models/user_badge.rb | 141 | # badge_id :integer not null | COMMENT |
| LOW | app/models/user_action.rb | 521 | ) | COMMENT |
| LOW | app/models/user_action.rb | 541 | # target_user_id :integer | COMMENT |
| LOW | app/models/user_avatar.rb | 361 | # selected_user_associated_account_id :bigint | COMMENT |
| LOW | app/models/group_mention.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/group_mention.rb | 21 | # index_group_mentions_on_post_id_and_group_id (post_id,group_id) UNIQUE | COMMENT |
| LOW | app/models/reviewable_score.rb | 121 | # id :bigint not null, primary key | COMMENT |
| LOW | app/models/reviewable_score.rb | 141 | # index_reviewable_scores_on_user_id (user_id) | COMMENT |
| LOW | app/models/reviewable_post.rb | 181 | # id :bigint not null, primary key | COMMENT |
| LOW | app/models/reviewable_post.rb | 201 | # topic_id :integer | COMMENT |
| LOW | app/models/application_request.rb | 121 | end | COMMENT |
| LOW | app/models/skipped_email_log.rb | 81 | # custom_reason :text | COMMENT |
| LOW | app/models/given_daily_like.rb | 61 | # == Schema Information | COMMENT |
| LOW | app/models/user_stat.rb | 361 | BadgeGranter.queue_badge_grant(Badge::Trigger::UserChange, user: user) | COMMENT |
| LOW | app/models/user_stat.rb | 381 | # likes_received :integer default(0), not null | COMMENT |
| LOW | app/models/tag_user.rb | 241 | .joins(:tag) | COMMENT |
| LOW | app/models/tag_user.rb | 261 | # Indexes | COMMENT |
| LOW | app/models/user_warning.rb | 1 | # frozen_string_literal: true | COMMENT |
| LOW | app/models/user_warning.rb | 21 | # | COMMENT |
| LOW | app/models/email_login_code.rb | 81 | # wins the race, so two concurrent redemptions of the same code can't both | COMMENT |
| 1885 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/serializers/wizard_field_serializer.rb | 47 | translate("placeholder") | CODE |
| LOW | frontend/discourse-i18n/src/index.js | 385 | // I18n.prepareOptions({name: "John Doe"}, {name: "Mary Doe", role: "user"}); | COMMENT |
| LOW | frontend/discourse-i18n/src/index.js | 386 | // #=> {name: "John Doe", role: "user"} | COMMENT |
| LOW | frontend/discourse/app/ui-kit/d-text-field.js | 48 | @computed("placeholder", "placeholderKey") | CODE |
| LOW | …ourse/app/static/prosemirror/extensions/placeholder.ts | 16 | key: new PluginKey("placeholder"), | CODE |
| LOW | …ourse/app/static/prosemirror/extensions/placeholder.ts | 27 | if (contextChanged?.key === "placeholder") { | CODE |
| LOW | frontend/discourse/app/static/wizard/models/wizard.js | 192 | "placeholder", | CODE |
| LOW | frontend/discourse/type-tests/models/topic-test.ts | 481 | topic.generateInviteLink("user@example.com", null, undefined); | CODE |
| LOW | frontend/discourse/tests/unit/models/composer-test.js | 563 | { name: "foo@bar.com", type: "email" }, | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 178 | <p>Lorem ipsum <span>dolor sit amet, consectetur</span> <strike>elit.</strike></p> | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 178 | <p>Lorem ipsum <span>dolor sit amet, consectetur</span> <strike>elit.</strike></p> | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 181 | const markdown = `Lorem ipsum dolor sit amet, consectetur ~~elit.~~\n\nUt minim veniam, quis nostrud laboris ut aliq | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 181 | const markdown = `Lorem ipsum dolor sit amet, consectetur ~~elit.~~\n\nUt minim veniam, quis nostrud laboris ut aliq | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 340 | let html = `Lorem ipsum dolor sit amet, | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 340 | let html = `Lorem ipsum dolor sit amet, | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 347 | let output = `Lorem ipsum dolor sit amet, \n\n\`\`\`\nvar helloWorld = () => {\n alert(' hello \t\t world '); | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 347 | let output = `Lorem ipsum dolor sit amet, \n\n\`\`\`\nvar helloWorld = () => {\n alert(' hello \t\t world '); | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 351 | html = `Lorem ipsum dolor sit amet, <code>var helloWorld = () => { | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 351 | html = `Lorem ipsum dolor sit amet, <code>var helloWorld = () => { | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 356 | output = `Lorem ipsum dolor sit amet, \`var helloWorld = () => { alert(' hello world '); return; } helloWorld();\`co | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 356 | output = `Lorem ipsum dolor sit amet, \`var helloWorld = () => { alert(' hello world '); return; } helloWorld();\`co | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 438 | let html = "<blockquote>Lorem ipsum</blockquote>"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 439 | let output = "> Lorem ipsum"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 443 | "<blockquote>Lorem ipsum</blockquote><blockquote><p>dolor sit amet</p></blockquote>"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 443 | "<blockquote>Lorem ipsum</blockquote><blockquote><p>dolor sit amet</p></blockquote>"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 444 | output = "> Lorem ipsum\n\n> dolor sit amet"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 444 | output = "> Lorem ipsum\n\n> dolor sit amet"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 448 | "<blockquote>\nLorem ipsum\n<blockquote><p>dolor <blockquote>sit</blockquote> amet</p></blockquote></blockquote>"; | CODE |
| LOW⚡ | frontend/discourse/tests/unit/lib/to-markdown-test.js | 449 | output = "> Lorem ipsum\n>\n> > dolor\n> >\n> > > sit\n> >\n> > amet"; | CODE |
| LOW | frontend/discourse/tests/unit/lib/build-quote-test.js | 49 | buildQuote(post, "lorem ipsum", { full: true }), | CODE |
| LOW | frontend/discourse/tests/unit/lib/build-quote-test.js | 50 | '[quote="eviltrout, post:1, topic:2, full:true"]\nlorem ipsum\n[/quote]\n\n', | CODE |
| LOW | …ourse/tests/acceptance/create-account-external-test.js | 151 | setupAuthData({ name: "John Doe", name_from_provider: true }); | CODE |
| LOW | …nd/discourse/tests/acceptance/composer-actions-test.js | 692 | '[quote="bianca, post:1, topic:130, full:true"]\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Maecen | CODE |
| LOW | …nd/discourse/tests/acceptance/composer-actions-test.js | 692 | '[quote="bianca, post:1, topic:130, full:true"]\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Maecen | CODE |
| LOW | frontend/discourse/tests/acceptance/group-index-test.js | 33 | "placeholder", | CODE |
| LOW | frontend/discourse/tests/acceptance/group-index-test.js | 68 | "placeholder", | CODE |
| LOW | …ourse/tests/acceptance/invite-show-user-fields-test.js | 52 | await fillIn("#new-account-name", "John Doe"); | CODE |
| LOW | frontend/discourse/tests/acceptance/composer-test.js | 1516 | "placeholder", | CODE |
| LOW | frontend/discourse/tests/acceptance/composer-test.js | 1534 | .hasAttribute("placeholder", i18n("modified_value")); | CODE |
| LOW | …tend/discourse/tests/acceptance/create-account-test.js | 126 | Session.current().email = "foo@bar.com"; | CODE |
| LOW | …tend/discourse/tests/acceptance/create-account-test.js | 130 | assert.strictEqual(email, "foo@bar.com"); | CODE |
| LOW | …e/tests/acceptance/group-manage-email-settings-test.js | 247 | email_username: "test@test.com", | CODE |
| LOW | …e/tests/acceptance/group-manage-email-settings-test.js | 274 | .hasValue("test@test.com", "email username is prefilled"); | CODE |
| LOW | …ntend/discourse/tests/acceptance/invite-accept-test.js | 138 | await fillIn("#new-account-name", "John Doe"); | CODE |
| LOW | …/javascripts/acceptance/chat-channel-reactions-test.js | 13 | message: "Lorem ipsum!", | CODE |
| LOW | …/javascripts/acceptance/chat-channel-reactions-test.js | 14 | cooked: `<p>Lorem ipsum!</p>`, | CODE |
| LOW⚡ | plugins/chat/spec/models/chat/direct_message_spec.rb | 84 | new_user = Fabricate.build(:user, username: "johndoe", name: "John Doe") | CODE |
| LOW⚡ | plugins/chat/spec/models/chat/direct_message_spec.rb | 88 | I18n.t("chat.channel.dm_title.single_user", username: "John Doe"), | CODE |
| LOW⚡ | plugins/chat/spec/models/chat/direct_message_spec.rb | 93 | user2.update!(name: "John Doe") | CODE |
| LOW | plugins/chat/spec/models/chat/direct_message_spec.rb | 108 | new_user = Fabricate.build(:user, username: "johndoe", name: "John Doe") | CODE |
| LOW | …t/spec/jobs/regular/chat/pull_hotlinked_images_spec.rb | 42 | hand_written = fabricate_chat_message("placeholder") | CODE |
| LOW | …cripts/acceptance/create-event-composer-action-test.js | 61 | "placeholder", | CODE |
| LOW | …cripts/acceptance/create-event-composer-action-test.js | 169 | document.querySelector("#reply-title").getAttribute("placeholder"), | CODE |
| LOW | …-events/spec/system/composer/prosemirror_event_spec.rb | 51 | expect(location_input["placeholder"]).to include("location") | CODE |
| LOW | …discourse_workflows/data_table_rows_controller_spec.rb | 41 | fab!(:row) { insert_data_table_row(data_table, "email" => "test@test.com") } | CODE |
| LOW | …discourse_workflows/data_table_rows_controller_spec.rb | 54 | expect(json["rows"][0]["email"]).to eq("test@test.com") | CODE |
| LOW | …discourse_workflows/data_table_rows_controller_spec.rb | 75 | filters: [{ columnName: "email", condition: "invalid", value: "test@test.com" }], | CODE |
| LOW | …course_workflows/data_table_columns_controller_spec.rb | 38 | fab!(:row) { insert_data_table_row(data_table, "email" => "test@test.com") } | CODE |
| LOW | …course_workflows/data_table_columns_controller_spec.rb | 58 | "email" => "test@test.com", | CODE |
| LOW | …course_workflows/data_table_columns_controller_spec.rb | 71 | fab!(:row) { insert_data_table_row(data_table, "email" => "test@test.com") } | CODE |
| 414 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/models/topic_link.rb | 409 | # Create the reflection if we can | COMMENT |
| MEDIUM | app/models/topic_link_click.rb | 14 | # Create a click from a URL and post_id | COMMENT |
| MEDIUM | app/models/private_message_topic_tracking_state.rb | 3 | # This class is used to mirror unread and new status for private messages between | COMMENT |
| MEDIUM | app/models/topic_list.rb | 105 | # Create a lookup for all the user ids we need | COMMENT |
| MEDIUM | app/models/reviewable.rb | 169 | # Create a new reviewable, or if the target has already been reviewed return it to the | COMMENT |
| MEDIUM | app/models/topic_tracking_state.rb | 3 | # This class is used to mirror unread and new status back to end users | COMMENT |
| MEDIUM | app/models/post.rb | 1011 | # Create a reply relationship between quoted posts and this new post | COMMENT |
| MEDIUM | app/models/concerns/reviewable_action_builder.rb | 199 | # Create a result object. | COMMENT |
| MEDIUM | app/jobs/regular/group_smtp_email.rb | 79 | # Create an incoming email record for tracking purposes. | COMMENT |
| MEDIUM | app/controllers/application_controller.rb | 639 | # This method is intended to be a no-op. | COMMENT |
| MEDIUM | app/services/theme_settings_migrations_runner.rb | 7 | # Defining a method `get_category_id_by_name` will result in the `getCategoryIdByName` function being made available | COMMENT |
| MEDIUM | app/services/post_alerter.rb | 721 | # Create the notification | COMMENT |
| MEDIUM⚡ | …services/video_conversion/aws_media_convert_adapter.rb | 310 | # Create a temporary upload object to leverage FileStore::BaseStore path generation | COMMENT |
| MEDIUM | …ervices/notifications/delete_previous_notifications.rb | 3 | # Create a new notification while deleting previous versions of it. | COMMENT |
| MEDIUM | config/locales/transliterate.bg.yml | 2 | # This file contains content for the i18n transliteration map from | COMMENT |
| MEDIUM | config/locales/transliterate.de.yml | 3 | # This file contains transliteration rules for German | COMMENT |
| MEDIUM | config/locales/transliterate.ru.yml | 2 | # This file contains content for the i18n transliteration map from | COMMENT |
| MEDIUM | config/locales/transliterate.en.yml | 3 | # This file contains default transliteration rules and configures stringex | COMMENT |
| MEDIUM | config/locales/transliterate.vi.yml | 3 | # This file contains transliteration rules for Vietnamese | COMMENT |
| MEDIUM | config/locales/transliterate.ug.yml | 3 | # This file contains transliteration rules for Uyghur based on | COMMENT |
| MEDIUM | config/locales/transliterate.ar.yml | 3 | # This file contains transliteration rules for Arabic | COMMENT |
| MEDIUM | config/initializers/100-wrap_parameters.rb | 5 | # This file contains settings for ActionController::ParamsWrapper which | COMMENT |
| MEDIUM | …ration/app/jobs/onceoff/migrate_from_slack_official.rb | 88 | # Create the rule, with clever logic for avoiding duplicates | COMMENT |
| MEDIUM | …ugins/discourse-chat-integration/app/helpers/helper.rb | 151 | # Create a rule for a specific channel | COMMENT |
| MEDIUM | …scourse-chat-integration/spec/services/manager_spec.rb | 292 | # Create a group & user | COMMENT |
| MEDIUM | …scourse-chat-integration/spec/services/manager_spec.rb | 300 | # Create a category | COMMENT |
| MEDIUM | …/discourse-adplugin/spec/system/admin_house_ad_spec.rb | 59 | # Create a new ad | COMMENT |
| MEDIUM | …s/chat/app/queries/chat/tracking_state_report_query.rb | 4 | # This class is responsible for querying the user's current tracking | COMMENT |
| MEDIUM | plugins/chat/spec/system/uploads_spec.rb | 23 | # Define the JavaScript to simulate dragging an external image | COMMENT |
| MEDIUM | plugins/chat/spec/lib/chat/message_processor_spec.rb | 27 | # Create a message with an image in a onebox (common when posting URLs with images) | COMMENT |
| MEDIUM | …at/spec/services/video_conversion/chat_message_spec.rb | 10 | # Create a chat message with video upload | COMMENT |
| MEDIUM | plugins/chat/lib/chat_sdk/message.rb | 33 | # This method is a convenience wrapper around `create` with `streaming: true` set by default. | COMMENT |
| MEDIUM | …s/discourse-assign/spec/components/topic_query_spec.rb | 110 | # Create a new topic with only a post assignment (no topic assignment) | COMMENT |
| MEDIUM | plugins/discourse-assign/lib/assigner.rb | 390 | # Create a webhook event | COMMENT |
| MEDIUM | plugins/discourse-assign/lib/assigner.rb | 453 | # Create a webhook event | COMMENT |
| MEDIUM | …ents/spec/models/discourse_events/events/event_spec.rb | 174 | # Creating a livestream event enqueues onebox warming, which would | COMMENT |
| MEDIUM | plugins/discourse-ai/app/models/ai_artifact.rb | 91 | # Create the version record | COMMENT |
| MEDIUM | …iscourse-ai/spec/models/shared_ai_conversation_spec.rb | 162 | # Create a post with an AI artifact | COMMENT |
| MEDIUM | …se-ai/spec/requests/admin/ai_agents_controller_spec.rb | 430 | # Create the agent | COMMENT |
| MEDIUM | …se-ai/spec/requests/ai_bot/topic_serialization_spec.rb | 17 | # Create a bot post with the custom field set | COMMENT |
| MEDIUM | …se-ai/spec/lib/discourse_automation/llm_triage_spec.rb | 225 | # Create a post and capture its topic | COMMENT |
| MEDIUM | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 21 | # Create the user for this agent | COMMENT |
| MEDIUM⚡ | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 221 | # Create a category and tags for the test | COMMENT |
| MEDIUM⚡ | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 226 | # Create a topic with category and tags | COMMENT |
| MEDIUM⚡ | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 236 | # Create a post in that topic | COMMENT |
| MEDIUM | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 293 | # Create a private message topic | COMMENT |
| MEDIUM | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 305 | # Create a follow-up post | COMMENT |
| MEDIUM | …scourse-ai/spec/lib/completions/cancel_manager_spec.rb | 96 | # Create a model that points to our hanging server | COMMENT |
| MEDIUM | …i/spec/lib/completions/prompt_messages_builder_spec.rb | 275 | # Create a topic with tags | COMMENT |
| MEDIUM | …se-ai/spec/lib/completions/endpoints/anthropic_spec.rb | 1467 | # Create a mock prompt with tool results in messages (simulating what dialect produces) | COMMENT |
| MEDIUM | …/discourse-ai/spec/lib/agents/tools/edit_image_spec.rb | 102 | # Create a private message post with an upload | COMMENT |
| MEDIUM | …/discourse-ai/spec/lib/agents/tools/edit_image_spec.rb | 106 | # Create an upload associated with the private post | COMMENT |
| MEDIUM | …/discourse-ai/spec/lib/agents/tools/edit_image_spec.rb | 130 | # Create a private message post with an upload | COMMENT |
| MEDIUM | …/discourse-ai/spec/lib/agents/tools/edit_image_spec.rb | 134 | # Create an upload associated with the private post | COMMENT |
| MEDIUM | …/discourse-ai/spec/lib/agents/tools/edit_image_spec.rb | 159 | # Create a tool that raises an error | COMMENT |
| MEDIUM | …/discourse-ai/spec/lib/agents/tools/researcher_spec.rb | 47 | # Create a second LLM model to test the researcher_llm option | COMMENT |
| MEDIUM | …iscourse-ai/spec/lib/agents/tools/create_image_spec.rb | 81 | # Create a tool that raises an error | COMMENT |
| MEDIUM | …ourse-ai/spec/lib/utils/ai_staff_action_logger_spec.rb | 51 | # Create a agent with a large system prompt | COMMENT |
| MEDIUM | …ourse-ai/spec/lib/utils/ai_staff_action_logger_spec.rb | 412 | # Create a quota for the model | COMMENT |
| MEDIUM | …ourse-ai/spec/lib/utils/research/llm_formatter_spec.rb | 27 | # Create a post with content that will exceed our token limit | COMMENT |
| 41 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …nd/discourse/app/static/prosemirror/core/serializer.js | 35 | : content.firstChild.type.schema.nodes.paragraph.create( | CODE |
| CRITICAL | …d/discourse/app/static/prosemirror/extensions/quote.js | 275 | const paragraph = view.state.schema.nodes.paragraph.create(); | CODE |
| CRITICAL | …urse/app/static/prosemirror/extensions/link-toolbar.js | 211 | this.#view.state.schema.nodes.paragraph.create( | CODE |
| CRITICAL | …/discourse/app/static/prosemirror/extensions/onebox.js | 393 | view.state.schema.nodes.onebox_inline.create({ | CODE |
| CRITICAL | …/discourse/app/static/prosemirror/extensions/onebox.js | 407 | const oneboxNode = view.state.schema.nodes.onebox.create({ | CODE |
| CRITICAL | …/discourse/app/static/prosemirror/extensions/onebox.js | 428 | nodes.push(view.state.schema.nodes.paragraph.create()); | CODE |
| CRITICAL | …p/static/prosemirror/extensions/override-drag-ghost.ts | 60 | const wrappedNode = view.state.schema.nodes.paragraph.create( | CODE |
| CRITICAL | …nd/discourse/app/static/prosemirror/extensions/link.ts | 370 | tr.addMark(from, to, view.state.schema.marks.link.create({ href: text })); | CODE |
| CRITICAL | frontend/discourse/app/lib/flag-targets/topic-flag.js | 29 | flagModal.args.model.flagModel.actions_summary.forEach((a) => { | CODE |
| CRITICAL | frontend/discourse/app/lib/flag-targets/topic-flag.js | 37 | return flagModal.args.model.flagModel.actions_summary.some((a) => { | CODE |
| CRITICAL | …ntegration/components/prosemirror-editor/table-test.js | 1629 | view.state.schema.nodes.paragraph.create( | CODE |
| CRITICAL⚡ | config/initializers/assets.rb | 12 | Rails.application.config.assets.paths.push( | CODE |
| CRITICAL⚡ | config/initializers/assets.rb | 19 | Rails.application.config.assets.paths.push( | CODE |
| CRITICAL⚡ | config/initializers/assets.rb | 24 | Rails.application.config.assets.excluded_paths.push( | CODE |
| CRITICAL | …g/assets/javascripts/discourse/lib/post-voting-flag.js | 26 | return flagModal.args.model.flagModel.availableFlags.includes( | CODE |
| CRITICAL | …/assets/javascripts/discourse/lib/chat-message-flag.js | 47 | flagModal.args.model.flagModel.availableFlags.includes(flag.name_key) && | CODE |
| CRITICAL | …/unit/components/workflows/build-with-ai-modal-test.js | 52 | modal.aiResponse.response.proposal.script_validations.push({ | CODE |
| CRITICAL | …oards/lib/discourse_workflows/nodes/create_board/v1.rb | 105 | invalid_parameters!(step.exception.record.errors.full_messages.join(", ")) | CODE |
| CRITICAL | …ib/discourse_workflows/nodes/create_board_column/v1.rb | 155 | invalid_parameters!(step.exception.record.errors.full_messages.join(", ")) | CODE |
| CRITICAL | spec/requests/invites_controller_spec.rb | 1605 | expect(invite.invited_users.first.user.groups.pluck(:name)).to contain_exactly( | CODE |
| CRITICAL | lib/middleware/default_headers.rb | 17 | Rails.application.config.action_dispatch.default_headers.to_h.except(*EXCLUDED_HEADERS) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 21 | // ── Top-level nested view ────────────────────────────────────────── | COMMENT |
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 400 | // ── Context view ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 439 | // ── Nested post (single comment in tree) ─────────────────────────── | COMMENT |
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 1018 | // ── Children container ───────────────────────────────────────────── | COMMENT |
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 1054 | // ── Deep-link highlight animation ────────────────────────────────── | COMMENT |
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 1069 | // ── Activity log modal ──────────────────────────────────────────── | COMMENT |
| MEDIUM | app/assets/stylesheets/common/nested-view.scss | 1167 | // ── Mobile layout ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | plugins/chat/lib/chat/message_mover.rb | 8 | # ------------------- | COMMENT |
| MEDIUM | plugins/chat/lib/chat/transcript_service.rb | 316 | # ---------------------------------------- | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 47 | # ── Root view assertions ────────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 65 | # ── Context view assertions ─────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 95 | # ── Post assertions ─────────────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 431 | # ── Actions ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 658 | # ── Deletion/recovery assertions ───────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 693 | # ── Ignored-user placeholder assertions ────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 710 | # ── Post actions ──────────────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 733 | # ── Pinned post assertions ───────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 743 | # ── Load more ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 754 | # ── Cloaking ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | spec/system/page_objects/pages/nested_view.rb | 773 | # ── Suggested topics ────────────────────────────────────────── | COMMENT |
| MEDIUM | script/memstats.rb | 6 | #------------------------------------------------------------------------------ | COMMENT |
| MEDIUM | script/memstats.rb | 28 | #------------------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | lib/discourse_webauthn/registration_service.rb | 85 | #================================================== | COMMENT |
| MEDIUM⚡ | lib/discourse_webauthn/registration_service.rb | 89 | #================================================== | COMMENT |
| MEDIUM⚡ | lib/discourse_webauthn/registration_service.rb | 98 | #================================================== | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/models/category.rb | 876 | # Ideally we can just call .clear here, but it runs SQL, we only want to run it | COMMENT |
| LOW | app/models/theme_field.rb | 464 | self.value_baked = Digest::SHA1.hexdigest(result.join(",")) # We don't use the compiled CSS here, we just use it to | CODE |
| LOW | app/models/email_token.rb | 72 | # If the user's email is already taken, just return nil (failure) | COMMENT |
| MEDIUM | app/models/post.rb | 671 | # Ideally we would want a more comprehensive way of saying that certain | COMMENT |
| MEDIUM⚡ | …services/video_conversion/aws_media_convert_adapter.rb | 310 | # Create a temporary upload object to leverage FileStore::BaseStore path generation | COMMENT |
| MEDIUM | frontend/discourse/app/lib/get-url.js | 42 | // Strip http: and https: to ensure robust domain comparison | COMMENT |
| MEDIUM | config/initializers/100-secret_token.rb | 4 | # backwards support of "seamless" upgrade from Rails 3. | COMMENT |
| LOW | …scourse-ai/spec/lib/completions/endpoints/nova_spec.rb | 233 | # lets just return the tool call again, this is about ensuring we encode the prompt right | COMMENT |
| MEDIUM | …ugins/discourse-ai/lib/agents/tool_runner/discourse.rb | 18 | # default to public visibility and only elevate when `with_private: true` | COMMENT |
| MEDIUM | plugins/live/spec/system/live_livekit_spec.rb | 24 | # media harness satisfies the LiveKit SDK: livekit-client never calls | COMMENT |
| MEDIUM | plugins/boards/app/models/boards/board.rb | 59 | # Essentially a legacy group ID, don't want anyone to use it. | COMMENT |
| LOW | spec/lib/trashable_spec.rb | 4 | # post is trashable, just use it. | COMMENT |
| MEDIUM | spec/lib/onebox/engine/loom_onebox_spec.rb | 13 | '<iframe class="loom-onebox" src="https://www.loom.com/embed/c9695e5dc084496c80b7d7516d2a569a?sid=e1279914-ecaa-4f | CODE |
| MEDIUM | spec/lib/onebox/engine/wistia_onebox_spec.rb | 16 | '<iframe src="https://fast.wistia.net/embed/iframe/26sk4lmiix" width="960" height="540" title="Nice." frameborder= | CODE |
| MEDIUM | script/import_scripts/lithium.rb | 8 | # If you have leverage you may get a data dump, in my case it was provided in XML | COMMENT |
| LOW | lib/site_setting_extension.rb | 920 | # a custom getter for it, so we can just use the normal getter | COMMENT |
| LOW | lib/topic_query.rb | 771 | # topics. Otherwise, just use bumped_at. | COMMENT |
| LOW | lib/onebox/engine/youtube_onebox.rb | 178 | # use params.include? so that you can just add "&loop" | COMMENT |
| LOW | lib/second_factor/actions/discourse_connect_provider.rb | 15 | # 'prompt=none' was requested, so just return a failed authentication | COMMENT |
| LOW | …ate/20250714010001_backfill_themeable_site_settings.rb | 11 | # and theme site settings will just use the default value. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/controllers/list_controller.rb | 464 | # Check if the category slug is incorrect and redirect to a link containing | COMMENT |
| LOW | …discourse-assign/spec/requests/list_controller_spec.rb | 465 | # Assign topics to different users and groups | COMMENT |
| LOW | …discourse-assign/spec/requests/list_controller_spec.rb | 488 | # Assign topics to different users and groups | COMMENT |
| LOW | …ugins/discourse-ai/app/models/llm_credit_allocation.rb | 40 | # Check if association is preloaded to avoid N+1 queries | COMMENT |
| LOW | …ins/discourse-ai/app/jobs/regular/digest_rag_upload.rb | 24 | # Check if this is the first time we process this upload. | COMMENT |
| LOW | plugins/discourse-ai/discourse_automation/llm_tagger.rb | 107 | # Check if we can perform the action before proceeding | COMMENT |
| LOW | …spec/lib/discourse_automation/llm_agent_triage_spec.rb | 207 | # Set up to cause an error | COMMENT |
| LOW | …ugins/discourse-ai/lib/agents/tool_runner/discourse.rb | 237 | # Check if user already exists | COMMENT |
| LOW | plugins/discourse-ai/lib/agents/tools/edit_image.rb | 67 | # Check if upload has access control | COMMENT |
| LOW | plugins/discourse-ai/lib/automation/llm_triage.rb | 232 | # Check if another triage rule already created a reviewable for this post. | COMMENT |
| LOW | plugins/discourse-ai/lib/ai_bot/entry_point.rb | 231 | # Check if the only recipients are bots | COMMENT |
| LOW⚡ | …rs/discourse_subscriptions/user/payments_controller.rb | 93 | # Check if the charge is associated with the given email and has no customer ID | COMMENT |
| LOW⚡ | …rs/discourse_subscriptions/user/payments_controller.rb | 99 | # Check if there are more charges to fetch | COMMENT |
| LOW⚡ | …rs/discourse_subscriptions/user/payments_controller.rb | 102 | # Set starting_after to the last charge's ID for the next batch | COMMENT |
| LOW | spec/requests/admin/themes_controller_spec.rb | 1048 | # Set back to default | COMMENT |
| LOW | …regular/site_setting_update_default_categories_spec.rb | 41 | # Set default_categories_watching to the new value otherwise | COMMENT |
| LOW | script/backport.rb | 122 | # Check if release branch exists | COMMENT |
| LOW | script/bulk_import/uploads_importer.yml | 29 | # Check if files are missing in the upload store and update the database accordingly. | COMMENT |
| LOW | script/bulk_import/uploads_importer.yml | 51 | # Set this to true if the site is a multisite and configure the `multisite_db_name` accordingly | COMMENT |
| LOW | script/import_scripts/friendsmegplus.rb | 38 | # Set this to the base URL for the site; required for importing videos | COMMENT |
| LOW | script/import_scripts/discuz_x.rb | 24 | # Set DISCUZX_BASE_DIR to the base directory of your discuz installation. | COMMENT |
| LOW | script/import_scripts/zoho.rb | 176 | # Check if Zoho's most common form of a code block is present. | COMMENT |
| LOW | lib/validators/video_conversion_enabled_validator.rb | 13 | # Check if MediaConvert role ARN is provided | COMMENT |
| LOW | lib/validators/video_conversion_enabled_validator.rb | 16 | # Check if S3 credentials are provided (either access keys or IAM profile) | COMMENT |
| LOW | lib/validators/video_conversion_enabled_validator.rb | 37 | # Check if using IAM profile | COMMENT |
| LOW | lib/validators/video_conversion_enabled_validator.rb | 40 | # Check if access key and secret are provided | COMMENT |
| LOW | …rate/20250626090725_add_my_messages_link_to_sidebar.rb | 13 | # Check if "My Messages" link already exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plugins/discourse-adplugin/README.md | 36 | ### Step 1 - Install the Official Discourse Advertising Plugin | COMMENT |
| LOW | plugins/discourse-adplugin/README.md | 58 | ### Step 2 - Configure Your Settings to Display Your Advertisments | COMMENT |
| LOW | plugins/discourse-adplugin/README.md | 141 | ### Step 3 - See Your Ad | COMMENT |
| LOW | docs/INSTALL-cloud.md | 74 | ### Step 1: Choose Your Domain | COMMENT |
| LOW | docs/INSTALL-cloud.md | 101 | ### Step 2: Create and Access Your Server | COMMENT |
| LOW | docs/INSTALL-cloud.md | 112 | ### Step 3: Run the Installer | COMMENT |
| LOW | …es/docs/02-development-environments/03-docker-setup.md | 19 | ## Step 1: Install Docker | COMMENT |
| LOW | …es/docs/02-development-environments/03-docker-setup.md | 51 | ## Step 2: Start Container | COMMENT |
| LOW | …-guides/docs/03-code-internals/11-converting-modals.md | 13 | ## Step 1: Move Files | COMMENT |
| LOW | …-guides/docs/03-code-internals/11-converting-modals.md | 17 | ## Step 2: Update the JS file | COMMENT |
| LOW | …-guides/docs/03-code-internals/11-converting-modals.md | 40 | ## Step 3: Update the Template | COMMENT |
| LOW | …-guides/docs/03-code-internals/11-converting-modals.md | 80 | ### Step 4: Update the showModal call sites | COMMENT |
| LOW | …-guides/docs/03-code-internals/11-converting-modals.md | 136 | ## Step 5: Tests | COMMENT |
| LOW | …per-guides/docs/03-code-internals/08-js-performance.md | 15 | ## Step 1: Add `performance.measure()` | COMMENT |
| LOW | …per-guides/docs/03-code-internals/08-js-performance.md | 31 | ## Step 2: Identify URLs for testing | COMMENT |
| LOW | …per-guides/docs/03-code-internals/08-js-performance.md | 65 | ## Step 3: Configure Tachometer | COMMENT |
| LOW | …per-guides/docs/03-code-internals/08-js-performance.md | 94 | ## Step 4: Run benchmark | COMMENT |
| LOW | …er-guides/docs/05-themes-components/19-custom-icons.md | 9 | # Step 1 - Create an SVG Spritesheet | COMMENT |
| LOW | …er-guides/docs/05-themes-components/19-custom-icons.md | 58 | # Step 2 - Add the spritesheet to your theme | COMMENT |
| LOW | script/import_scripts/phpbb3/settings.yml | 113 | remote: false # WARNING: This can considerably slow down your import. It will try to download remote avatars. | CODE |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 17 | ## Step 0: decide the scope | COMMENT |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 33 | ## Step 1: private-symbols pattern | COMMENT |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 94 | ## Step 2: member ordering | COMMENT |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 147 | ## Step 3: comments and blank lines | COMMENT |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 175 | ## Step 4: invocation ordering (`.gjs`/`.gts`, lint-enforced) | COMMENT |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 202 | ## Step 5: documentation review | COMMENT |
| LOW | .skills/discourse-frontend-conventions/SKILL.md | 242 | ## Step 6: lint | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/assets/stylesheets/common/foundation/mixins.scss | 207 | // Example usage: | COMMENT |
| LOW | plugins/discourse-oauth2-basic/plugin.rb | 29 | # Example usage: | COMMENT |
| LOW | spec/support/theme_screenshot_marker.rb | 5 | # Usage: | COMMENT |
| LOW | lib/discourse.rb | 18 | # Usage: | COMMENT |
| LOW | lib/discourse_webauthn.rb | 69 | # Usage: | COMMENT |
| LOW⚡ | lib/plugin/instance.rb | 308 | # Example usage: | COMMENT |
| LOW⚡ | lib/plugin/instance.rb | 350 | # Example usage: | COMMENT |
| LOW⚡ | lib/plugin/instance.rb | 399 | # Example usage: | COMMENT |
| LOW⚡ | lib/plugin/instance.rb | 420 | # Example usage: | COMMENT |
| LOW | lib/plugin/instance.rb | 122 | # Example usage: | COMMENT |
| LOW | lib/plugin/instance.rb | 437 | # Example usage: | COMMENT |
| LOW | lib/plugin/instance.rb | 460 | # Example usage: | COMMENT |
| LOW | lib/emoji/regex_generator.rb | 11 | # Usage: | COMMENT |
| LOW | lib/scheduler/thread_pool.rb | 8 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/lib/discourse_webauthn/authentication_service_spec.rb | 36 | # @params will contain authenticatorData and signature which you can use as is. | COMMENT |
| LOW | script/bulk_import/discourse_merger.rb | 458 | # make sure to get a backup with uploads then convert them to local. | COMMENT |
| LOW | script/import_scripts/mylittleforum.rb | 35 | # If you update the Docker container and perform another import afterwards, make sure to back up these files beforehand. | COMMENT |
| LOW | script/import_scripts/mybbru.rb | 9 | # If your forum has non-English usernames, don't forget to enable Unicode usernames in /admin/site_settings | COMMENT |
| LOW | script/import_scripts/mybbru.rb | 9 | # If your forum has non-English usernames, don't forget to enable Unicode usernames in /admin/site_settings | COMMENT |
| MEDIUM | lib/discourse.rb | 1122 | # you can use Discourse.warn when you want to report custom environment | COMMENT |
| MEDIUM | lib/plugin/instance.rb | 1390 | # We'll include the HTML inside the unsubscribe form, so you can add your fields using the | COMMENT |
| LOW | lib/plugin/instance.rb | 842 | # When using this, make sure to consider the effect on AnonymousCache | COMMENT |
| LOW | lib/email_controller_helper/base_email_unsubscriber.rb | 13 | # Don't forget to call super when extending this method. | COMMENT |
| LOW | lib/email_controller_helper/base_email_unsubscriber.rb | 31 | # Don't forget to call super when extending this method. | COMMENT |
| LOW | …43_ensure_anonymous_and_logged_in_users_auto_groups.rb | 15 | # new auto groups. Also make sure to rebake posts & update group mentions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/discourse/app/services/store.ts | 251 | // You should only call this if you're a test scaffold | COMMENT |
| MEDIUM | plugins/discourse-ai/evals/lib/workbench.rb | 23 | # The Workbench drives the orchestration loop: it prepares the Structured | COMMENT |
| MEDIUM | plugins/discourse-ai/app/models/ai_agent.rb | 5 | # question_consolidator_llm_id is intentionally ignored after the RAG tool | COMMENT |
| MEDIUM | …discourse-ai/lib/completions/endpoints/hugging_face.rb | 44 | # whatever the context window has left. | COMMENT |
| MEDIUM | spec/requests/admin/themes_controller_spec.rb | 1146 | # RemoteTheme is extensively tested, and setting up the test scaffold is a large overhead | COMMENT |
| MEDIUM | .skills/discourse-ai-llm-presets/SKILL.md | 52 | tokens: 1_000_000, # context window in tokens | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …lib/ai_tool_scripts/presets/image_generation/custom.js | 4 | const apiKey = "YOUR_API_KEY"; | CODE |
| HIGH | …per-guides/docs/06-general-guides/05-ai-bot-api-use.md | 29 | Api-Key: <your_api_key> | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | lib/upload_creator.rb | 101 | # FIXME: I've added a bunch of external_upload_too_big checks littered | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | frontend/discourse/app/controllers/topic.js | 1586 | print() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/discourse/app/models/draft.ts | 45 | // TODO: implement this | COMMENT |
| LOW | spec/system/viewing_reviewable_spec.rb | 179 | # TODO: Add test for watched words highlighting | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/post_action_creator.rb | 128 | # We need to check if the creator exists because it's possible `create_message_creator` returns nil | COMMENT |