AI Slop Code RIsk Monitor

rq/rq

Simple job queues for Python

22.9 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for rq/rq, a Python project with 10,693 GitHub stars. SynthScan examined 35,153 lines of code across 143 source files, recording 694 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 22.9 (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.

22.9
Adjusted Signal
22.9
Raw Pattern Score
100%
Time Factor
2026-10-11
Last Push
10.7K
Stars
Python
Language
35.2K
Lines of Code
143
Files
694
Pattern Hits
2026-10-12
Scan Date
0.22
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 60.5/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 9.6/100 · LOW

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

Agent Over-Engineering Ratio 57.1/100 · HIGH

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

PR Review Velocity Impact 70.8/100 · HIGH

Which changes need focused human review? 694 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 0HIGH 32MEDIUM 6LOW 656

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 694 distinct pattern matches across 15 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 Identifiers524 hits · 500 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_job.py131 def test_create_job_from_string_function(self):CODE
LOW⚡tests/test_job.py140 def test_create_job_from_callable_class(self):CODE
LOW⚡tests/test_job.py148 def test_job_properties_set_data_property(self):CODE
LOW⚡tests/test_job.py537 def test_job_status_always_exists(self):CODE
LOW⚡tests/test_job.py544 def test_get_status_fails_when_job_deleted_from_redis(self):CODE
LOW⚡tests/test_job.py553 def test_job_access_outside_job_fails(self):CODE
LOW⚡tests/test_job.py557 def test_job_access_within_job_function(self):CODE
LOW⚡tests/test_job.py566 def test_job_access_within_synchronous_job_function(self):CODE
LOW⚡tests/test_job.py570 def test_job_async_status_finished(self):CODE
LOW⚡tests/test_job.py576 def test_enqueue_job_async_status_finished(self):CODE
LOW⚡tests/test_job.py881 def test_get_call_string_unicode(self):CODE
LOW⚡tests/test_job.py889 def test_create_job_from_static_method(self):CODE
LOW⚡tests/test_job.py897 def test_create_job_with_ttl_should_have_ttl_after_enqueued(self):CODE
LOW⚡tests/test_job.py904 def test_create_job_with_ttl_should_expire(self):CODE
LOW⚡tests/test_job.py911 def test_create_and_cancel_job(self):CODE
LOW⚡tests/test_job.py948 def test_create_and_cancel_job_with_serializer(self):CODE
LOW⚡tests/test_job.py956 def test_key_for_should_return_prefixed_job_id(self):CODE
LOW⚡tests/test_job.py964 def test_blocking_result_fetch(self):CODE
LOWtests/test_job.py110 def test_create_instance_method_job(self):CODE
LOWtests/test_job.py120 def test_create_job_with_serializer(self):CODE
LOWtests/test_job.py159 def test_data_property_sets_job_properties(self):CODE
LOWtests/test_job.py236 def test_persistence_of_empty_jobs(self): # noqaCODE
LOWtests/test_job.py242 def test_persistence_of_typical_jobs(self):CODE
LOWtests/test_job.py276 def test_persistence_of_parent_job(self):CODE
LOWtests/test_job.py307 def test_persistence_of_callbacks(self):CODE
LOWtests/test_job.py360 def test_fetching_unreadable_data(self):CODE
LOWtests/test_job.py391 def test_compressed_exc_info_handling(self):CODE
LOWtests/test_job.py412 def test_compressed_job_data_handling(self):CODE
LOWtests/test_job.py426 def test_custom_meta_is_persisted(self):CODE
LOWtests/test_job.py454 def test_custom_meta_is_rewriten_by_save_meta(self):CODE
LOWtests/test_job.py485 def test_result_ttl_is_persisted(self):CODE
LOWtests/test_job.py497 def test_failure_ttl_is_persisted(self):CODE
LOWtests/test_job.py509 def test_description_is_persisted(self):CODE
LOWtests/test_job.py524 def test_prepare_for_execution(self):CODE
LOWtests/test_job.py637 def test_job_delete_removes_itself_from_registries(self):CODE
LOWtests/test_job.py730 def test_job_delete_removes_results(self):CODE
LOWtests/test_job.py748 def test_job_delete_results_with_pipeline(self):CODE
LOWtests/test_job.py763 def test_job_delete_execution_registry(self):CODE
LOWtests/test_job.py786 def test_create_job_with_invalid_id(self):CODE
LOWtests/test_job.py814 def test_create_job_with_async(self):CODE
LOWtests/test_job.py829 def test_coroutine_job_closes_event_loop(self):CODE
LOWtests/test_job.py841 def test_coroutine_job_closes_event_loop_on_failure(self):CODE
LOWtests/test_job.py856 def test_coroutine_job_closes_event_loop_on_cancellation(self):CODE
LOWtests/test_job.py869 def test_coroutine_job_finalizes_async_resources(self):CODE
LOWtests/test_job.py926 def test_create_and_cancel_job_fails_already_canceled(self):CODE
LOWtests/test_job.py980 def test_should_enqueue_at_front(self):CODE
LOWtests/test_retry.py22 def test_persistence_of_retry_data(self):CODE
LOWtests/test_retry.py137 def test_job_create_with_retry(self):CODE
LOWtests/test_retry.py172 def test_cleanup_handles_retries(self):CODE
LOWtests/test_retry.py265 def test_handle_job_retry_max_retries_exceeded(self):CODE
LOWtests/test_retry.py327 def test_job_handle_retry_with_interval_increments_number_of_retries(self):CODE
LOWtests/test_retry.py338 def test_worker_handles_max_retry(self):CODE
LOWtests/test_retry.py365 def test_worker_handles_retry_interval(self):CODE
LOWtests/test_retry.py398 def test_worker_handles_max_retry_with_interval(self):CODE
LOWtests/test_retry.py416 def test_worker_handles_enqueue_at_front_on_retry(self):CODE
LOWtests/test_retry.py430 def test_worker_handles_enqueue_at_front_on_retry_with_interval(self):CODE
LOWtests/test_registry.py126 def test_add_and_remove_with_serializer(self):CODE
LOWtests/test_registry.py202 def test_clean_registries_with_serializer(self):CODE
LOWtests/test_registry.py255 def test_jobs_are_put_in_registry(self):CODE
LOWtests/test_registry.py292 def test_add_with_deferred_ttl(self):CODE
464 more matches not shown…
Docstring Block Structure20 hits · 100 pts
SeverityFileLineSnippetContext
HIGHrq/queue.py155Returns a Queue instance, based on the naming conventions for naming the internal Redis keys. Can be used to reSTRING
HIGHrq/queue.py577Creates a job based on parameters given Args: func (FunctionReferenceType): The function reference:STRING
HIGHrq/queue.py1178Puts job on ScheduledJobRegistry Args: job (Job): The job to schedule datetime (datetimSTRING
HIGHrq/queue.py1233Enqueues a job for delayed execution checking dependencies. Args: job (Job): The job to enqueue STRING
HIGHrq/queue.py1657Helper method to abstract away from some Redis API details where LPOP accepts only a single key, whereas BLPOP STRING
HIGHrq/queue.py1733Class method returning the job_class instance at the front of the given set of Queues, where the order of the quSTRING
HIGHrq/registry.py198Requeues the job with the given job ID. Args: job_or_id (Union['Job', str]): The Job or theSTRING
HIGHrq/registry.py684Returns datetime (UTC) at which job is scheduled to be enqueued Args: job_or_id (Union[Job, str]): STRING
HIGHrq/job.py270Creates a new Job instance for the given function, arguments, and keyword arguments. Args: STRING
HIGHrq/job.py415Gets the Job Status Args: refresh (bool, optional): Whether to refresh the Job. Defaults to True. STRING
HIGHrq/job.py1207Cancels the given job, which will prevent the job from ever being ran (or inspected). This method merelSTRING
HIGHrq/utils.py80Resolve a function reference into instance and function name components. Args: func: The function referenceSTRING
HIGHrq/utils.py119Converts a bytes value to a string using `utf-8`. Args: v (Union[bytes, str]): The value (bytes or string) STRING
HIGHrq/utils.py167Returns an attribute from a dotted path name. Example: `path.to.func`. When the attribute we look for is a staticmeSTRING
HIGHrq/utils.py265Normalize configuration path to dotted module path format. Converts file paths like 'directory/config_file.py' or 'STRING
HIGHrq/utils.py308Validate that an absolute file path exists and points to a file. Args: file_path: The absolute file path toSTRING
HIGHrq/scripts.py60Atomically check uniqueness, save job, and optionally push to queue using Lua script. Args: connection: RedSTRING
HIGHrq/scripts.py166Atomically check uniqueness, save job, and add to scheduled registry using Lua script. Args: connection: ReSTRING
HIGHrq/worker_registration.py59Returns a list of worker keys for a given queue. Args: queue (Optional['Queue'], optional): The QueSTRING
HIGHrq/worker/base.py283Returns a Worker instance, based on the naming conventions for naming the internal Redis keys. Can be used to rSTRING
Unused Imports63 hits · 63 pts
SeverityFileLineSnippetContext
LOWtests/fixtures.py6CODE
LOWrq/queue.py1CODE
LOWrq/executions.py1CODE
LOWrq/cron_job_registry.py1CODE
LOWrq/worker_pool.py1CODE
LOWrq/command.py7CODE
LOWrq/command.py9CODE
LOWrq/results.py1CODE
LOWrq/webhook.py1CODE
LOWrq/maintenance.py8CODE
LOWrq/registry.py1CODE
LOWrq/cron.py1CODE
LOWrq/job.py1CODE
LOWrq/serializers.py1CODE
LOWrq/cron_scheduler_registry.py1CODE
LOWrq/__init__.py2CODE
LOWrq/__init__.py3CODE
LOWrq/__init__.py3CODE
LOWrq/__init__.py3CODE
LOWrq/__init__.py3CODE
LOWrq/__init__.py4CODE
LOWrq/__init__.py5CODE
LOWrq/__init__.py6CODE
LOWrq/__init__.py8CODE
LOWrq/__init__.py9CODE
LOWrq/__init__.py9CODE
LOWrq/__init__.py9CODE
LOWrq/suspension.py1CODE
LOWrq/types.py1CODE
LOWrq/types.py10CODE
LOWrq/types.py12CODE
LOWrq/types.py12CODE
LOWrq/logutils.py1CODE
LOWrq/intermediate_queue.py1CODE
LOWrq/repeat.py1CODE
LOWrq/utils.py8CODE
LOWrq/callbacks.py1CODE
LOWrq/rate_limit.py1CODE
LOWrq/group.py1CODE
LOWrq/scheduler.py1CODE
LOWrq/worker_registration.py1CODE
LOWrq/job_lifecycle.py1CODE
LOWrq/decorators.py1CODE
LOWrq/cli/__init__.py2CODE
LOWrq/cli/__init__.py6CODE
LOWrq/cli/__init__.py7CODE
LOWrq/cli/__init__.py8CODE
LOWrq/worker/__init__.py1CODE
LOWrq/worker/__init__.py2CODE
LOWrq/worker/__init__.py2CODE
LOWrq/worker/__init__.py2CODE
LOWrq/worker/__init__.py2CODE
LOWrq/worker/__init__.py2CODE
LOWrq/worker/__init__.py2CODE
LOWrq/worker/__init__.py10CODE
LOWrq/worker/__init__.py11CODE
LOWrq/worker/__init__.py11CODE
LOWrq/worker/__init__.py11CODE
LOWrq/worker/__init__.py11CODE
LOWrq/worker/__init__.py11CODE
3 more matches not shown…
Empty Error Handlers7 hits · 35 pts
SeverityFileLineSnippetContext
HIGHtests/test_commands.py57except ResponseError:CODE
HIGHrq/queue.py399except AttributeError:CODE
HIGHrq/job.py1451except NoSuchJobError:CODE
HIGHrq/timeouts.py42except BaseTimeoutException:CODE
HIGHrq/worker/worker_classes.py27except ImportError:CODE
HIGHrq/worker/base.py24except ImportError:CODE
HIGHrq/worker/base.py1277except OSError:CODE
Excessive Try-Catch Wrapping23 hits · 24 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_worker.py1831 except Exception:CODE
LOWrq/queue.py1617 except Exception:CODE
LOWrq/queue.py1806 except Exception as e:CODE
LOWrq/webhook.py99 except Exception:CODE
LOWrq/registry.py307 except Exception:CODE
LOWrq/registry.py621 except Exception:CODE
LOWrq/cron.py487 except Exception as e:CODE
LOWrq/cron.py509 except Exception as e:CODE
LOWrq/cron.py523 except Exception as e:CODE
LOWrq/job.py609 except Exception as e:CODE
LOWrq/job.py999 except Exception:CODE
LOWrq/job.py1031 except Exception:CODE
LOWrq/job.py1044 except Exception: # depends on the serializerCODE
LOWrq/job.py1297 except Exception:CODE
LOWrq/callbacks.py57 except Exception:CODE
LOWrq/callbacks.py74 except Exception:CODE
LOWrq/cli/workers.py169 except Exception as e:CODE
LOWrq/cli/helpers.py259 except Exception:CODE
LOWrq/worker/worker_classes.py159 except Exception:CODE
LOW⚡rq/worker/base.py790 except Exception:CODE
LOW⚡rq/worker/base.py797 except Exception:CODE
LOWrq/worker/base.py775 except Exception:CODE
LOWrq/worker/base.py1436 except Exception:CODE
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHrq/worker_pool.py0installs signal handlers for handling sigint and sigterm gracefully.STRING
HIGHrq/scheduler.py0installs signal handlers for handling sigint and sigterm gracefully.STRING
HIGHrq/worker/base.py0installs signal handlers for handling sigint and sigterm gracefully.STRING
Self-Referential Comments6 hits · 14 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_repeat.py69 # Create a job with repeat settingsCOMMENT
MEDIUMtests/test_results.py66 # Create a result without any execution info (simulates pre-upgrade data).COMMENT
MEDIUMtests/test_cron.py256 # Create a Cron instance firstCOMMENT
MEDIUM.github/workflows/valkey.yml27 # Define the service container for ValkeyCOMMENT
MEDIUMrq/registry.py251 """This method is automatically called by `count()` and `get_job_ids()` methodsSTRING
MEDIUMrq/worker/base.py1115 """This method is called by the main `Worker` (not the horse) as it prepares for execution.STRING
Deep Nesting16 hits · 14 pts
SeverityFileLineSnippetContext
LOWrq/queue.py664CODE
LOWrq/command.py104CODE
LOWrq/registry.py566CODE
LOWrq/cron.py206CODE
LOWrq/job.py1201CODE
LOWrq/job.py1338CODE
LOWrq/job.py1904CODE
LOWrq/repeat.py31CODE
LOWrq/utils.py79CODE
LOWrq/dependency.py11CODE
LOWrq/scheduler.py232CODE
LOWrq/cli/helpers.py267CODE
LOWrq/worker/base.py595CODE
LOWrq/worker/base.py827CODE
LOWrq/worker/base.py1129CODE
LOWrq/worker/base.py1464CODE
AI Structural Patterns14 hits · 14 pts
SeverityFileLineSnippetContext
LOWrq/queue.py553CODE
LOWrq/queue.py723CODE
LOWrq/queue.py809CODE
LOWrq/worker_pool.py256CODE
LOWrq/results.py25CODE
LOWrq/results.py274CODE
LOWrq/cron.py676CODE
LOWrq/cron.py72CODE
LOWrq/cron.py325CODE
LOWrq/job.py245CODE
LOWrq/decorators.py21CODE
LOWrq/cli/helpers.py334CODE
LOWrq/worker/base.py134CODE
LOWrq/worker/base.py595CODE
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWrq/cron.py198 def set_enqueue_time(self, time: datetime) -> None:CODE
LOWrq/job.py437 def set_status(self, status: JobStatus, pipeline: Pipeline | None = None) -> None:CODE
LOWrq/__init__.py11__all__ = [CODE
LOWrq/utils.py45logger = logging.getLogger(__name__)CODE
LOWrq/worker/__init__.py20__all__ = [CODE
LOWrq/worker/base.py251 def _set_ip_address(self, connection: Redis) -> None:CODE
Cross-Language Confusion2 hits · 5 pts
SeverityFileLineSnippetContext
HIGHrq/local.py87 >>> ls.push(42)STRING
HIGHrq/local.py90 >>> ls.push(23)STRING
AI Slop Vocabulary3 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/test_cli.py991 # Make the start method just return to avoid infinite loopCOMMENT
LOWrq/local.py12# Since each thread has its own greenlet we can just use those as identifiersCOMMENT
LOWrq/timeouts.py50 # just pass through, BaseTimeoutException being handled normally to theCOMMENT
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOWtests/test_scheduler.py81 job = Job.create('myfunc', connection=self.connection)COMMENT
LOW.github/workflows/codeql.yaml21 - name: Initialize CodeQLCOMMENT
LOWrq/worker_pool.py121 self.handle_dead_worker(data)COMMENT
Fake / Example Data2 hits · 3 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_queue.py632 pipe.watch(b'fake_key') # Test watch then enqueueCODE
LOW⚡tests/test_queue.py639 pipe.set(b'fake_key', b'fake_value')CODE
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippetContext
LOWrq/repeat.py106 # Decrement repeats_leftCOMMENT
LOWrq/utils.py283 # Check if it's already a dotted path (no path separators and no .py extension)COMMENT