Repository Analysis

dgtlmoon/changedetection.io

Best and simplest tool for website change detection, web page monitoring, and website change alerts. Perfect for tracking content changes, price drops, restock alerts, and website defacement monitoring—all for free or enjoy our SaaS plan!

36.0 Strong AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of dgtlmoon/changedetection.io, a Python project with 32,305 GitHub stars. SynthScan v2.0 examined 91,782 lines of code across 438 source files, recording 2164 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 36.0 places this repository in the Strong AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

36.0
Adjusted Score
36.0
Raw Score
100%
Time Factor
2026-07-13
Last Push
32.3K
Stars
Python
Language
91.8K
Lines of Code
438
Files
2.2K
Pattern Hits
2026-07-14
Scan Date
0.29
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 3HIGH 126MEDIUM 273LOW 1762

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 2164 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers815 hits · 781 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/pluggy_interface.py280def inject_datastore_into_plugins(datastore):CODE
LOWchangedetectionio/pluggy_interface.py296def register_builtin_fetchers():CODE
LOWchangedetectionio/pluggy_interface.py64 def get_itemprop_availability_override(self, content, fetcher_name, fetcher_instance, url, llm_intent=None):CODE
LOWchangedetectionio/pluggy_interface.py244def load_plugins_from_directories():CODE
LOWchangedetectionio/pluggy_interface.py318def register_builtin_restock_plugins():CODE
LOWchangedetectionio/pluggy_interface.py336def collect_ui_edit_stats_extras(watch):CODE
LOWchangedetectionio/pluggy_interface.py351def collect_fetcher_status_icons(fetcher_name):CODE
LOWchangedetectionio/pluggy_interface.py371def get_itemprop_availability_from_plugin(content, fetcher_name, fetcher_instance, url, llm_intent=None):CODE
LOWchangedetectionio/pluggy_interface.py576def get_plugin_template_paths():CODE
LOWchangedetectionio/pluggy_interface.py632def apply_update_handler_alter(update_handler, watch, datastore):CODE
LOWchangedetectionio/worker.py771async def send_content_changed_notification(watch_uuid, notification_q, datastore):CODE
LOWchangedetectionio/worker.py784async def send_filter_failure_notification(watch_uuid, notification_q, datastore):CODE
LOWchangedetectionio/worker.py797async def send_step_failure_notification(watch_uuid, step_n, notification_q, datastore):CODE
LOWchangedetectionio/worker.py31def set_watch_minitext_status(watch, status):CODE
LOWchangedetectionio/rss_tools.py9def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:CODE
LOWchangedetectionio/worker_pool.py129async def start_single_async_worker(worker_id, update_q, notification_q, app, datastore, executor=None):CODE
LOWchangedetectionio/worker_pool.py218def claim_uuid_for_processing(uuid, worker_id):CODE
LOWchangedetectionio/worker_pool.py243def release_uuid_from_processing(uuid, worker_id):CODE
LOWchangedetectionio/worker_pool.py281def is_watch_running_by_another_worker(watch_uuid, current_worker_id):CODE
LOWchangedetectionio/worker_pool.py377def adjust_async_worker_count(new_count, update_q=None, notification_q=None, app=None, datastore=None):CODE
LOWchangedetectionio/queue_handlers.py540 def _emit_notification_signal(self, item: Dict[str, Any]):CODE
LOWchangedetectionio/notification_service.py244 def set_random_for_validation(self):CODE
LOWchangedetectionio/notification_service.py262def add_rendered_diff_to_notification_vars(notification_scan_text:str, prev_snapshot:str, current_snapshot:str, word_difCODE
LOWchangedetectionio/notification_service.py327def set_basic_notification_vars(current_snapshot, prev_snapshot, watch, triggered_text, timestamp_changed=None):CODE
LOWchangedetectionio/notification_service.py358 def queue_notification_for_watch(self, n_object: NotificationContextData, watch, date_index_from=-2, date_index_to=-CODE
LOWchangedetectionio/notification_service.py415 def send_content_changed_notification(self, watch_uuid):CODE
LOWchangedetectionio/notification_service.py459 def send_filter_failure_notification(self, watch_uuid):CODE
LOWchangedetectionio/notification_service.py506 def send_step_failure_notification(self, watch_uuid, step_n):STRING
LOWchangedetectionio/notification_service.py554def create_notification_service(datastore, notification_q):STRING
LOWchangedetectionio/validate_url.py119def is_url_private_or_parser_confused(url):CODE
LOWchangedetectionio/__init__.py516 def queue_watches_for_recheck(datastore, iteration):CODE
LOWchangedetectionio/forms.py802# def validate_notification_urls(self, field):COMMENT
LOWchangedetectionio/forms.py223def validate_time_between_check_has_values(form):CODE
LOWchangedetectionio/html_tools.py122def perl_style_slash_enclosed_regex_to_options(regex):CODE
LOWchangedetectionio/html_tools.py171def subtractive_xpath_selector(selectors: List[str], html_content: str) -> str:CODE
LOWchangedetectionio/html_tools.py440def _get_stripped_text_from_json_match(match):CODE
LOWchangedetectionio/html_tools.py461def extract_json_blob_from_html(content, ensure_is_ldjson_info_type, json_filter):CODE
LOWchangedetectionio/html_tools.py638def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:CODE
LOWchangedetectionio/html_tools.py728def workarounds_for_obfuscations(content):CODE
LOWchangedetectionio/auth_decorator.py16def login_optionally_required(func):CODE
LOWchangedetectionio/flask_app.py139def _configure_plugin_templates():CODE
LOWchangedetectionio/flask_app.py238def _get_watch_queue_position(watch_obj):CODE
LOWchangedetectionio/flask_app.py244def _get_current_worker_count():CODE
LOWchangedetectionio/flask_app.py526 def inject_llm_features_disabled():CODE
LOWchangedetectionio/flask_app.py704 def before_request_handle_cookie_x_settings():CODE
LOWchangedetectionio/flask_app.py1112def ticker_thread_check_time_launch_checks():CODE
LOWchangedetectionio/llm/prompt_builder.py117def build_preview_system_prompt() -> str:CODE
LOWchangedetectionio/llm/prompt_builder.py134def build_change_summary_prompt(diff: str, custom_prompt: str,CODE
LOWchangedetectionio/llm/prompt_builder.py158def build_change_summary_system_prompt() -> str:CODE
LOWchangedetectionio/llm/prompt_builder.py200def build_setup_system_prompt() -> str:CODE
LOWchangedetectionio/llm/evaluator.py347def get_global_token_budget_month(datastore=None) -> int:CODE
LOWchangedetectionio/llm/evaluator.py540def get_effective_summary_prompt(watch, datastore) -> str:CODE
LOWchangedetectionio/llm/evaluator.py158def apply_local_token_multiplier(base_max_tokens: int, llm_cfg: dict) -> int:CODE
LOWchangedetectionio/llm/evaluator.py427def is_global_token_budget_exceeded(datastore) -> bool:CODE
LOWchangedetectionio/llm/evaluator.py552def compute_summary_cache_key(diff_text: str, prompt: str) -> str:CODE
LOWchangedetectionio/llm/evaluator.py593def build_summary_cache_prompt(effective_prompt: str, max_summary_tokens: int,CODE
LOWchangedetectionio/browser_steps/browser_steps.py11def browser_steps_get_valid_steps(browser_steps: list):CODE
LOWchangedetectionio/browser_steps/browser_steps.py148 async def action_click_element_containing_text(self, selector=None, value=''):CODE
LOWchangedetectionio/browser_steps/browser_steps.py158 async def action_click_element_containing_text_if_exists(self, selector=None, value=''):CODE
LOWchangedetectionio/browser_steps/browser_steps.py170 async def action_enter_text_in_field(self, selector, value):CODE
755 more matches not shown…
Decorative Section Separators190 hits · 725 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/__init__.py24# ==============================================================================COMMENT
MEDIUMchangedetectionio/__init__.py26# ==============================================================================COMMENT
MEDIUMchangedetectionio/__init__.py61# ==============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh55# =============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh57# =============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh198# =============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh200# =============================================================================COMMENT
MEDIUMchangedetectionio/llm/evaluator.py338# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py340# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py536# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py538# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py698# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py700# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py755# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py757# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py236# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py238# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py279# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py281# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py445# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py447# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py729 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py732 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py741 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py744 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py754 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py758 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py775 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py778 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py865 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py867 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py874 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py876 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py888 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py890 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py894 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py896 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py906 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py908 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py692 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py694 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py711 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py714 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py921 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py924 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py74# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py76# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py144# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py146# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py210# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py212# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py244# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py246# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py299# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py301# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py348# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py350# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py23# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py25# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py50# ---------------------------------------------------------------------------COMMENT
130 more matches not shown…
Magic Placeholder Names87 hits · 360 pts
SeverityFileLineSnippetContext
HIGHdocs/api-spec.yaml1311 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1315 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1319 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1324 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml2023 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2029 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2035 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2043 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml29 For example: `x-api-key: YOUR_API_KEY`CODE
HIGHdocs/api-spec.yaml162 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml196 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml215 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml239 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml255 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml895 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml900 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml968 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml983 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1032 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1037 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1094 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1106 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1152 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1157 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1190 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1195 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1232 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1237 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1515 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1521 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1555 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1560 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1594 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1604 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1644 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1649 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1696 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1707 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1747 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1752 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1779 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1784 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1804 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1817 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1858 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1870 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1906 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1918 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1951 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1956 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml2122 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml2127 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api_v1/index.html974 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html978 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html982 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html471&lt;p&gt;For example: &lt;code&gt;x-api-key: YOUR_API_KEY&lt;/code&gt;&lt;/p&gt;CODE
HIGHdocs/api_v1/index.html473<p>For example: <code>x-api-key: YOUR_API_KEY</code></p>CODE
HIGHdocs/api_v1/index.html495 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html659 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html803 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
27 more matches not shown…
Excessive Try-Catch Wrapping318 hits · 349 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/pluggy_interface.py271 print(f"Error loading plugin {module_name}: {e}")CODE
LOWchangedetectionio/pluggy_interface.py332 except Exception as e:CODE
LOWchangedetectionio/pluggy_interface.py547 except Exception as e:CODE
LOWchangedetectionio/pluggy_interface.py571 except Exception as e:CODE
LOWchangedetectionio/pluggy_interface.py688 except Exception as e:CODE
LOWchangedetectionio/worker.py780 except Exception as e:CODE
LOWchangedetectionio/worker.py793 except Exception as e:CODE
LOWchangedetectionio/worker.py806 except Exception as e:CODE
LOWchangedetectionio/worker.py120 except Exception as e:CODE
LOWchangedetectionio/worker.py135 except Exception as health_e:CODE
LOWchangedetectionio/worker.py403 except Exception as e:CODE
LOWchangedetectionio/worker.py511 except Exception as e:CODE
LOWchangedetectionio/worker.py567 except Exception as _fe:CODE
LOWchangedetectionio/worker.py584 except Exception as e:CODE
LOWchangedetectionio/worker.py602 except Exception as e:CODE
LOWchangedetectionio/worker.py615 except Exception as e:CODE
LOWchangedetectionio/worker.py642 except Exception as e:CODE
LOWchangedetectionio/worker.py665 except Exception as e:CODE
LOWchangedetectionio/worker.py689 except Exception as cleanup_error:CODE
LOWchangedetectionio/worker.py702 except Exception as finalize_error:CODE
LOWchangedetectionio/worker.py714 except Exception as release_error:CODE
LOWchangedetectionio/is_safe_url.py110 except Exception as e:CODE
LOWchangedetectionio/rss_tools.py201 except Exception as e:STRING
LOWchangedetectionio/worker_pool.py78 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py124 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py157 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py188 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py298 except Exception as uuid_e:CODE
LOWchangedetectionio/worker_pool.py322 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py330 except Exception as health_e:CODE
LOWchangedetectionio/worker_pool.py336 except Exception:CODE
LOWchangedetectionio/worker_pool.py367 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py248 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py257 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py267 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py537 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py549 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py60 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py79 except Exception as notif_e:CODE
LOWchangedetectionio/queue_handlers.py91 except Exception as signal_e:CODE
LOWchangedetectionio/queue_handlers.py97 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py121 except Exception as signal_e:CODE
LOWchangedetectionio/queue_handlers.py131 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py157 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py200 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py210 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py223 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py297 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py332 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py373 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py384 except Exception:CODE
LOWchangedetectionio/queue_handlers.py401 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py409 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py435 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py457 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py480 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py495 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py515 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py524 except Exception as e:CODE
LOWchangedetectionio/favicon_utils.py31 except Exception:CODE
258 more matches not shown…
Unused Imports303 hits · 286 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py328CODE
LOWchangedetectionio/worker.py404CODE
LOWchangedetectionio/worker.py451CODE
LOWchangedetectionio/queue_handlers.py3CODE
LOWchangedetectionio/gc_cleanup.py9CODE
LOWchangedetectionio/validate_url.py3CODE
LOWchangedetectionio/forms.py15CODE
LOWchangedetectionio/forms.py508CODE
LOWchangedetectionio/auth_decorator.py3CODE
LOWchangedetectionio/auth_decorator.py4CODE
LOWchangedetectionio/time_handler.py1CODE
LOWchangedetectionio/languages.py5CODE
LOWchangedetectionio/llm/evaluator.py39CODE
LOW…angedetectionio/content_fetchers/screenshot_handler.py9CODE
LOWchangedetectionio/content_fetchers/__init__.py4CODE
LOWchangedetectionio/content_fetchers/__init__.py11CODE
LOWchangedetectionio/content_fetchers/__init__.py30CODE
LOWchangedetectionio/content_fetchers/__init__.py105CODE
LOWchangedetectionio/content_fetchers/__init__.py98CODE
LOWchangedetectionio/content_fetchers/__init__.py101CODE
LOWchangedetectionio/content_fetchers/puppeteer.py10CODE
LOWchangedetectionio/content_fetchers/requests.py3CODE
LOWchangedetectionio/content_fetchers/requests.py12CODE
LOWchangedetectionio/content_fetchers/requests.py40CODE
LOWchangedetectionio/content_fetchers/requests.py40CODE
LOWchangedetectionio/content_fetchers/requests.py40CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py4CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py33CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py34CODE
LOWchangedetectionio/notification/handler.py309CODE
LOWchangedetectionio/notification/handler.py311CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py61CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py61CODE
LOW…ctionio/notification/apprise_plugin/custom_handlers.py53CODE
LOW…ctionio/notification/apprise_plugin/custom_handlers.py63CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py3CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_queue_handler.py4CODE
LOWchangedetectionio/tests/test_queue_handler.py4CODE
LOWchangedetectionio/tests/test_queue_handler.py5CODE
LOWchangedetectionio/tests/test_preview_endpoints.py3CODE
LOWchangedetectionio/tests/test_preview_endpoints.py5CODE
LOWchangedetectionio/tests/test_preview_endpoints.py5CODE
LOWchangedetectionio/tests/test_preview_endpoints.py5CODE
LOWchangedetectionio/tests/test_backend.py6CODE
LOWchangedetectionio/tests/test_backend.py6CODE
LOWchangedetectionio/tests/test_api_openapi.py9CODE
LOWchangedetectionio/tests/test_api_openapi.py12CODE
LOWchangedetectionio/tests/test_api_openapi.py12CODE
LOWchangedetectionio/tests/test_access_control.py1CODE
LOWchangedetectionio/tests/test_access_control.py3CODE
LOWchangedetectionio/tests/test_ignore_regex_text.py3CODE
LOWchangedetectionio/tests/test_security.py3CODE
LOWchangedetectionio/tests/test_security.py11CODE
LOWchangedetectionio/tests/test_security.py390CODE
LOWchangedetectionio/tests/test_ignore.py3CODE
243 more matches not shown…
Self-Referential Comments53 hits · 143 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/test-stack-reusable-workflow.yml416 # Create a watch via API through nginx proxy subpathCOMMENT
MEDIUM.github/workflows/test-stack-reusable-workflow.yml741 # Create a watch with tag "github-group-test" via APICOMMENT
MEDIUM.github/workflows/test-stack-reusable-workflow.yml755 # Create a specific test URL watchCOMMENT
MEDIUMchangedetectionio/is_safe_url.py93 # Create a URL adapter bound to the server nameCOMMENT
MEDIUMchangedetectionio/worker_pool.py52 # Create a new event loop for this threadCOMMENT
MEDIUMchangedetectionio/gc_cleanup.py53 # Create a new thread local object to encourage cleanup of old onesCOMMENT
MEDIUMchangedetectionio/__init__.py309 # Create the datadir if it doesnt existCOMMENT
MEDIUMchangedetectionio/test_cli_opts.sh148 # Create a watch using CLI, then recheck itCOMMENT
MEDIUMchangedetectionio/flask_app.py148 # Create a ChoiceLoader that searches app templates first, then plugin templatesCOMMENT
MEDIUMchangedetectionio/notification/handler.py110 # Define the mapping between your placeholders and markdown markersCOMMENT
MEDIUMchangedetectionio/notification/handler.py134 # Define the mapping between your placeholders and markdown markersCOMMENT
MEDIUMchangedetectionio/tests/test_security.py960 # Create a real watch and trigger a check so we have a valid backup structureCOMMENT
MEDIUMchangedetectionio/tests/test_rss_group.py47 # Create a tag/groupSTRING
MEDIUMchangedetectionio/tests/test_rss_group.py160 # Create a tag with no watchesSTRING
MEDIUMchangedetectionio/tests/test_rss_group.py197 # Create a tagSTRING
MEDIUMchangedetectionio/tests/test_api_security.py50 # Create a valid watch firstSTRING
MEDIUMchangedetectionio/tests/test_api_security.py333 # Create a watchSTRING
MEDIUMchangedetectionio/tests/test_basic_socketio.py24 # Create a test client for SocketIOCOMMENT
MEDIUMchangedetectionio/tests/test_commit_persistence.py28 # Create a watchCOMMENT
MEDIUMchangedetectionio/tests/test_commit_persistence.py519 # Create a tagCOMMENT
MEDIUM…ctionio/tests/test_api_notification_urls_validation.py128 # Create a tagCOMMENT
MEDIUMchangedetectionio/tests/test_backup.py138 # Create a full backupCOMMENT
MEDIUMchangedetectionio/tests/test_llm_api_key_security.py618 # Create a real watch — required to exercise llm_clear_summary_cache'sCOMMENT
MEDIUMchangedetectionio/tests/test_llm_token_budget.py67 # Create a watch via APICOMMENT
MEDIUMchangedetectionio/tests/test_tag_url_match.py22 # Create a tag with a URL match patternCOMMENT
MEDIUMchangedetectionio/tests/test_api.py65 # Create a watchSTRING
MEDIUMchangedetectionio/tests/test_api.py557 # Create a watchSTRING
MEDIUMchangedetectionio/tests/test_api.py936 # Create a watch in restock_diff mode WITH processor_config in the POST body (matches the API docs example)COMMENT
MEDIUMchangedetectionio/tests/test_api.py1120 # Create a watchCOMMENT
MEDIUM…detectionio/tests/test_settings_tag_force_reprocess.py99 # Create a tagSTRING
MEDIUM…detectionio/tests/test_settings_tag_force_reprocess.py169 # Create a tagSTRING
MEDIUMchangedetectionio/tests/test_jinja2.py250 # Create a large input string (over 10MB)COMMENT
MEDIUMchangedetectionio/tests/test_jinja2.py286 # Create a template with the dangerous patternCOMMENT
MEDIUMchangedetectionio/tests/test_api_tags.py100 # Create a watch with the tag and check it matches UUIDCOMMENT
MEDIUMchangedetectionio/tests/test_api_tags.py188 # Create a tag with processor_config_restock_diff in a single POST (issue #3966)COMMENT
MEDIUMchangedetectionio/tests/test_llm_change_summary.py78 # Create a tag with llm_change_summaryCOMMENT
MEDIUMchangedetectionio/tests/unit/test_watch_model.py224 # Create a watch with large datastore (many watches)COMMENT
MEDIUMchangedetectionio/tests/unit/test_conditions.py14 # Create a temporary directory for the test datastoreCOMMENT
MEDIUMchangedetectionio/realtime/socket_server.py158 # Create a simplified watch data object to send to clientsCOMMENT
MEDIUMchangedetectionio/realtime/socket_server.py345 # Create a dedicated signal handler that will receive signals and emit them to clientsCOMMENT
MEDIUMchangedetectionio/processors/__init__.py457 # Create a processor instance to access config methodsCOMMENT
MEDIUMchangedetectionio/processors/base.py33 # Create a stable snapshot of the watch for processingCOMMENT
MEDIUMchangedetectionio/conditions/blueprint.py43 # Create a temporary watch data structure with this single ruleCOMMENT
MEDIUMchangedetectionio/conditions/blueprint.py54 # Create a temporary application data structure for the rule checkCOMMENT
MEDIUMchangedetectionio/conditions/__init__.py29# Define the extended operations dictionaryCOMMENT
MEDIUMchangedetectionio/conditions/__init__.py131 # Create the rulesetCOMMENT
MEDIUMchangedetectionio/model/__init__.py440 # Create a cached version if it doesn't existCOMMENT
MEDIUMchangedetectionio/model/Watch.py943 # Create a smaller intermediate image (to reduce memory usage)COMMENT
MEDIUMchangedetectionio/api/Watch.py73 # Create a dict copy for JSON response (with lock for thread safety)COMMENT
MEDIUMchangedetectionio/blueprint/ui/edit.py135 # Create a processor instance to access config methodsCOMMENT
MEDIUMchangedetectionio/blueprint/browser_steps/__init__.py408 # Create the response with ETagCOMMENT
MEDIUMchangedetectionio/blueprint/backups/__init__.py61 # Create a list file with just the URLs, so it's easier to port somewhere else in the futureCOMMENT
MEDIUMchangedetectionio/store/__init__.py54 # Initialize parent classCOMMENT
Deep Nesting139 hits · 126 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/pluggy_interface.py244CODE
LOWchangedetectionio/pluggy_interface.py371CODE
LOWchangedetectionio/pluggy_interface.py576CODE
LOWchangedetectionio/worker.py46CODE
LOWchangedetectionio/worker_pool.py129CODE
LOWchangedetectionio/worker_pool.py449CODE
LOWchangedetectionio/queue_handlers.py227CODE
LOWchangedetectionio/queue_handlers.py271CODE
LOWchangedetectionio/queue_handlers.py301CODE
LOWchangedetectionio/queue_handlers.py336CODE
LOWchangedetectionio/gc_cleanup.py12CODE
LOWchangedetectionio/__init__.py181CODE
LOWchangedetectionio/forms.py124CODE
LOWchangedetectionio/html_tools.py226CODE
LOWchangedetectionio/html_tools.py268CODE
LOWchangedetectionio/html_tools.py461CODE
LOWchangedetectionio/html_tools.py571CODE
LOWchangedetectionio/html_tools.py759CODE
LOWchangedetectionio/auth_decorator.py16CODE
LOWchangedetectionio/auth_decorator.py23CODE
LOWchangedetectionio/custom_queue.py91CODE
LOWchangedetectionio/custom_queue.py155CODE
LOWchangedetectionio/custom_queue.py249CODE
LOWchangedetectionio/custom_queue.py414CODE
LOWchangedetectionio/custom_queue.py496CODE
LOWchangedetectionio/languages.py78CODE
LOWchangedetectionio/flask_app.py464CODE
LOWchangedetectionio/flask_app.py1058CODE
LOWchangedetectionio/flask_app.py1112CODE
LOWchangedetectionio/flask_app.py532CODE
LOWchangedetectionio/flask_app.py746CODE
LOWchangedetectionio/flask_app.py947CODE
LOWchangedetectionio/llm/client.py66CODE
LOWchangedetectionio/content_fetchers/__init__.py39CODE
LOWchangedetectionio/content_fetchers/requests.py24CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py81CODE
LOWchangedetectionio/content_fetchers/base.py165CODE
LOWchangedetectionio/notification/handler.py153CODE
LOWchangedetectionio/notification/handler.py209CODE
LOWchangedetectionio/notification/handler.py307CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py56CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py200CODE
LOWchangedetectionio/tests/conftest.py43CODE
LOWchangedetectionio/tests/conftest.py404CODE
LOWchangedetectionio/tests/conftest.py439CODE
LOWchangedetectionio/tests/util.py245CODE
LOWchangedetectionio/tests/util.py257CODE
LOWchangedetectionio/tests/test_history_consistency.py13CODE
LOWchangedetectionio/tests/test_basic_socketio.py13CODE
LOW…ngedetectionio/tests/unit/test_auth_decorator_order.py43CODE
LOWchangedetectionio/tests/smtp/smtp-test-server.py17CODE
LOWchangedetectionio/diff/__init__.py79CODE
LOWchangedetectionio/diff/__init__.py309CODE
LOWchangedetectionio/diff/tokenizers/words_and_html.py13CODE
LOWchangedetectionio/realtime/events.py6CODE
LOWchangedetectionio/realtime/events.py10CODE
LOWchangedetectionio/realtime/socket_server.py62CODE
LOWchangedetectionio/processors/magic.py59CODE
LOWchangedetectionio/processors/__init__.py21CODE
79 more matches not shown…
Redundant / Tautological Comments73 hits · 116 pts
SeverityFileLineSnippetContext
LOW.github/workflows/test-stack-reusable-workflow.yml143 # Check if RSS is less than 100MBCOMMENT
LOWchangedetectionio/pluggy_interface.py289 # Check if plugin has datastore attribute and it's not setCOMMENT
LOWchangedetectionio/pluggy_interface.py399 # Check if the result has any meaningful dataCOMMENT
LOWchangedetectionio/pluggy_interface.py609 # Check if plugin has a templates directoryCOMMENT
LOWchangedetectionio/worker.py738 # Check if we should restart (only when idle, between jobs)COMMENT
LOWchangedetectionio/worker.py747 # Check if we should exitCOMMENT
LOWchangedetectionio/worker.py751 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOWchangedetectionio/worker_pool.py133 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOWchangedetectionio/worker_pool.py346 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOWchangedetectionio/queue_handlers.py447 # Check if all notifications are mutedCOMMENT
LOWchangedetectionio/queue_handlers.py471 # Check if all notifications are mutedCOMMENT
LOWchangedetectionio/gc_cleanup.py68 # Check if lxml.etree is in useCOMMENT
LOWchangedetectionio/gc_cleanup.py95 # Check if lxml.html is in useCOMMENT
LOWchangedetectionio/gc_cleanup.py117 # Check if json module is being used and try to clear its cacheCOMMENT
LOWchangedetectionio/__init__.py575 # Check if we need to repeatCOMMENT
LOWchangedetectionio/html_tools.py179 # Iterate over the list of XPath selectorsCOMMENT
LOWchangedetectionio/time_handler.py55 # Check if the current day matches the target day or overlaps due to durationCOMMENT
LOWchangedetectionio/languages.py91 # Check if messages.po existsCOMMENT
LOWchangedetectionio/flask_app.py370 # Check if it's a built-in fetcherCOMMENT
LOWchangedetectionio/flask_app.py623 # Check if there's a redirect parameter to return to after re-loginCOMMENT
LOWchangedetectionio/flask_app.py656 # Check if there's a redirect parameter to return to the same pageCOMMENT
LOWchangedetectionio/flask_app.py839 # Check if file exists in plugin's static directoryCOMMENT
LOWchangedetectionio/flask_app.py1145 # Check if all checks are pausedCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py90 # Check if action handler existsCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py112 # Check if navigation actually occurredCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py433 # Check if session has expired based on ageCOMMENT
LOWchangedetectionio/content_fetchers/playwright.py57 # Set viewport to a larger size to capture more content at onceCOMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py383 # Check if page still exists (might have been closed due to error during sleep)COMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py413 # Check if page still exists before sending commandCOMMENT
LOW…angedetectionio/notification/apprise_plugin/discord.py43 # Check if body contains our diff placeholdersCOMMENT
LOW…angedetectionio/notification/apprise_plugin/discord.py116 # Check if we're approaching the embed count limitCOMMENT
LOW…angedetectionio/notification/apprise_plugin/discord.py127 # Check if adding this embed would exceed total character limitCOMMENT
LOWchangedetectionio/tests/test_commit_persistence.py437 # Set browser_steps to meaningless valuesCOMMENT
LOWchangedetectionio/tests/test_i18n.py169 # Set language to ItalianCOMMENT
LOWchangedetectionio/tests/test_i18n.py666 # Set language to GermanCOMMENT
LOWchangedetectionio/tests/test_rss_tag_token.py27 # Assign tag to watchCOMMENT
LOWchangedetectionio/tests/unit/test_time_handler.py94 # Set schedule to start 23:30 with 120 minute duration (crosses midnight)COMMENT
LOWchangedetectionio/tests/unit/test_time_handler.py177 # Set time to current hourCOMMENT
LOWchangedetectionio/tests/unit/test_time_handler.py513 # Set time to 3 hours agoCOMMENT
LOWchangedetectionio/diff/__init__.py135 # Check if there are any changesCOMMENT
LOWchangedetectionio/diff/__init__.py141 # Check if the whole line is replaced (no unchanged content)COMMENT
LOWchangedetectionio/diff/__init__.py270 # Check if there are any changesCOMMENT
LOWchangedetectionio/diff/__init__.py406 # Check if there are any actual changes (not just whitespace when ignore_junk is enabled)COMMENT
LOWchangedetectionio/realtime/events.py22 # Check if watch existsCOMMENT
LOWchangedetectionio/realtime/socket_server.py319 # Check if authentication is required and user is not authenticatedCOMMENT
LOWchangedetectionio/processors/__init__.py204 # Check if DISABLED_PROCESSORS env var is setCOMMENT
LOWchangedetectionio/processors/__init__.py221 # Check if this is a plugin processorCOMMENT
LOW…ngedetectionio/processors/image_ssim_diff/processor.py62 # Check if bounding box is set (for drawn area mode)COMMENT
LOW…ngedetectionio/processors/image_ssim_diff/processor.py146 # Check if this is the first check (no previous history)COMMENT
LOW…ngedetectionio/processors/image_ssim_diff/edit_hook.py38 # Check if template matching is globally enabled via ENV varCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py45 # Check if decoding succeededCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py150 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py306 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py436 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py581 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/libvips_handler.py285 # Check if match is good enough (80% confidence threshold)COMMENT
LOW…ngedetectionio/processors/text_json_diff/difference.py168 # Check if this is a user submission (any diff pref param exists in query string)COMMENT
LOW…angedetectionio/processors/text_json_diff/processor.py184 # Check if it's perl-style regex /.../COMMENT
LOW…ionio/processors/restock_diff/pure_python_extractor.py37 # Check if this is a JSON-LD script tagCOMMENT
LOWchangedetectionio/model/__init__.py310 # Check if we're being initialized from an existing watch objectCOMMENT
13 more matches not shown…
Cross-File Repetition18 hits · 90 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/tests/test_ignore.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGH…ngedetectionio/tests/test_trigger_regex_with_filter.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_ignorestatuscode.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGH…angedetectionio/tests/test_block_while_text_present.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_ignorewhitespace.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_trigger_regex.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_ignore_text.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_trigger.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_restock_itemprop.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_extract_regex.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGH…etectionio/tests/test_automatic_follow_ldjson_price.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/tests/test_xpath_selector.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/tests/test_css_selector.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/tests/test_api.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/api/Tags.py0background thread to queue all watches - discarded after completion.STRING
HIGHchangedetectionio/blueprint/ui/__init__.py0background thread to queue all watches - discarded after completion.STRING
HIGHchangedetectionio/api/Watch.py0background thread to queue all watches - discarded after completion.STRING
Cross-Language Confusion14 hits · 71 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/forms.py563 f"The following tokens used in the notification are not valid: {undefined}"CODE
HIGHchangedetectionio/notification/handler.py475#@todo on null:// (only if its a 1 url with null) probably doesnt need to actually .add/setup/etcCOMMENT
HIGHchangedetectionio/tests/test_api_security.py499 # Should accept (empty is valid as null)STRING
HIGHchangedetectionio/tests/test_api.py1153 - CREATE endpoint rejects null, empty, and invalid URLsSTRING
HIGHchangedetectionio/tests/test_api.py1154 - UPDATE endpoint rejects attempts to change URL to null, empty, or invalidSTRING
HIGHchangedetectionio/tests/test_xpath_selector_unit.py142 ("manager[1]/@name || manager[2]/@name", "GodotFreya"),CODE
HIGHchangedetectionio/tests/test_llm_change_summary.py158 return JSON {"summary": null, "error": "<readable message>"} with a 500STRING
HIGHchangedetectionio/tests/llm/test_response_parser.py93 raw = '{"needs_prefilter": false, "selector": null, "reason": "intent is global"}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py128 llm_json = '{"price": null, "currency": null, "availability": "instock"}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py138 llm_json = '{"price": 19.95, "currency": "GBP", "availability": null}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py148 llm_json = '{"price": null, "currency": null, "availability": null}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py200 llm_json = '{"price": null, "currency": null, "availability": null}'CODE
HIGHchangedetectionio/api/Import.py39 - anyOf: [{type: string}, {type: null}] (anyOf format)STRING
HIGHchangedetectionio/blueprint/ui/diff.py180 Returns JSON: {"summary": "...", "error": null} or {"summary": null, "error": "..."}STRING
Fake / Example Data32 hits · 38 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/forms.py969 self.time_schedule_limit.form.timezone.render_kw['placeholder'] = default_tzCODE
LOWchangedetectionio/forms.py975 proxy_name = StringField(_l('Name'), [validators.Optional()], render_kw={"placeholder": _l("Name")})CODE
LOWchangedetectionio/forms.py984 ], render_kw={"placeholder": "socks5:// or regular proxy http://user:pass@...:3128", "size":50})CODE
LOWchangedetectionio/forms.py987 browser_name = StringField(_l('Name'), [validators.Optional()], render_kw={"placeholder": _l("Name")})CODE
LOWchangedetectionio/forms.py996 ], render_kw={"placeholder": "wss://brightdata... wss://oxylabs etc", "size":50})CODE
LOWchangedetectionio/forms.py999 html_requests = StringField(_l('Plaintext requests'), validators=[validators.Optional()], render_kw={"placeholder": CODE
LOWchangedetectionio/forms.py1001 html_webdriver = StringField(_l('Chrome requests'), validators=[validators.Optional()], render_kw={"placeholder"CODE
LOWchangedetectionio/forms.py1149 render_kw={"placeholder": "5", "style": "width: 6em;"},CODE
LOWchangedetectionio/forms.py1156 "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT,CODE
LOWchangedetectionio/forms.py1166 "placeholder": "0 = unlimited",CODE
LOWchangedetectionio/forms.py821 selector = StringField(_l('Selector'), [validators.Optional()], render_kw={"placeholder": _l("CSS or xPath selector"CODE
LOWchangedetectionio/forms.py822 optional_value = StringField(_l('value'), [validators.Optional()], render_kw={"placeholder": _l("Value")})CODE
LOWchangedetectionio/forms.py845 render_kw={"rows": "5", "placeholder": LLM_INTENT_WATCH_PLACEHOLDER})CODE
LOWchangedetectionio/forms.py848 render_kw={"rows": "5", "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT},CODE
LOWchangedetectionio/forms.py1046 render_kw={"placeholder": os.getenv('BASE_URL', _l('Not set'))}CODE
LOWchangedetectionio/forms.py1062 render_kw={"placeholder": "0.1", "style": "width: 8em;"}CODE
LOWchangedetectionio/forms.py1073 rss_template_override = TextAreaField(_l('RSS "System default" template override'), render_kw={"rows": "5", "placehoCODE
LOWchangedetectionio/forms.py1112 render_kw={"placeholder": "gpt-4o-mini", "style": "width: 24em;"},CODE
LOWchangedetectionio/forms.py1126 "placeholder": "http://localhost:11434 (Ollama / custom endpoints only)",CODE
LOWchangedetectionio/forms.py1181 "placeholder": "100000",CODE
LOWchangedetectionio/tests/test_llm_token_budget.py132 "llm_evaluation_cache": {"fake_key": {"important": True}},CODE
LOWchangedetectionio/processors/image_ssim_diff/forms.py52 render_kw={"placeholder": "Use global default (0.1)"}CODE
LOWchangedetectionio/processors/restock_diff/forms.py22 render_kw={"placeholder": _l("No limit"), "size": "10"})CODE
LOWchangedetectionio/processors/restock_diff/forms.py24 render_kw={"placeholder": _l("No limit"), "size": "10"})CODE
LOWchangedetectionio/processors/restock_diff/forms.py29 ], render_kw={"placeholder": "0%", "size": "5"})CODE
LOWchangedetectionio/static/js/scheduler.js35 $('#local-time-in-tz').text(getTimeInTimezone(timezone_text_widget.attr('placeholder')));CODE
LOWchangedetectionio/conditions/form.py23 value = StringField(_l("Value"), validators=[validators.Optional()], render_kw={"placeholder": _l("A value")})CODE
LOW…angedetectionio/templates/edit/include_llm_intent.html91 {% set summary_placeholder = form.llm_change_summary.render_kw['placeholder'] %}CODE
LOWchangedetectionio/blueprint/tags/form.py18 render_kw={"placeholder": _l("e.g. *://example.com/* or github.com/myorg")})CODE
LOWchangedetectionio/blueprint/tags/form.py22 render_kw={"rows": "5", "placeholder": LLM_INTENT_TAG_PLACEHOLDER})CODE
LOWchangedetectionio/blueprint/tags/form.py26 render_kw={"rows": "5", "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT},CODE
LOWchangedetectionio/blueprint/tags/form.py31 name = StringField(_l('Tag name'), [validators.InputRequired()], render_kw={"placeholder": _l("Name")})CODE
Structural Annotation Overuse19 hits · 37 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py479 # Step 1: AI Change Intent — may suppress notificationCOMMENT
LOWchangedetectionio/worker.py500 # Step 2: AI Change Summary — runs for any LLM-configured watch with a changeCOMMENT
LOWchangedetectionio/__init__.py447 # Step 3: Queue watches for recheck (if -r was provided)COMMENT
LOWchangedetectionio/__init__.py486 # Step 4: Setup batch mode monitor (if -b was provided)COMMENT
LOWchangedetectionio/__init__.py410 # Step 1: Add URLs with their options (if provided via -u flags)COMMENT
LOWchangedetectionio/__init__.py430 # Step 2: Queue newly added watches (if -u was provided in batch mode)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amountsCOMMENT
LOWchangedetectionio/tests/test_i18n.py83 # Step 1: Set the language to Italian using the /set-language endpointCOMMENT
LOWchangedetectionio/tests/test_i18n.py91 # Step 2: Request the index page - should be in ItalianCOMMENT
LOWchangedetectionio/tests/test_i18n.py593 # Step 2: User explicitly selects Korean languageCOMMENT
LOWchangedetectionio/tests/test_i18n.py602 # Step 3: Make another request with same zh-TW headerCOMMENT
LOWchangedetectionio/tests/test_i18n.py105 # Step 3: Switch back to EnglishCOMMENT
LOWchangedetectionio/tests/test_i18n.py575 # Step 1: Clear session and make first request with zh-TW header (auto-detect)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py244 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py223 # Step 1: Try pure Python extraction first (fast, no lxml, no memory leak)COMMENT
LOWchangedetectionio/model/__init__.py170 # IMPORTANT: Don't initialize __watch_was_edited yet!COMMENT
LOWchangedetectionio/blueprint/ui/diff.py59 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)COMMENT
LOWchangedetectionio/blueprint/ui/diff.py62 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()COMMENT
Verbosity Indicators18 hits · 35 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py479 # Step 1: AI Change Intent — may suppress notificationCOMMENT
LOWchangedetectionio/worker.py500 # Step 2: AI Change Summary — runs for any LLM-configured watch with a changeCOMMENT
LOWchangedetectionio/__init__.py447 # Step 3: Queue watches for recheck (if -r was provided)COMMENT
LOWchangedetectionio/__init__.py486 # Step 4: Setup batch mode monitor (if -b was provided)COMMENT
LOWchangedetectionio/__init__.py410 # Step 1: Add URLs with their options (if provided via -u flags)COMMENT
LOWchangedetectionio/__init__.py430 # Step 2: Queue newly added watches (if -u was provided in batch mode)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amountsCOMMENT
LOWchangedetectionio/tests/test_i18n.py83 # Step 1: Set the language to Italian using the /set-language endpointCOMMENT
LOWchangedetectionio/tests/test_i18n.py91 # Step 2: Request the index page - should be in ItalianCOMMENT
LOWchangedetectionio/tests/test_i18n.py593 # Step 2: User explicitly selects Korean languageCOMMENT
LOWchangedetectionio/tests/test_i18n.py602 # Step 3: Make another request with same zh-TW headerCOMMENT
LOWchangedetectionio/tests/test_i18n.py105 # Step 3: Switch back to EnglishCOMMENT
LOWchangedetectionio/tests/test_i18n.py575 # Step 1: Clear session and make first request with zh-TW header (auto-detect)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py244 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py223 # Step 1: Try pure Python extraction first (fast, no lxml, no memory leak)COMMENT
LOWchangedetectionio/blueprint/ui/diff.py59 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)COMMENT
LOWchangedetectionio/blueprint/ui/diff.py62 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()COMMENT
Docstring Block Structure7 hits · 35 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/is_safe_url.py22 Validate that a redirect URL is safe to prevent open redirect vulnerabilities. This follows Flask/Werkzeug besSTRING
HIGHchangedetectionio/queue_handlers.py162 Efficient async get using executor for blocking call. HYBRID APPROACH: Best of both worlds - USTRING
HIGHchangedetectionio/diff/tokenizers/natural_text.py12 Split text into words using simple whitespace boundaries. This is a simpler tokenizer that treats all whitespaSTRING
HIGHchangedetectionio/diff/tokenizers/words_and_html.py14 Split text into words and boundaries (spaces, HTML tags). This tokenizer preserves HTML tags as atomic units wSTRING
HIGHchangedetectionio/processors/restock_diff/processor.py204 Extract itemprop availability with hybrid approach for memory efficiency. Strategy (fastest to slowest, least STRING
HIGHchangedetectionio/model/persistence.py13 Determine entity type from class hierarchy (cached at class level). Args: cls: The class to inspect STRING
HIGHchangedetectionio/model/Watch.py55 Save compressed data using native brotli with streaming compression. Uses chunked compression to minimize peak STRING
Over-Commented Block34 hits · 30 pts
SeverityFileLineSnippetContext
LOWrequirements.txt61beautifulsoup4>=4.0.0,<=4.14.3COMMENT
LOWdocker-entrypoint.sh1#!/bin/bashCOMMENT
LOWdocker-compose.yml1services:COMMENT
LOWdocker-compose.yml21 # Example: Install the OSINT reconnaissance processor pluginCOMMENT
LOWdocker-compose.yml41 # Playwright proxy settings playwright_proxy_server, playwright_proxy_bypass, playwright_proxy_username, playwriCOMMENT
LOWdocker-compose.yml61 # Default number of parallel/concurrent fetchersCOMMENT
LOWdocker-compose.yml81 # - LLM_RESTOCK_MAX_CONTENT_CHARS=15000COMMENT
LOWdocker-compose.yml101COMMENT
LOWdocker-compose.yml121 # RECOMMENDED FOR FETCHING PAGES WITH CHROME, be sure to enable the "PLAYWRIGHT_DRIVER_URL" env variable in the maiCOMMENT
LOWdocker-compose.yml141# environment:COMMENT
LOWdocs/api-spec.yaml801 - null: Not decided yet / inherit default behaviorCOMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml41 # By default, queries listed here will override any specified in a config file.COMMENT
LOW.github/workflows/test-only.yml61 run: |COMMENT
LOW.github/actions/extract-memory-report/action.yml41# sed 's/.*Peak memory: //' | \COMMENT
LOWchangedetectionio/__init__.py21# Note: store and changedetection_app are imported inside main() to avoidCOMMENT
LOWchangedetectionio/__init__.py41# - Consistent across all platforms (Windows already uses spawn by default)COMMENT
LOWchangedetectionio/forms.py461 # some_object = klass()COMMENT
LOWchangedetectionio/html_tools.py361 # - local-name(): //*[local-name()='title']/text()COMMENT
LOWchangedetectionio/notification/handler.py381 if _llm_change_summary and _override_diff:COMMENT
LOW…etectionio/tests/test_automatic_follow_ldjson_price.py181 </body></html>COMMENT
LOW…etectionio/tests/test_automatic_follow_ldjson_price.py201 # "offeredBy": {COMMENT
LOWchangedetectionio/tests/test_restock_itemprop.py301 # PROOF that the threshold is measured "since the PREVIOUS check" and NOT "since the first check":COMMENT
LOWchangedetectionio/tests/proxy_list/conftest.py1#!/usr/bin/env python3COMMENT
LOWchangedetectionio/tests/custom_browser_url/__init__.py1# placeholderCOMMENT
LOWchangedetectionio/processors/restock_diff/processor.py61# MEMORY MANAGEMENT: Why We Use Multiprocessing (Linux Only)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py81# When a subprocess exits, the OS forcibly reclaims ALL memory including C-levelCOMMENT
LOWchangedetectionio/processors/restock_diff/processor.py101# - The leak is specifically from lxml's document parsing, not the JSONPath queriesCOMMENT
LOWchangedetectionio/processors/restock_diff/processor.py441# from ...html_tools import html_to_textCOMMENT
LOW…ngedetectionio/static/styles/scss/parts/_sub_tabs.scss1// ── Vertical sub-tab layout ───────────────────────────────────────────────────COMMENT
LOWchangedetectionio/conditions/plugins/__init__.py1# Import plugins package to make them discoverableCOMMENT
LOWchangedetectionio/api/Watch.py281 if content:COMMENT
LOWchangedetectionio/blueprint/browser_steps/__init__.py1COMMENT
LOWchangedetectionio/store/file_saving_datastore.py121 try:COMMENT
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippetContext
CRITICALchangedetectionio/static/js/jquery-3.6.0.min.js2!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):fCODE
CRITICALchangedetectionio/blueprint/settings/__init__.py62 form.application.form.notification_format.choices.pop()CODE
CRITICALchangedetectionio/blueprint/settings/__init__.py70 form.requests.form.proxy.choices.append(tuple((p, datastore.proxy_list[p]['label'])))CODE
AI Structural Patterns22 hits · 20 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/forms.py236CODE
LOWchangedetectionio/content_fetchers/playwright.py250CODE
LOWchangedetectionio/content_fetchers/puppeteer.py503CODE
LOWchangedetectionio/content_fetchers/requests.py211CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63CODE
LOWchangedetectionio/content_fetchers/base.py122CODE
LOWchangedetectionio/tests/conftest.py321CODE
LOWchangedetectionio/tests/util.py375CODE
LOWchangedetectionio/diff/__init__.py309CODE
LOWchangedetectionio/diff/__init__.py424CODE
LOWchangedetectionio/processors/extract.py69CODE
LOW…ngedetectionio/processors/text_json_diff/difference.py264CODE
LOWchangedetectionio/model/Watch.py736CODE
LOWchangedetectionio/model/Watch.py1306CODE
LOWchangedetectionio/blueprint/ui/preview.py125CODE
LOWchangedetectionio/blueprint/ui/__init__.py186CODE
LOWchangedetectionio/blueprint/settings/__init__.py261CODE
LOWchangedetectionio/blueprint/settings/__init__.py278CODE
LOWchangedetectionio/blueprint/imports/__init__.py84CODE
LOWchangedetectionio/blueprint/tags/__init__.py36CODE
LOWchangedetectionio/blueprint/tags/__init__.py231CODE
LOWchangedetectionio/blueprint/backups/__init__.py177CODE
AI Slop Vocabulary9 hits · 16 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/worker_pool.py291 """Bulletproof queue operation with comprehensive error handling"""STRING
LOWchangedetectionio/html_tools.py465 # Foreach <script json></script> blob.. just return the first that matches json_filterCOMMENT
LOWchangedetectionio/content_fetchers/requests.py198 # Binary files just return their checksum until we add something smarterCOMMENT
LOWchangedetectionio/notification/__init__.py8# But to avoid importing the whole heavy module just use the same strings here.COMMENT
LOWchangedetectionio/tests/test_request.py9# Hard to just add more live server URLs when one test is already running (I think)COMMENT
MEDIUMchangedetectionio/tests/test_history_consistency.py49 # Essentially just triggers the DB write/updateCOMMENT
LOWchangedetectionio/tests/test_notification.py23# Hard to just add more live server URLs when one test is already running (I think)COMMENT
MEDIUMchangedetectionio/processors/magic.py64 # Remove whitespace between < and tag name for robust detection (handles '< html', '<\nhtml', etc.)COMMENT
LOWchangedetectionio/conditions/blueprint.py35 # We'll ignore the returned response and just use the datastore which is modified by the functionCOMMENT
Modern AI Meta-Vocabulary3 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/forms.py1139 # DeepSeek-R1, Gemma 3, etc.) which emit chain-of-thought intoCOMMENT
MEDIUM…ctionio/processors/restock_diff/plugins/llm_restock.py246 # models. Local reasoning models burn most of that on chain-of-thought beforeCOMMENT
MEDIUMchangedetectionio/blueprint/settings/llm.py191 # headroom needed for chain-of-thought to complete.COMMENT
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/diff/__init__.py511__all__ = [CODE
LOWchangedetectionio/diff/tokenizers/__init__.py19__all__ = [CODE
LOWchangedetectionio/jinja2_custom/__init__.py14__all__ = [CODE
LOWchangedetectionio/jinja2_custom/plugins/__init__.py6__all__ = ['regex_replace']CODE
LOWchangedetectionio/model/__init__.py7__all__ = ['EntityPersistenceMixin', 'watch_base']CODE
LOWchangedetectionio/widgets/__init__.py3__all__ = ['TernaryNoneBooleanWidget', 'TernaryNoneBooleanField']CODE
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/content_fetchers/__init__.py48 # In this case, make sure to edit the default one in store.py and fetch_site_status.pyCOMMENT