Repository intelligence

Health Report: discourse

2026-08-12T16:08:15.704067Z all history
B
84
Overall health score
Declining
-0.15 pts/mo
14032
Files Analyzed
1420
Hotspot Files
61
Critical Issues
2.7%
Duplication

Quick Insights

Key findings from the analysis - prioritized by impact

Technical Debt Hotspot

Found 61 critical and 73 high-priority debt items. These are areas where the team has explicitly noted problems. Consider scheduling time to address the most impactful items.

Low Cohesion Classes

Detected 53 classes with low cohesion (LCOM > 50). These classes may be doing too many unrelated things. Consider splitting them into more focused components.

Active Development

98708 commits across 12297 files.

Healthy Codebase

Overall health score of 84 indicates a well-maintained codebase. Continue current practices and address issues as they arise.

Hotspots

Files with both high complexity and frequent changes - highest risk for bugs

1420
Hotspot Files
1.0
Highest Risk
0.64
Average Risk

Risk Landscape

Files in the upper-right are both complex and frequently changed -- the most likely sources of bugs. Bubble size reflects overall risk score. Green is low risk, yellow moderate, red high.

FileLangRiskChangesComplexity

Low Cohesion Classes

Classes doing too many unrelated things - candidates for splitting

ClassFileLanguageLCOMWMCCBO

Architectural Smells

Structural problems that make the codebase harder to change safely

116
Total Smells
16
Cyclic Dependencies
78
Hub Dependencies
19
Unstable Dependencies
TypeSeverityFiles InvolvedSuggestion
Cyclic DependencyCriticallib/backup_restore/s3_backup_store.rb, lib/backup_restore/local_backup_store.rb, lib/backup_restore/backup_store.rbBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCriticallib/content_security_policy/default.rb, lib/content_security_policy/builder.rb, lib/content_security_policy.rbBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../tend/discourse/app/lib/environment.js, frontend/discourse/app/lib/deprecated.js, .../tend/discourse/app/helpers/get-url.js, .../iscourse/app/lib/source-identifier.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCriticalfrontend/discourse/app/models/session.js, frontend/discourse/app/lib/ajax.js, frontend/discourse/app/adapters/rest.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../se/app/lib/blocks/-internals/error.js, ...//-internals/validation/constraints.js, ...//blocks/-internals/validation/args.js, .../nternals/validation/condition-args.js, .../s/-internals/validation/conditions.js, .../blocks/-internals/registry/helpers.js, .../rse/app/lib/registry/block-outlets.js, ...//blocks/-internals/registry/outlet.js, .../b/blocks/-internals/registry/block.js, .../tend/discourse/app/services/blocks.js, .../se/app/blocks/conditions/condition.js, .../se/app/blocks/conditions/decorator.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCriticallib/discourse/safe_exec.rb, app/services/problem_check/landlock.rbBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../rse/float-kit/lib/d-toast-instance.ts, .../iscourse/float-kit/services/toasts.tsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../urse/float-kit/lib/d-menu-instance.ts, ...//discourse/float-kit/services/menu.tsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCriticalfrontend/discourse/app/models/topic.js, .../tend/discourse/app/models/category.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../ourse/app/lib/uppy-checksum-plugin.js, .../discourse/app/lib/uppy/uppy-upload.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../scourse/float-kit/services/tooltip.ts, .../e/float-kit/lib/d-tooltip-instance.tsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical...//notifications-tracking-assertions.js, ...//tests/helpers/form-kit-assertions.js, .../course/tests/helpers/qunit-helpers.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCriticallib/compression/zip.rb, lib/compression/safe_zip_reader.rbBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCriticallib/onebox/engine/loom_onebox.rb, lib/onebox/engine/tiktok_onebox.rb, lib/onebox/engine/motoko_onebox.rb, lib/onebox/engine/hackernews_onebox.rb, .../nebox/engine/facebook_media_onebox.rb, lib/onebox/engine/google_drive_onebox.rb, lib/onebox/engine/restream_onebox.rb, lib/onebox/engine/reddit_media_onebox.rb, lib/onebox/engine/kaltura_onebox.rb, .../onebox/engine/google_photos_onebox.rb, lib/onebox/engine/instagram_onebox.rb, lib/onebox/engine/simplecast_onebox.rb, lib/onebox/engine/wistia_onebox.rb, lib/onebox/engine/cloud_app_onebox.rb, lib/onebox/engine/trello_onebox.rb, lib/onebox/engine/pdf_onebox.rb, .../ebox/engine/five_hundred_px_onebox.rb, .../box/engine/flickr_shortened_onebox.rb, lib/onebox/engine/flickr_onebox.rb, lib/onebox/engine/coub_onebox.rb, lib/onebox/engine/band_camp_onebox.rb, lib/onebox/engine/mixcloud_onebox.rb, lib/onebox/engine/asciinema_onebox.rb, lib/onebox/engine/replit_onebox.rb, lib/onebox/engine/audioboom_onebox.rb, lib/onebox/engine/sketch_fab_onebox.rb, lib/onebox/engine/steam_store_onebox.rb, lib/onebox/engine/vimeo_onebox.rb, lib/onebox/engine/typeform_onebox.rb, lib/onebox/engine/gfycat_onebox.rb, .../nebox/engine/animated_image_onebox.rb, lib/onebox/engine/xkcd_onebox.rb, lib/onebox/engine/slides_onebox.rb, lib/onebox/engine/pastebin_onebox.rb, lib/onebox/engine/imgur_onebox.rb, lib/onebox/engine/sound_cloud_onebox.rb, lib/onebox/engine/pubmed_onebox.rb, lib/onebox/engine/youku_onebox.rb, lib/onebox/engine/youtube_onebox.rb, lib/onebox/engine/wikipedia_onebox.rb, lib/onebox/engine/wikimedia_onebox.rb, .../nebox/engine/twitter_status_onebox.rb, .../nebox/engine/stack_exchange_onebox.rb, .../nebox/engine/threads_status_onebox.rb, lib/onebox/engine/audio_onebox.rb, lib/onebox/engine/video_onebox.rb, lib/onebox/engine/image_onebox.rb, .../ebox/engine/google_play_app_onebox.rb, lib/onebox/engine/google_meet_onebox.rb, lib/onebox/engine/google_maps_onebox.rb, lib/onebox/engine/google_docs_onebox.rb, .../ebox/engine/google_calendar_onebox.rb, ...//engine/github_pull_request_onebox.rb, lib/onebox/engine/github_gist_onebox.rb, .../onebox/engine/github_folder_onebox.rb, .../onebox/engine/github_commit_onebox.rb, lib/onebox/engine/github_issue_onebox.rb, lib/onebox/engine/amazon_onebox.rb, lib/onebox/engine.rb, ...//engine/allowlisted_generic_onebox.rbBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical.../ipts/discourse/models/chat-channel.js, .../scourse/models/chat-direct-message.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Cyclic DependencyCritical...//ai-streamer/updaters/post-updater.js, ...//lib/ai-streamer/progress-handlers.jsBreak the cycle by introducing an interface or restructuring the dependency direction
Central ConnectorCriticallib/onebox/engine.rbDecompose into smaller components with single responsibility; extract interfaces for consumers
Central ConnectorCritical.../e/select-kit/components/select-kit.jsDecompose into smaller components with single responsibility; extract interfaces for consumers
Central ConnectorCritical.../course/tests/helpers/qunit-helpers.jsDecompose into smaller components with single responsibility; extract interfaces for consumers
Hub DependencyHigh.../ourse/tests/helpers/component-test.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/deprecated.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../controllers/application_controller.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../sets/javascripts/discourse/lib/url.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../end/discourse/tests/fixtures/topic.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../d/discourse/app/models/user-action.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/app.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../avascripts/discourse/lib/utilities.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/later.tsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../tend/discourse/app/lib/transformer.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/serializers/basic_user_serializer.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/get-owner.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../se/tests/helpers/select-kit-helper.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/onebox/layout_support.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../ipts/discourse/models/chat-channel.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/service/base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/object.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh...//lib/discourse_workflows/node_type.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../tend/discourse/app/helpers/get-url.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/jobs/onceoff/onceoff.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../avascripts/discourse/lib/constants.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/formatter.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighdocs/developer-guides/lib/api.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/models/category.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../nd/discourse/app/lib/tracked-tools.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../javascripts/discourse/models/topic.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../se/app/lib/blocks/-internals/error.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/onebox/engine/json.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/onebox/engine/standard_embed.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../se/app/lib/blocks/-internals/utils.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../ntrollers/admin-area-settings-base.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/adapters/rest.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/tasks/qunit.rakeConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../rse/tests/helpers/create-pretender.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/theme_settings_manager/string.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../end/discourse/app/routes/discourse.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighplugins/discourse-ai/lib/agents/agent.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/models/session.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/ajax-error.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/service.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighscript/import_scripts/base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighconfig/environment.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../nd/discourse/app/lib/preload-store.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../course/app/blocks/conditions/route.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../ib/composer/rich-editor-extensions.tsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../tend/discourse/app/lib/array-tools.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../iscourse/select-kit/lib/plugin-api.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../core/spec/lib/conversion/step_spec.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighspec/system/page_objects/modals/base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/models/problem_check.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/ajax.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../serializers/application_serializer.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../p/controllers/preferences/tracking.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../course/app/lib/implicit-injections.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh...//lib/migrations/importer/copy_step.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/debounce.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../s/admin-config-with-settings-route.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../discourse-ai/lib/agents/tools/tool.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../se/select-kit/components/combo-box.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../controllers/admin/admin_controller.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/text.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../se/app/blocks/conditions/decorator.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/models/user.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/jobs/base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../tend/discourse/app/models/category.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighapp/models/site.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../iscourse/admin/models/site-setting.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../pp/controllers/chat/api_controller.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../ystem/page_objects/components/base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../discourse/app/controllers/composer.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../outes/build-private-messages-route.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../blocks/-internals/registry/helpers.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighfrontend/discourse/app/lib/decorators.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighspec/system/page_objects/pages/base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../end/discourse/app/lib/icon-library.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHigh.../app/lib/notification-types-manager.jsConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/service/action_base.rbConsider splitting this component into smaller, more focused modules
Hub DependencyHighlib/enum_site_setting.rbConsider splitting this component into smaller, more focused modules
Unstable DependencyMediumconfig/environment.rb, config/application.rbIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../e/app/ui-kit/helpers/d-user-avatar.js, .../course/app/ui-kit/helpers/d-avatar.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../ourse/tests/helpers/component-test.js, .../se/app/models/topic-tracking-state.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, app/models/topic.rbIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, ...//app/components/card-contents-base.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../iscourse/app/components/d-document.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../se/app/components/plugin-connector.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../nstance-initializers/auth-complete.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../nd/discourse/app/lib/link-mentions.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../app/lib/notification-types-manager.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../urse/app/lib/sidebar/admin-sidebar.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../se/app/lib/sidebar/custom-sections.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../tend/discourse/app/models/nav-item.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../d/discourse/app/models/post-stream.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../tend/discourse/app/services/header.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, .../ct-kit/components/composer-actions.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium.../course/tests/helpers/qunit-helpers.js, ...//tests/helpers/form-kit-assertions.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMediumlib/plugin/instance.rb, lib/auth.rbIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)
Unstable DependencyMedium...//lib/ai-streamer/progress-handlers.js, ...//ai-streamer/updaters/post-updater.jsIntroduce an interface in the stable component that the unstable component implements (Dependency Inversion)

Dependency Structure

Import graph analysis - cycles, bottlenecks, and instability

14032
Modules
11620
Dependencies
1.7
Avg Degree
16
Dependency Cycles

Detected Cycles

Cycle (3 files)
lib/backup_restore/s3_backup_store.rblib/backup_restore/local_backup_store.rblib/backup_restore/backup_store.rblib/backup_restore/s3_backup_store.rb
Cycle (3 files)
lib/content_security_policy/default.rblib/content_security_policy/builder.rblib/content_security_policy.rblib/content_security_policy/default.rb
Cycle (4 files)
frontend/discourse/app/lib/environment.jsfrontend/discourse/app/lib/deprecated.jsfrontend/discourse/app/helpers/get-url.jsfrontend/discourse/app/lib/source-identifier.jsfrontend/discourse/app/lib/environment.js
Cycle (3 files)
frontend/discourse/app/models/session.jsfrontend/discourse/app/lib/ajax.jsfrontend/discourse/app/adapters/rest.jsfrontend/discourse/app/models/session.js
Cycle (12 files)
.../nd/discourse/app/lib/blocks/-internals/error.js.../lib/blocks/-internals/validation/constraints.js.../se/app/lib/blocks/-internals/validation/args.js...//blocks/-internals/validation/condition-args.js...//lib/blocks/-internals/validation/conditions.js.../e/app/lib/blocks/-internals/registry/helpers.js.../end/discourse/app/lib/registry/block-outlets.js.../se/app/lib/blocks/-internals/registry/outlet.js.../rse/app/lib/blocks/-internals/registry/block.jsfrontend/discourse/app/services/blocks.js.../nd/discourse/app/blocks/conditions/condition.js.../nd/discourse/app/blocks/conditions/decorator.js.../nd/discourse/app/lib/blocks/-internals/error.js
Cycle (2 files)
lib/discourse/safe_exec.rbapp/services/problem_check/landlock.rblib/discourse/safe_exec.rb
Cycle (2 files)
.../end/discourse/float-kit/lib/d-toast-instance.tsfrontend/discourse/float-kit/services/toasts.ts.../end/discourse/float-kit/lib/d-toast-instance.ts
Cycle (2 files)
.../tend/discourse/float-kit/lib/d-menu-instance.tsfrontend/discourse/float-kit/services/menu.ts.../tend/discourse/float-kit/lib/d-menu-instance.ts
Cycle (2 files)
frontend/discourse/app/models/topic.jsfrontend/discourse/app/models/category.jsfrontend/discourse/app/models/topic.js
Cycle (2 files)
frontend/discourse/app/lib/uppy-checksum-plugin.jsfrontend/discourse/app/lib/uppy/uppy-upload.jsfrontend/discourse/app/lib/uppy-checksum-plugin.js
Cycle (2 files)
frontend/discourse/float-kit/services/tooltip.ts.../d/discourse/float-kit/lib/d-tooltip-instance.tsfrontend/discourse/float-kit/services/tooltip.ts
Cycle (3 files)
.../ts/helpers/notifications-tracking-assertions.js...//discourse/tests/helpers/form-kit-assertions.jsfrontend/discourse/tests/helpers/qunit-helpers.js.../ts/helpers/notifications-tracking-assertions.js
Cycle (2 files)
lib/compression/zip.rblib/compression/safe_zip_reader.rblib/compression/zip.rb
Cycle (60 files)
lib/onebox/engine/loom_onebox.rblib/onebox/engine/tiktok_onebox.rblib/onebox/engine/motoko_onebox.rblib/onebox/engine/hackernews_onebox.rblib/onebox/engine/facebook_media_onebox.rblib/onebox/engine/google_drive_onebox.rblib/onebox/engine/restream_onebox.rblib/onebox/engine/reddit_media_onebox.rblib/onebox/engine/kaltura_onebox.rblib/onebox/engine/google_photos_onebox.rblib/onebox/engine/instagram_onebox.rblib/onebox/engine/simplecast_onebox.rblib/onebox/engine/wistia_onebox.rblib/onebox/engine/cloud_app_onebox.rblib/onebox/engine/trello_onebox.rblib/onebox/engine/pdf_onebox.rblib/onebox/engine/five_hundred_px_onebox.rblib/onebox/engine/flickr_shortened_onebox.rblib/onebox/engine/flickr_onebox.rblib/onebox/engine/coub_onebox.rblib/onebox/engine/band_camp_onebox.rblib/onebox/engine/mixcloud_onebox.rblib/onebox/engine/asciinema_onebox.rblib/onebox/engine/replit_onebox.rblib/onebox/engine/audioboom_onebox.rblib/onebox/engine/sketch_fab_onebox.rblib/onebox/engine/steam_store_onebox.rblib/onebox/engine/vimeo_onebox.rblib/onebox/engine/typeform_onebox.rblib/onebox/engine/gfycat_onebox.rblib/onebox/engine/animated_image_onebox.rblib/onebox/engine/xkcd_onebox.rblib/onebox/engine/slides_onebox.rblib/onebox/engine/pastebin_onebox.rblib/onebox/engine/imgur_onebox.rblib/onebox/engine/sound_cloud_onebox.rblib/onebox/engine/pubmed_onebox.rblib/onebox/engine/youku_onebox.rblib/onebox/engine/youtube_onebox.rblib/onebox/engine/wikipedia_onebox.rblib/onebox/engine/wikimedia_onebox.rblib/onebox/engine/twitter_status_onebox.rblib/onebox/engine/stack_exchange_onebox.rblib/onebox/engine/threads_status_onebox.rblib/onebox/engine/audio_onebox.rblib/onebox/engine/video_onebox.rblib/onebox/engine/image_onebox.rblib/onebox/engine/google_play_app_onebox.rblib/onebox/engine/google_meet_onebox.rblib/onebox/engine/google_maps_onebox.rblib/onebox/engine/google_docs_onebox.rblib/onebox/engine/google_calendar_onebox.rblib/onebox/engine/github_pull_request_onebox.rblib/onebox/engine/github_gist_onebox.rblib/onebox/engine/github_folder_onebox.rblib/onebox/engine/github_commit_onebox.rblib/onebox/engine/github_issue_onebox.rblib/onebox/engine/amazon_onebox.rblib/onebox/engine.rblib/onebox/engine/allowlisted_generic_onebox.rblib/onebox/engine/loom_onebox.rb
Cycle (2 files)
.../ts/javascripts/discourse/models/chat-channel.js.../scripts/discourse/models/chat-direct-message.js.../ts/javascripts/discourse/models/chat-channel.js
Cycle (2 files)
.../course/lib/ai-streamer/updaters/post-updater.js...//discourse/lib/ai-streamer/progress-handlers.js.../course/lib/ai-streamer/updaters/post-updater.js
FileLangPageRankBetweennessInOutInstability

Known Issues

Problems the team has documented but not yet fixed (TODO, FIXME, HACK)

627
Total Issues
61
Critical
73
High
110
Medium

By Severity

By Category

SeverityCategoryFileLangLineComment

Duplicated Code

Code that appears in multiple places - bugs fixed in one spot may need fixing elsewhere

2.7%
Duplication Rate
271
Clone Groups
14647
Duplicate Lines
546518
Total Lines

Duplication Level

Technical Debt Gradient

Per-file debt scores - prioritize cleanup where it matters most

14032
Files Scored
92.6
Average Score
A-
Average Grade
71
Failing Files

Grade Distribution

FileLangScoreGradeStructuralSemanticDuplicationCoupling

Change Activity

How frequently code is being modified

98708
Total Changes
12297
Files Changed
1833823
Lines Added
601780
Lines Deleted
FileLangChangesContributorsChurn Score

Code Ownership

How knowledge is distributed - concentrated knowledge is a risk

7
Bus Factor
5358
Knowledge Silos
14032
Total Files
38.2%
Files at Risk

Top Contributors

Temporal Coupling

Files that frequently change together - reveals hidden dependencies not in the import graph

869
Coupled Pairs
85
Strong Couplings
0.26
Avg Strength
1.0
Max Strength
File AFile BCo-changesStrength

Score Breakdown

How the health score is calculated from individual components

Complexity25%
97
Duplication20%
95
Cohesion15%
55
Debt Gradient15%
93
Known Debt10%
94
Coupling10%
43
Code Smells5%
95

Glossary

Definitions for the quality and risk terminology used in this report

Glossary of Terms

Health Score

A weighted composite metric (0-100) measuring overall code quality. Above 80 is good, 60-80 needs attention, below 60 is concerning.

Hotspot

A file that is both complex AND frequently changed. These are the highest-risk areas because they're hard to change safely but get changed often.

Bus Factor

The minimum number of people who would need to leave before critical knowledge is lost. Higher is better; 1 is a serious risk.

Knowledge Silo

A file that only one person has ever touched. If that person leaves, the knowledge goes with them.

Cyclomatic Complexity

The number of independent paths through code. More paths means more test cases needed and more ways things can go wrong.

Cognitive Complexity

How hard code is to understand. Accounts for nesting, breaks in flow, and things that make humans struggle to follow the logic.

LCOM (Cohesion)

How well a class's methods work together. High LCOM means methods don't share data - the class is probably doing too many unrelated things.

CBO (Coupling)

How many other classes a class depends on. High coupling means changes ripple through the codebase - everything is connected to everything.

Churn Rate

How frequently a file changes. High churn indicates instability - the code may be unclear, have bugs, or be undergoing active development.

Self-Admitted Technical Debt (SATD)

Code issues the team has documented (TODO, FIXME, HACK, XXX). These represent known shortcuts that need eventual attention.

Code Clone / Duplicate

Similar code appearing in multiple places. When a bug is fixed in one spot, it may need fixing elsewhere. Candidates for refactoring into shared functions.

Technical Debt Gradient

Per-file quality score (0-100) combining complexity, duplication, coupling, and other factors. Lower scores mean more accumulated debt.

Temporal Coupling

Files that frequently change together in the same commits. High temporal coupling suggests hidden dependencies not visible in the import graph.

Architectural Smell

A structural pattern that violates design principles: cyclic dependencies, hub-like modules, or stable code depending on unstable code.

Instability

Ratio of outgoing to total dependencies. 0 = maximally stable (many things depend on it), 1 = maximally unstable (depends on many things).

PageRank

Importance of a file in the dependency graph. Files with high PageRank are depended on by many other important files.