AI Slop Code RIsk Monitor

readthedocs/readthedocs.org

The source code that powers readthedocs.org

18.1 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for readthedocs/readthedocs.org, a Python project with 8,396 GitHub stars. SynthScan examined 143,524 lines of code across 847 source files, recording 2314 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 18.1 (Elevated 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.

18.1
Adjusted Signal
18.1
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
8.4K
Stars
Python
Language
143.5K
Lines of Code
847
Files
2.3K
Pattern Hits
2026-10-12
Scan Date
0.07
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 51.9/100 · HIGH

Can maintainers explain intent, assumptions, and trade-offs? 2121 finding(s).

Hallucinated Dependency & Supply Chain Risk 8.2/100 · LOW

Are imports declared and package/API names verified? 86 finding(s).

Agent Over-Engineering Ratio 50.3/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 1998 finding(s).

PR Review Velocity Impact 62.0/100 · HIGH

Which changes need focused human review? 2314 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 15HIGH 42MEDIUM 59LOW 2198

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 2314 distinct pattern matches across 20 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.

Hyper-Verbose Identifiers1891 hits · 1745 pts
SeverityFileLineSnippetContext
LOWreadthedocs/organizations/signals.py33def remove_organization_completely(sender, instance, using, **kwargs):CODE
LOWreadthedocs/organizations/signals.py70def mark_organization_assets_not_cleaned(sender, instance, created, **kwargs):CODE
LOWreadthedocs/organizations/querysets.py59 def subscription_trial_plan_ended(self):CODE
LOWreadthedocs/organizations/models.py36def _upload_organization_avatar_to(instance, filename):CODE
LOWreadthedocs/organizations/models.py56def _get_user_content_storage():CODE
LOWreadthedocs/organizations/filters.py37 def get_organization_queryset(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py183 def test_create_organization_with_empty_slug(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py194 def test_create_organization_with_invalid_unicode_slug(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py206 def test_create_organization_with_big_name(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py215 def test_create_organization_with_existent_slug(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py226 def test_create_organization_with_nonexistent_slug(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py237 def test_create_organization_with_invalid_slug(self):CODE
LOW⚡readthedocs/organizations/tests/test_forms.py247 def test_create_organization_with_dns_invalid_slug(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py40 def test_add_team_member_by_name(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py50 def test_add_duplicate_member_by_username(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py63 def test_add_team_member_by_email(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py83 def test_add_team_invite_unverified_email(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py103 def test_add_fresh_member_by_email(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py123 def test_add_team_member_with_username_matching_other_user_email(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py143 def test_add_team_member_with_username_matching_unverified_email(self):CODE
LOWreadthedocs/organizations/tests/test_forms.py159 def test_add_duplicate_invite_by_email(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py204 def test_member_add_regression(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py211 def test_member_delete_regression(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py229 def test_team_add_slug_conflict(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py261 def test_team_delete_regression(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py300 def test_add_member_by_email_on_org_with_members(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py330 def test_add_duplicate_member_by_email(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py356 def test_add_existing_user_by_username(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py372 def test_invite_already_invited_member_by_username(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py398 def test_invite_already_existing_member_by_username(self):CODE
LOWreadthedocs/organizations/tests/test_orgs.py415 def test_invite_user_from_the_same_org(self, send_email):CODE
LOWreadthedocs/organizations/tests/test_orgs.py452 def test_invite_myuself_to_team(self, send_email):CODE
LOWreadthedocs/organizations/tests/test_views.py96 def test_update_avatar_invalid_dimensions(self):CODE
LOWreadthedocs/organizations/tests/test_views.py119 def test_update_avatar_invalid_image(self):CODE
LOWreadthedocs/organizations/tests/test_views.py142 def test_update_avatar_invalid_extension(self):CODE
LOWreadthedocs/organizations/tests/test_views.py197 def test_delete_blocked_for_banned_owner(self):CODE
LOWreadthedocs/organizations/tests/test_views.py210 def test_delete_blocked_for_spam_project_score(self, get_spam_score):CODE
LOWreadthedocs/organizations/tests/test_views.py270 def test_add_owner_with_username_matching_other_user_email(self):CODE
LOWreadthedocs/organizations/tests/test_views.py288 def test_add_owner_with_username_matching_unverified_email(self):CODE
LOWreadthedocs/organizations/tests/test_views.py560 def test_choose_organization_edit(self):CODE
LOWreadthedocs/organizations/tests/test_views.py596 def test_unspecified_slug_redirects_to_organization_edit(self):CODE
LOWreadthedocs/organizations/tests/test_views.py617 def test_choose_organization_edit(self):CODE
LOWreadthedocs/organizations/tests/test_querysets.py97 def test_organizations_with_trial_subscription_plan_ended(self):CODE
LOWreadthedocs/organizations/tests/test_querysets.py139 def test_organizations_to_be_disabled(self):CODE
LOWreadthedocs/organizations/tests/test_querysets.py283 def test_organizations_disable_serving(self):CODE
LOWreadthedocs/organizations/tests/test_querysets.py357 def test_organizations_clean_artifacts(self):CODE
LOWreadthedocs/organizations/tests/test_filters.py135 def test_filtered_queryset_choice(self, user, organization):CODE
LOWreadthedocs/organizations/tests/test_filters.py150 def test_filtered_queryset_invalid_choice(self, user, organization):CODE
LOWreadthedocs/organizations/tests/test_filters.py173 def test_organization_filter_choices(self, user, organization):CODE
LOWreadthedocs/organizations/tests/test_filters.py221 def test_filtered_queryset_project_choice(self, user, organization, project):CODE
LOWreadthedocs/organizations/tests/test_filters.py245 def test_filtered_queryset_project_invalid_choice(CODE
LOWreadthedocs/organizations/tests/test_filters.py276 def test_filtered_queryset_team_choice(CODE
LOWreadthedocs/organizations/tests/test_filters.py302 def test_filtered_queryset_team_invalid_choice(self, user, organization, project):CODE
LOWreadthedocs/organizations/tests/test_filters.py329 def test_project_filter_choices(self, user, organization, project):CODE
LOWreadthedocs/organizations/tests/test_filters.py402 def test_filtered_queryset_team_choice(self, user, organization, team):CODE
LOWreadthedocs/organizations/tests/test_filters.py426 def test_filtered_queryset_team_invalid_choice(self, user, organization, team):CODE
LOWreadthedocs/organizations/tests/test_filters.py498 def test_filtered_queryset_team_choice(self, user, organization, team, users):CODE
LOWreadthedocs/organizations/tests/test_filters.py524 def test_filtered_queryset_access_choice(self, user, organization, access, users):CODE
LOWreadthedocs/organizations/tests/test_filters.py548 def test_filtered_queryset_team_invalid_choice(self, user, organization):CODE
LOWreadthedocs/organizations/tests/test_filters.py588 def test_access_filter_choices(self, user, organization):CODE
1831 more matches not shown…
Self-Referential Comments51 hits · 162 pts
SeverityFileLineSnippetContext
MEDIUMreadthedocs/organizations/tests/test_orgs.py306 # Create a team member that has no invite.COMMENT
MEDIUMreadthedocs/settings/docker_compose.py70 # Create a Token for an admin User and set it here.COMMENT
MEDIUMreadthedocs/oauth/tests/test_githubapp_webhook.py1132 # Create a webhook automation rule that matches docs filesCOMMENT
MEDIUMreadthedocs/oauth/tests/test_githubapp_webhook.py1177 # Create a webhook automation rule that matches docs filesCOMMENT
MEDIUMreadthedocs/oauth/tests/test_githubapp_webhook.py1355 # Create a webhook automation rule for external versions (PRs)COMMENT
MEDIUMreadthedocs/oauth/tests/test_githubapp_webhook.py1442 # Create a webhook automation rule for external versions (PRs)COMMENT
MEDIUMreadthedocs/oauth/tests/test_githubapp_webhook.py1720 # Create a webhook automation rule that only matches PRs (EXTERNAL),COMMENT
MEDIUMreadthedocs/oauth/tests/test_githubapp_webhook.py1771 # Create a webhook automation rule that only matches branches, not PRs.COMMENT
MEDIUM⚡readthedocs/core/tests/test_db_utils.py270 # Create a project with 3 versionsCOMMENT
MEDIUM⚡readthedocs/core/tests/test_db_utils.py282 # Create a project with 20 versionsCOMMENT
MEDIUM⚡readthedocs/core/tests/test_db_utils.py324 # Create a project with 5 versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py120 # Create a project with multiple versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py214 # Create a project with 3 versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py231 # Create a project with exactly 5 versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py244 # Create a project with 10 versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py257 # Create a project with 25 versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py296 # Create a project with 5 versionsCOMMENT
MEDIUMreadthedocs/core/tests/test_db_utils.py310 # Create a project with 10 versionsCOMMENT
MEDIUM⚡readthedocs/vcs_support/base.py50 # Defining a base API, so we'll have unused argsCOMMENT
MEDIUMreadthedocs/projects/tasks/builds.py156 # Create the object to store all the task-related dataCOMMENT
MEDIUMreadthedocs/projects/tasks/builds.py405 # Create the object to store all the task-related dataCOMMENT
MEDIUMreadthedocs/projects/tests/test_build_tasks.py328 # Create the artifact paths, so that `store_build_artifacts`COMMENT
MEDIUMreadthedocs/projects/tests/test_build_tasks.py542 # Create the artifact paths, so it's detected by the builderCOMMENT
MEDIUMreadthedocs/projects/tests/test_build_tasks.py918 # Create the artifact paths, so it's detected by the builderCOMMENT
MEDIUMreadthedocs/projects/tests/test_build_tasks.py1200 # Create the artifact paths, so it's detected by the builderCOMMENT
MEDIUMreadthedocs/projects/tests/test_build_tasks.py1464 # Create the artifact paths, so it's detected by the builderCOMMENT
MEDIUMreadthedocs/projects/tests/test_domain_views.py199 # Create the first domainCOMMENT
MEDIUMreadthedocs/projects/tests/test_domain_views.py207 # Create the second domainCOMMENT
MEDIUMreadthedocs/builds/tests/test_trigger_build.py40 # Create a running buildCOMMENT
MEDIUMreadthedocs/builds/tests/test_trigger_build.py72 # Create a running buildCOMMENT
MEDIUM⚡readthedocs/builds/tests/test_buildconfig.py87 # Create a build with actual configCOMMENT
MEDIUM⚡readthedocs/builds/tests/test_buildconfig.py92 # Create a build with same config on the same versionCOMMENT
MEDIUMreadthedocs/builds/tests/test_tasks.py217 # Create a Build and manually assign the BuildConfigCOMMENT
MEDIUMreadthedocs/search/parsers.py265 # Create a copy of the node to avoid manipulating theCOMMENT
MEDIUMreadthedocs/search/tests/test_views.py48 # Create a project in bn and add it as a translationCOMMENT
MEDIUMreadthedocs/search/tests/test_views.py67 # Create a project in bn and add it as a translationCOMMENT
MEDIUMreadthedocs/api/v2/client.py36 # Define a retry mechanism trying to attempt to not fail in the first error.COMMENT
MEDIUMreadthedocs/api/v3/tests/test_filters.py61 # Create a running build.COMMENT
MEDIUMreadthedocs/api/v3/tests/test_filters.py78 # Create a running build to make sure it's excluded.COMMENT
MEDIUMreadthedocs/doc_builder/environments.py717 # Create the checkout path if it doesn't exist to avoid Docker creationCOMMENT
MEDIUMreadthedocs/doc_builder/environments.py897 # Create the container in the same network the web container isCOMMENT
MEDIUMreadthedocs/doc_builder/director.py95 # Create the VCS repository where all the commands are going to beCOMMENT
MEDIUMreadthedocs/doc_builder/director.py556 # Create a symlink for ``root`` user to use the same ``.asdf``COMMENT
MEDIUMreadthedocs/doc_builder/tests/test_director.py30 # Create a minimal data object that BuildDirector expectsCOMMENT
MEDIUMreadthedocs/rtd_tests/tests/test_version.py16 # Create a External Version. ie: pull/merge request Version.COMMENT
MEDIUMreadthedocs/rtd_tests/tests/test_oauth.py1007 # Create an external version (PR build) that is not builtCOMMENT
MEDIUMreadthedocs/rtd_tests/tests/test_domains.py250 # Creating the third (3) domain should fail the validation formCOMMENT
MEDIUMreadthedocs/rtd_tests/tests/test_api.py3552 # Create a second GitHub integration for the same project with the same secretCOMMENT
MEDIUMreadthedocs/rtd_tests/tests/test_project.py43 # Create a External Version. ie: pull/merge request Version.COMMENT
MEDIUMreadthedocs/rtd_tests/tests/test_automation_rules.py943 # Create a tag versionCOMMENT
MEDIUMscripts/upload.sh22 # Create a symlink so the zip command uses the name "html" instead of last part of the directory.COMMENT
Hallucination Indicators15 hits · 160 pts
SeverityFileLineSnippetContext
CRITICALreadthedocs/organizations/forms.py6from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/organizations/templatetags/organizations.py5from django.core.exceptions import FieldErrorCODE
CRITICALreadthedocs/domains/validators.py2from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/oauth/tests/test_models.py1from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/projects/validators.py7from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/projects/tasks/builds.py361 response = self.data.api_client.build.concurrent.get(CODE
CRITICALreadthedocs/projects/tasks/utils.py13from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/projects/tests/test_validators.py2from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/projects/tests/test_models.py2from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/builds/version_slug.py25from django.core.exceptions import ValidationErrorCODE
CRITICAL⚡readthedocs/storage/tests/test_s3_storage.py22 mock_bucket.objects.filter.return_value.delete.assert_called_once()CODE
CRITICAL⚡readthedocs/storage/tests/test_s3_storage.py31 mock_bucket.objects.filter.return_value.delete.assert_called_once()CODE
CRITICALreadthedocs/redirects/validators.py2from django.core.exceptions import ValidationErrorCODE
CRITICALreadthedocs/doc_builder/director.py577 for tool, version in self.data.config.build.tools.items():CODE
CRITICALmedia/javascript/jquery/jquery-2.0.3.min.js23})}},k.pseudos.nth=k.pseudos.eq;for(T in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})k.pseudos[T]=u(T);for(T in{sCODE
Empty Error Handlers24 hits · 120 pts
SeverityFileLineSnippetContext
HIGHreadthedocs/settings/docker_compose.py264except KeyError:CODE
HIGHreadthedocs/core/forms.py36except AttributeError:CODE
HIGHreadthedocs/vcs_support/backends/git.py364except ValueError:CODE
HIGHreadthedocs/projects/models.py1650except KeyError:CODE
HIGHreadthedocs/projects/ordering.py33except model.DoesNotExist:CODE
HIGHreadthedocs/projects/version_handling.py52except UnicodeError:CODE
HIGHreadthedocs/builds/models.py674except KeyError:CODE
HIGHreadthedocs/storage/filesystem.py42except FileNotFoundError:CODE
HIGHreadthedocs/search/parsers.py310except StopIteration:CODE
HIGHreadthedocs/integrations/utils.py21except AttributeError:CODE
HIGHreadthedocs/api/v2/views/model_views.py164except AttributeError:CODE
HIGHreadthedocs/api/v3/tests/mixins.py261except ImportError:CODE
HIGHreadthedocs/doc_builder/backends/sphinx.py92except ProjectConfigurationError:CODE
HIGHreadthedocs/proxito/tests/test_hosting.py97except:CODE
HIGHreadthedocs/proxito/tests/test_hosting.py103except:CODE
HIGHreadthedocs/proxito/views/serve.py685except StorageFileNotFound:CODE
HIGHreadthedocs/proxito/views/serve.py139except InfiniteRedirectException:CODE
HIGHreadthedocs/proxito/views/serve.py282except InfiniteRedirectException:CODE
HIGHreadthedocs/proxito/views/serve.py350except InfiniteRedirectException:CODE
HIGHreadthedocs/proxito/views/serve.py491except InfiniteRedirectException:CODE
HIGHreadthedocs/proxito/views/serve.py872except StorageFileNotFound:CODE
HIGHreadthedocs/rtd_tests/base.py83except KeyError:CODE
HIGHreadthedocs/rtd_tests/base.py102except (TypeError, KeyError):CODE
HIGHreadthedocs/rtd_tests/tests/test_imported_file.py53except Exception:CODE
Over-Commented Block122 hits · 114 pts
SeverityFileLineSnippetContext
LOWdocker-compose.override.yml1# docker-compose.override.yml file to launch a full instance of Read the Docs.COMMENT
LOWrequirements/deploy.txt1#COMMENT
LOWrequirements/deploy.txt21 # -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt41bumpver==2026.1132COMMENT
LOWrequirements/deploy.txt61 # -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt81 # -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt101 # viaCOMMENT
LOWrequirements/deploy.txt121 # django-simple-historyCOMMENT
LOWrequirements/deploy.txt141django-debug-toolbar==8.0.0COMMENT
LOWrequirements/deploy.txt161django-simple-history==3.13.0COMMENT
LOWrequirements/deploy.txt181 # via -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt201 # django-elasticsearch-dslCOMMENT
LOWrequirements/deploy.txt221 # via -r requirements/deploy.inCOMMENT
LOWrequirements/deploy.txt241lexid==2021.1006COMMENT
LOWrequirements/deploy.txt261 # requests-oauthlibCOMMENT
LOWrequirements/deploy.txt281prompt-toolkit==3.0.53COMMENT
LOWrequirements/deploy.txt301 # via stack-dataCOMMENT
LOWrequirements/deploy.txt321 # -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt341 # viaCOMMENT
LOWrequirements/deploy.txt361 # via -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt381 # viaCOMMENT
LOWrequirements/deploy.txt401sqlparse==0.6.0COMMENT
LOWrequirements/deploy.txt421 # -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt441 # -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt461 # via -r requirements/pip.txtCOMMENT
LOWrequirements/deploy.txt481 # celeryCOMMENT
LOWrequirements/testing.txt1#COMMENT
LOWrequirements/testing.txt21asgiref==3.12.1COMMENT
LOWrequirements/testing.txt41 # boto3COMMENT
LOWrequirements/testing.txt61 # viaCOMMENT
LOWrequirements/testing.txt81 # viaCOMMENT
LOWrequirements/testing.txt101 # -r requirements/pip.txtCOMMENT
LOWrequirements/testing.txt121 # django-filterCOMMENT
LOWrequirements/testing.txt161 # viaCOMMENT
LOWrequirements/testing.txt181 # viaCOMMENT
LOWrequirements/testing.txt201drf-flex-fields==1.0.2COMMENT
LOWrequirements/testing.txt221 # via -r requirements/pip.txtCOMMENT
LOWrequirements/testing.txt241 # botocoreCOMMENT
LOWrequirements/testing.txt261 # via jinja2COMMENT
LOWrequirements/testing.txt281 # viaCOMMENT
LOWrequirements/testing.txt301 # psycopgCOMMENT
LOWrequirements/testing.txt321 # -r requirements/pip.txtCOMMENT
LOWrequirements/testing.txt341pytest-django==4.14.0COMMENT
LOWrequirements/testing.txt361 # -r requirements/pip.txtCOMMENT
LOWrequirements/testing.txt381 # -r requirements/pip.txtCOMMENT
LOWrequirements/testing.txt401s3transfer==0.19.2COMMENT
LOWrequirements/testing.txt421 # via sphinxCOMMENT
LOWrequirements/testing.txt441stripe==11.6.0COMMENT
LOWrequirements/testing.txt461 # pydantic-coreCOMMENT
LOWrequirements/testing.txt481 # user-agentsCOMMENT
LOWrequirements/testing.txt501 # via -r requirements/pip.txtCOMMENT
LOWrequirements/docker.txt1#COMMENT
LOWrequirements/docker.txt21 # -r requirements/pip.txtCOMMENT
LOWrequirements/docker.txt41bumpver==2026.1132COMMENT
LOWrequirements/docker.txt61 # viaCOMMENT
LOWrequirements/docker.txt81 # viaCOMMENT
LOWrequirements/docker.txt101 # pyqueryCOMMENT
LOWrequirements/docker.txt121 # django-cspCOMMENT
LOWrequirements/docker.txt161django-ipware==7.0.1COMMENT
LOWrequirements/docker.txt181djangorestframework==3.18.1COMMENT
62 more matches not shown…
Excessive Try-Catch Wrapping65 hits · 68 pts
SeverityFileLineSnippetContext
LOWreadthedocs/organizations/forms.py98 except Exception:CODE
LOWreadthedocs/oauth/tasks.py117 except Exception:CODE
LOWreadthedocs/oauth/tasks.py188 except Exception:CODE
LOWreadthedocs/oauth/services/bitbucket.py329 except Exception:CODE
LOWreadthedocs/oauth/services/gitlab.py357 except Exception:CODE
LOWreadthedocs/oauth/services/gitlab.py412 except Exception:CODE
LOWreadthedocs/oauth/services/gitlab.py473 except Exception:CODE
LOWreadthedocs/oauth/services/gitlab.py478 except Exception:CODE
LOWreadthedocs/oauth/services/github.py281 except Exception:CODE
LOWreadthedocs/core/signals.py78 except Exception: # noqaCODE
LOWreadthedocs/core/history.py56 except Exception:CODE
LOWreadthedocs/core/utils/contact.py90 except Exception:CODE
LOWreadthedocs/core/utils/tasks/public.py73 except Exception as e:CODE
LOWreadthedocs/core/views/hooks.py130 except Exception:CODE
LOWreadthedocs/embed/v3/views.py107 except Exception: # noqaCODE
LOWreadthedocs/embed/v3/views.py362 except Exception: # noqaCODE
LOWreadthedocs/projects/models.py2532 except Exception:CODE
LOWreadthedocs/projects/models.py2581 except Exception:CODE
LOWreadthedocs/projects/models.py2615 except Exception:CODE
MEDIUMreadthedocs/projects/forms.py1289def _get_cname(self, domain):CODE
LOWreadthedocs/projects/forms.py1054 except Exception as exc:CODE
LOWreadthedocs/projects/forms.py1571 except Exception:CODE
LOWreadthedocs/projects/tasks/builds.py369 except Exception:CODE
LOWreadthedocs/projects/tasks/builds.py808 except Exception:CODE
LOWreadthedocs/projects/tasks/builds.py854 except Exception:CODE
LOWreadthedocs/projects/tasks/builds.py929 except Exception:CODE
LOWreadthedocs/projects/tasks/builds.py945 except Exception:CODE
LOWreadthedocs/projects/tasks/builds.py999 except Exception as exc:CODE
LOWreadthedocs/projects/tasks/builds.py1023 except Exception as exc:CODE
LOWreadthedocs/projects/tasks/builds.py1054 except Exception:CODE
MEDIUMreadthedocs/projects/tasks/builds.py359def _check_concurrency_limit(self):CODE
MEDIUMreadthedocs/projects/tasks/builds.py1043def _log_directory_size(self, directory, media_type):CODE
LOWreadthedocs/projects/tasks/utils.py136 except Exception:CODE
LOWreadthedocs/projects/tasks/utils.py142 except Exception:CODE
LOWreadthedocs/projects/tasks/utils.py368 except Exception:CODE
LOWreadthedocs/projects/tasks/utils.py447 except Exception:CODE
LOWreadthedocs/projects/tasks/storage.py90 except Exception:CODE
LOWreadthedocs/projects/tasks/search.py319 except Exception:CODE
LOWreadthedocs/projects/tasks/search.py330 except Exception:CODE
LOWreadthedocs/projects/tasks/search.py370 except Exception:CODE
LOWreadthedocs/projects/tasks/search.py415 except Exception:CODE
LOWreadthedocs/projects/views/private.py367 except Exception:CODE
LOWreadthedocs/builds/tasks.py229 except Exception:CODE
LOWreadthedocs/builds/tasks.py238 except Exception:CODE
LOWreadthedocs/builds/tasks.py427 except Exception:CODE
LOWreadthedocs/builds/tasks.py440 except Exception:CODE
LOWreadthedocs/builds/tasks.py562 except Exception:CODE
LOWreadthedocs/builds/tasks.py750 except Exception:CODE
LOWreadthedocs/builds/models.py951 except Exception:CODE
LOWreadthedocs/subscriptions/signals.py58 except Exception:CODE
LOWreadthedocs/subscriptions/views.py88 except Exception:CODE
LOWreadthedocs/search/tasks.py91 except Exception:CODE
LOWreadthedocs/search/parsers.py85 except Exception:CODE
LOWreadthedocs/search/parsers.py221 except Exception as e:CODE
LOWreadthedocs/search/parsers.py236 except Exception:CODE
LOWreadthedocs/search/parsers.py482 except Exception:CODE
LOWreadthedocs/search/utils.py70 except Exception:CODE
LOWreadthedocs/api/mixins.py49 except Exception:CODE
LOWreadthedocs/api/v2/views/model_views.py383 except Exception:CODE
LOWreadthedocs/aws/security_token_service.py114 except Exception:CODE
5 more matches not shown…
Cross-File Repetition11 hits · 55 pts
SeverityFileLineSnippetContext
HIGHreadthedocs/oauth/services/bitbucket.py0gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: iSTRING
HIGHreadthedocs/oauth/services/gitlab.py0gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: iSTRING
HIGHreadthedocs/oauth/services/github.py0gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: iSTRING
HIGHreadthedocs/oauth/services/base.py0gets provider data from git providers webhooks api. :param project: project :type project: project :param integration: iSTRING
HIGHreadthedocs/oauth/services/bitbucket.py0update webhook integration. :param project: project to set up webhook for :type project: project :param integration: webSTRING
HIGHreadthedocs/oauth/services/gitlab.py0update webhook integration. :param project: project to set up webhook for :type project: project :param integration: webSTRING
HIGHreadthedocs/oauth/services/github.py0update webhook integration. :param project: project to set up webhook for :type project: project :param integration: webSTRING
HIGHreadthedocs/oauth/services/base.py0update webhook integration. :param project: project to set up webhook for :type project: project :param integration: webSTRING
HIGHreadthedocs/oauth/services/gitlab.py0create commit status for project. :param build: build to set up commit status for :type build: build :param commit: commSTRING
HIGHreadthedocs/oauth/services/github.py0create commit status for project. :param build: build to set up commit status for :type build: build :param commit: commSTRING
HIGHreadthedocs/oauth/services/base.py0create commit status for project. :param build: build to set up commit status for :type build: build :param commit: commSTRING
Unused Imports44 hits · 42 pts
SeverityFileLineSnippetContext
LOWreadthedocs/organizations/apps.py10CODE
LOWreadthedocs/domains/apps.py11CODE
LOWreadthedocs/oauth/apps.py10CODE
LOWreadthedocs/core/utils/tasks/__init__.py3CODE
LOWreadthedocs/core/utils/tasks/__init__.py3CODE
LOWreadthedocs/core/utils/tasks/__init__.py7CODE
LOWreadthedocs/core/utils/tasks/__init__.py8CODE
LOWreadthedocs/core/utils/tasks/__init__.py9CODE
LOWreadthedocs/config/__init__.py3CODE
LOWreadthedocs/config/__init__.py5CODE
LOWreadthedocs/config/__init__.py6CODE
LOWreadthedocs/projects/apps.py15CODE
LOWreadthedocs/projects/apps.py16CODE
LOWreadthedocs/projects/apps.py17CODE
LOWreadthedocs/projects/apps.py18CODE
LOWreadthedocs/projects/apps.py19CODE
LOWreadthedocs/projects/tests/mockers.py10CODE
LOWreadthedocs/builds/apps.py17CODE
LOWreadthedocs/builds/apps.py18CODE
LOWreadthedocs/builds/tests/test_views.py3CODE
LOWreadthedocs/subscriptions/apps.py13CODE
LOWreadthedocs/subscriptions/apps.py14CODE
LOWreadthedocs/subscriptions/apps.py15CODE
LOWreadthedocs/subscriptions/tests/test_event_handlers.py8CODE
LOWreadthedocs/search/apps.py9CODE
LOWreadthedocs/gold/apps.py11CODE
LOWreadthedocs/gold/tests/test_signals.py2CODE
LOWreadthedocs/audit/apps.py14CODE
LOWreadthedocs/telemetry/apps.py15CODE
LOWreadthedocs/doc_builder/tests/test_director.py7CODE
LOWreadthedocs/notifications/apps.py11CODE
LOWreadthedocs/proxito/tests/handler_404_urls.py17CODE
LOWreadthedocs/rtd_tests/utils.py14CODE
LOWreadthedocs/rtd_tests/tests/test_notifications.py7CODE
LOWreadthedocs/rtd_tests/tests/test_project.py1CODE
LOWreadthedocs/rtd_tests/tests/test_project.py11CODE
LOWreadthedocs/rtd_tests/tests/test_project.py14CODE
LOWreadthedocs/rtd_tests/tests/test_project.py14CODE
LOWreadthedocs/rtd_tests/tests/test_project.py14CODE
LOWreadthedocs/rtd_tests/tests/test_project.py22CODE
LOWreadthedocs/rtd_tests/files/conf.py3CODE
LOWreadthedocs/rtd_tests/files/conf.py3CODE
LOWreadthedocs/rtd_tests/files/conf.py3CODE
LOWreadthedocs/invitations/apps.py15CODE
Fake / Example Data21 hits · 28 pts
SeverityFileLineSnippetContext
LOW⚡readthedocs/organizations/forms.py46 "email": forms.EmailInput(attrs={"placeholder": "accounting@example.com"}),CODE
LOW⚡readthedocs/organizations/forms.py49 attrs={"placeholder": "Engineering docs for Example company"}CODE
LOW⚡readthedocs/organizations/forms.py52 "url": forms.TextInput(attrs={"placeholder": "https://"}),CODE
LOW⚡readthedocs/organizations/tests/test_forms.py186 "email": "test@example.org",CODE
LOW⚡readthedocs/organizations/tests/test_forms.py197 "email": "test@example.org",CODE
LOW⚡readthedocs/organizations/tests/test_forms.py209 "email": "test@example.org",CODE
LOW⚡readthedocs/organizations/tests/test_forms.py218 "email": "test@example.org",CODE
LOW⚡readthedocs/organizations/tests/test_forms.py229 "email": "test@example.org",CODE
LOW⚡readthedocs/organizations/tests/test_forms.py240 "email": "test@example.org",CODE
LOW⚡readthedocs/organizations/tests/test_forms.py250 "email": "test@example.org",CODE
LOWreadthedocs/domains/tests/test_tasks.py22 self.user = get(User, email="user@example.com")CODE
LOW⚡readthedocs/projects/forms.py1505 "version_match_pattern": forms.TextInput(attrs={"placeholder": "^release-.*$"}),CODE
LOW⚡readthedocs/projects/forms.py1506 "webhook_labels_match_pattern": forms.TextInput(attrs={"placeholder": "^docs|build$"}),CODE
LOW⚡readthedocs/projects/forms.py1508 attrs={"placeholder": "^fix|feature$"}CODE
LOWreadthedocs/projects/forms.py91 self.fields["repo"].widget.attrs["placeholder"] = self.placehold_repo()CODE
LOWreadthedocs/projects/forms.py463 self.fields["repo"].widget.attrs["placeholder"] = self.placehold_repo()CODE
LOWreadthedocs/projects/forms.py532 "placeholder": "\n".join(CODE
LOWreadthedocs/projects/forms.py814 "placeholder": "\n".join(CODE
LOWreadthedocs/projects/forms.py923 "options_root_selector": forms.TextInput(attrs={"placeholder": "[role=main]"}),CODE
LOWreadthedocs/projects/forms.py1476 "placeholder": "\n".join(CODE
LOWreadthedocs/search/tests/conftest.py16from .dummy_data import ALL_PROJECTS, PROJECT_DATA_FILESCODE
Deep Nesting26 hits · 25 pts
SeverityFileLineSnippetContext
LOWreadthedocs/settings/docker_compose.py253CODE
LOWreadthedocs/oauth/tasks.py563CODE
LOWreadthedocs/oauth/tasks.py642CODE
LOWreadthedocs/core/management/commands/contact_owners.py122CODE
LOWreadthedocs/core/utils/__init__.py362CODE
LOWreadthedocs/core/utils/contact.py15CODE
LOWreadthedocs/embed/v3/views.py158CODE
LOWreadthedocs/config/config.py612CODE
LOWreadthedocs/vcs_support/backends/git.py60CODE
LOWreadthedocs/projects/filters.py55CODE
LOWreadthedocs/projects/tasks/search.py272CODE
LOWreadthedocs/projects/views/base.py19CODE
LOWreadthedocs/projects/views/private.py302CODE
LOWreadthedocs/projects/views/private.py104CODE
LOWreadthedocs/builds/tasks.py641CODE
LOWreadthedocs/subscriptions/views.py112CODE
LOWreadthedocs/search/parsers.py239CODE
LOWreadthedocs/search/api/v3/queryparser.py28CODE
LOWreadthedocs/redirects/querysets.py50CODE
LOWreadthedocs/api/v2/utils.py26CODE
LOWreadthedocs/api/v2/views/model_views.py352CODE
LOWreadthedocs/telemetry/collectors.py174CODE
LOWreadthedocs/doc_builder/python_environments.py44CODE
LOWreadthedocs/proxito/middleware.py123CODE
LOWreadthedocs/proxito/views/hosting.py334CODE
LOWreadthedocs/proxito/views/serve.py813CODE
Redundant / Tautological Comments15 hits · 24 pts
SeverityFileLineSnippetContext
LOWreadthedocs/organizations/views/private.py93 # Check if user has exactly 1 organization and automatically redirect in this caseCOMMENT
LOWreadthedocs/core/mixins.py83 # Check if resp is a redirect, which means the object was deletedCOMMENT
LOW⚡readthedocs/core/tests/test_db_utils.py187 # Set limit to 1COMMENT
LOW⚡readthedocs/core/tests/test_db_utils.py329 # Set limit to 1COMMENT
LOWreadthedocs/vcs_support/backends/git.py585 # Check if ref is a branch of the origin remoteCOMMENT
LOWreadthedocs/projects/models.py1089 # Check if there is `_has_good_build` annotation in the queryset.COMMENT
LOWreadthedocs/projects/tasks/builds.py230 # Set GIT_SSH_COMMAND to use ssh with options that disable host key checkingCOMMENT
LOWreadthedocs/projects/tasks/builds.py653 # Check if there are multiple files on artifact directories.COMMENT
LOWreadthedocs/projects/tasks/builds.py730 # Check if the project is spamCOMMENT
LOWreadthedocs/doc_builder/director.py208 # Check if the key has write access to the repository (RTD Business only).COMMENT
LOWreadthedocs/doc_builder/director.py749 # Set GIT_SSH_COMMAND to use ssh with options that disable host key checkingCOMMENT
LOWreadthedocs/proxito/views/serve.py265 # Check if the old language code format was used, and redirect to the new one.COMMENT
LOWreadthedocs/proxito/views/serve.py307 # Verify if the project is marked as spam and return a 401 in that caseCOMMENT
LOWreadthedocs/proxito/views/serve.py638 # Verify if the project is marked as spam and return a custom robots.txtCOMMENT
LOWreadthedocs/rtd_tests/tests/test_project_views.py768 # Set version to privateCOMMENT
Cross-Language Confusion6 hits · 15 pts
SeverityFileLineSnippetContext
HIGHreadthedocs/oauth/tasks.py364 "single_file_name": null,STRING
HIGHreadthedocs/oauth/tasks.py367 "suspended_by": null,STRING
HIGHreadthedocs/oauth/tasks.py384 "requester": null,STRING
HIGHreadthedocs/oauth/tasks.py462 "single_file_name": null,STRING
HIGHreadthedocs/oauth/tasks.py465 "suspended_by": null,STRING
HIGHreadthedocs/oauth/tasks.py478 "requester": null,STRING
Decorative Section Separators4 hits · 15 pts
SeverityFileLineSnippetContext
MEDIUM⚡readthedocs/vcs_support/base.py46 # =========================================================================COMMENT
MEDIUM⚡readthedocs/vcs_support/base.py48 # =========================================================================COMMENT
MEDIUMreadthedocs/vcs_support/base.py101 # =========================================================================COMMENT
MEDIUMreadthedocs/vcs_support/base.py103 # =========================================================================COMMENT
AI Response Leakage1 hit · 8 pts
SeverityFileLineSnippetContext
HIGHreadthedocs/search/parsers.py256 # In this example, we cannot use the current <dt>'s ID because they contain invalidCOMMENT
AI Slop Vocabulary4 hits · 6 pts
SeverityFileLineSnippetContext
LOWreadthedocs/oauth/models.py358 # (or v3) to just return the linked Project (slug, url) if the ``RemoteRepository``COMMENT
LOWreadthedocs/projects/version_handling.py150 # we just return the first branch found.COMMENT
LOWreadthedocs/search/api/v3/executor.py62 # we also just return.COMMENT
LOWreadthedocs/api/v2/views/integrations.py139 # In that case, we just return it as is.COMMENT
Verbosity Indicators4 hits · 5 pts
SeverityFileLineSnippetContext
LOWreadthedocs/core/resolver.py335 we need to check if the main translation is a subproject.STRING
LOWreadthedocs/api/v2/views/integrations.py574 # webhooks. If we receive a PUSH event we need to check if the webhook doesn'tCOMMENT
LOWreadthedocs/proxito/views/hosting.py619 # if only we need to check if there are results or not.COMMENT
LOWreadthedocs/proxito/views/serve.py167 # For .com we need to check if the project supports custom domains.COMMENT
TODO Padding3 hits · 4 pts
SeverityFileLineSnippetContext
LOW…th/management/commands/reconnect_remoterepositories.py54 # TODO: consider using same login than RemoteRepository.matches methodCOMMENT
LOWreadthedocs/api/v2/serializers.py399 # TODO: handle exceptionsCOMMENT
LOWreadthedocs/proxito/views/hosting.py434 # TODO: consider adding this field into the ProjectSerializer itself.COMMENT
Modern Structural Boilerplate3 hits · 3 pts
SeverityFileLineSnippetContext
LOWreadthedocs/oauth/services/__init__.py10__all__ = [CODE
LOWreadthedocs/builds/querysets.py29__all__ = ["VersionQuerySet", "BuildQuerySet", "RelatedBuildQuerySet"]CODE
LOWreadthedocs/builds/managers.py24__all__ = ["VersionManager"]CODE
Structural Annotation Overuse2 hits · 3 pts
SeverityFileLineSnippetContext
LOWreadthedocs/projects/views/private.py158 # NOTE: This method is called twice, on .org it doesn't matter,COMMENT
LOWreadthedocs/search/tasks.py37 # WARNING: This must use the exact same queryset as from where we get the ID'sCOMMENT
Slop Phrases2 hits · 2 pts
SeverityFileLineSnippetContext
LOWreadthedocs/settings/base.py1012 # Everytime we need to do a re-index, make sure to check the size of the index and adjust theSTRING
LOWreadthedocs/projects/models.py747 # make sure to use the clone URL from the repository.COMMENT