AI agent skill that researches any topic across Reddit, X, YouTube, HN, Polymarket, and the web - then synthesizes a grounded summary
This report summarizes scanner evidence for mvanhorn/last30days-skill, a Python project with 63,906 GitHub stars. SynthScan examined 175,946 lines of code across 504 source files, recording 6195 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 41.3 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 5279 finding(s).
Are imports declared and package/API names verified? 362 finding(s).
Are wrappers, guards, and repeated structures necessary? 5549 finding(s).
Which changes need focused human review? 6195 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 6195 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_secret_hygiene.py | 28 | def test_written_config_is_loadable(self, tmp_path): | CODE |
| LOW⚡ | tests/test_secret_hygiene.py | 37 | def test_plain_token_unchanged(self): | CODE |
| LOW⚡ | tests/test_secret_hygiene.py | 40 | def test_value_with_spaces_roundtrips(self, tmp_path): | CODE |
| LOW⚡ | tests/test_github_unauth.py | 9 | def test_github_available_without_token_or_gh(self): | CODE |
| LOW⚡ | tests/test_github_unauth.py | 18 | def test_unauth_caps_result_count(self): | CODE |
| LOW⚡ | tests/test_github_unauth.py | 26 | def test_authed_keeps_full_depth(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 17 | def test_x_source_prefers_xai_without_bird_probe(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 22 | def test_x_source_uses_bird_with_explicit_cookies(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 29 | def test_bird_auth_never_checks_browser_cookies(self): | CODE |
| LOW | tests/test_env_v3.py | 41 | def test_file_permission_check_skips_windows_posix_mode_bits(self): | CODE |
| LOW | tests/test_env_v3.py | 49 | def test_get_config_includes_perplexity_knobs(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 108 | def test_probe_false_uses_local_evidence_only(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 116 | def test_probe_false_without_stored_auth_reports_unavailable(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 124 | def test_probe_true_keeps_the_live_check(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 132 | def test_x_backend_chain_local_only_never_calls_live_check(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 140 | def test_x_backend_chain_default_stays_live(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 155 | def test_threads_available_with_sc_key_only(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 158 | def test_threads_unavailable_without_sc_key(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 162 | def test_threads_availability_predicate_is_key_only(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 171 | def test_empty_excerpt_falls_back_to_legacy_body(self, excerpt): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 178 | def test_scored_extract_prefixes_vote_count(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 184 | def test_scored_extract_no_score_no_prefix(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 190 | def test_scored_extract_negative_score_no_malformed_prefix(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 198 | def test_prompt_contains_traction_guidance(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 256 | def test_zero_final_score_excluded(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 264 | def test_funny_floor_blocks_high_vote_unfunny(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 273 | def test_votes_promote_funnyish_over_threshold(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 71 | def test_cross_platform_comparable(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 83 | def test_zero_or_missing_votes(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 88 | def test_monotonic_within_platform(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 112 | def test_normalized_video_comments_reach_fun_prompt(self, source, vote_field): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 150 | def test_extractors_preserve_legacy_comments_limits_and_insights(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 209 | def test_high_vote_top_comment_scores_higher(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 221 | def test_fallback_without_votes_still_scores(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 240 | def test_relevance_gate_excludes_entity_miss(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 290 | def test_bounded_amplification_does_not_overturn_humor_gap(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 299 | def test_meaningful_at_medium_orders_by_votes(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 312 | def test_level_scaling_high_more_than_low(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 328 | def test_crowd_boost_tag_when_votes_lift_ranking(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 341 | def test_no_votes_preserves_pure_fun_ordering(self): | CODE |
| LOW | tests/test_env_include_sources_default.py | 4 | def test_include_sources_defaults_to_empty_string(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_security_boundaries.py | 17 | def test_importing_cli_does_not_load_config_or_propagate_endpoints(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 26 | def test_diagnose_uses_plan_only_cookie_policy_and_safe_pipeline(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 51 | def test_setup_without_cookie_flag_disables_browser_cookie_setup(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 65 | def test_setup_cookie_flag_allows_browser_cookie_setup(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 79 | def test_no_browser_cookies_overrides_setup_cookie_flag(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 104 | def test_diagnose_overrides_setup_cookie_flag(monkeypatch): | CODE |
| LOW⚡ | tests/test_security_boundaries.py | 129 | def test_research_run_defaults_to_browser_cookie_read(): | CODE |
| LOW⚡ | tests/test_security_boundaries.py | 137 | def test_no_browser_cookies_flag_disables_research_run_cookie_read(): | CODE |
| LOW⚡ | tests/test_security_boundaries.py | 145 | def test_watchlist_subprocess_disables_browser_cookies(): | CODE |
| LOW | tests/test_security_boundaries.py | 159 | def test_project_config_ignored_by_default_and_cannot_self_trust(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 179 | def test_project_config_loads_with_process_trust_signal(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_rerank_generic_topic_grounding.py | 10 | def test_primary_entity_keeps_review_when_review_is_the_subject(): | CODE |
| LOW | tests/test_rerank_generic_topic_grounding.py | 17 | def test_ubiquitous_head_token_does_not_ground_off_topic_items(): | CODE |
| LOW | tests/test_rerank_generic_topic_grounding.py | 28 | def test_broad_token_buried_inside_another_word_does_not_ground(): | CODE |
| LOW⚡ | tests/test_rerank_generic_topic_grounding.py | 44 | def test_broad_trailing_token_alone_does_not_ground(unrelated): | CODE |
| LOW⚡ | tests/test_rerank_generic_topic_grounding.py | 49 | def test_inflected_trailing_token_still_grounds(): | CODE |
| LOW⚡ | tests/test_rerank_generic_topic_grounding.py | 55 | def test_on_topic_item_is_grounded_control(): | CODE |
| LOW⚡ | tests/test_rerank_generic_topic_grounding.py | 61 | def test_short_generic_head_keeps_safe_no_op(): | CODE |
| LOW | tests/test_setup_store_key.py | 69 | def test_store_key_strips_surrounding_whitespace(tmp_path): | CODE |
| 4924 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_dedupe_v3.py | 34 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 59 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 80 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 82 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 106 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_dedupe_v3.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_dedupe_v3.py | 15 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_dedupe_v3.py | 17 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_dedupe_v3.py | 130 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_dedupe_v3.py | 132 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 176 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 178 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 404 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 406 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 627 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 629 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 697 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 699 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 788 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 790 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 1112 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_x_envelope.py | 1114 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_x_envelope.py | 37 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_x_envelope.py | 39 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_x_envelope.py | 455 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_x_envelope.py | 457 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_diagnose_compat.py | 52 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_diagnose_compat.py | 54 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 94 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 96 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 135 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 249 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 251 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 316 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 318 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 335 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_law7_host_plan_gate.py | 337 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_env_pass.py | 27 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_env_pass.py | 29 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_env_pass.py | 222 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_env_pass.py | 226 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_env_pass.py | 122 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_env_pass.py | 124 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 75 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 77 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 257 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 259 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 308 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 310 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 329 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 331 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 415 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 417 | # --------------------------------------------------------------------------- | COMMENT |
| 237 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_entity_topic_gate.py | 21 | except SystemExit: | CODE |
| HIGH | tests/test_chrome_cdp.py | 189 | except OSError: | CODE |
| HIGH | tests/test_chrome_cdp.py | 200 | except OSError: | CODE |
| HIGH | tests/test_chrome_cdp.py | 205 | except OSError: | CODE |
| HIGH | tests/test_subproc.py | 738 | except (OSError, subproc.subprocess.TimeoutExpired): | CODE |
| HIGH | tests/test_subproc.py | 167 | except ProcessLookupError: | CODE |
| HIGH | tests/test_subproc.py | 743 | except OSError: | CODE |
| HIGH | tests/test_deadline_lifecycle.py | 477 | except ProcessLookupError: | CODE |
| HIGH | tests/test_deadline_lifecycle.py | 526 | except ProcessLookupError: | CODE |
| HIGH | tests/test_deadline_lifecycle.py | 73 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | tests/test_pipeline_cancellation.py | 136 | except pipeline.SourceRunError: | CODE |
| HIGH | tests/test_slug_filename_length.py | 40 | except SystemExit: | CODE |
| HIGH | tests/test_freshness.py | 748 | except Exception: | CODE |
| HIGH | tests/test_freshness.py | 759 | except Exception: | CODE |
| HIGH | tests/test_bird_x.py | 271 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/store.py | 67 | except FileExistsError: | CODE |
| HIGH | skills/last30days/scripts/store.py | 74 | except FileNotFoundError: | CODE |
| HIGH | skills/last30days/scripts/box_chrome_login.py | 195 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/evaluate_search_quality.py | 395 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/last30days.py | 78 | except (ValueError, OSError, RuntimeError): | CODE |
| HIGH | skills/last30days/scripts/last30days.py | 4389 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/last30days.py | 404 | except (library_index.LibrarySearchUnavailable, OSError, sqlite3.DatabaseError): | CODE |
| HIGH | skills/last30days/scripts/last30days.py | 385 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/lib/reddit_keyless.py | 210 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/polymarket.py | 816 | except (IndexError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/subproc.py | 117 | except (ProcessLookupError, PermissionError, OSError): | CODE |
| HIGH | skills/last30days/scripts/lib/subproc.py | 280 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/subproc.py | 354 | except subprocess.TimeoutExpired: | CODE |
| HIGH | skills/last30days/scripts/lib/subproc.py | 272 | except subprocess.TimeoutExpired: | CODE |
| HIGH | skills/last30days/scripts/lib/subproc.py | 268 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/lib/subproc.py | 329 | except subprocess.TimeoutExpired: | CODE |
| HIGH | skills/last30days/scripts/lib/bird_x.py | 881 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/meta_ads.py | 472 | except ValueError: | CODE |
| HIGH | skills/last30days/scripts/lib/setup_wizard.py | 537 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/lib/setup_wizard.py | 589 | except OSError: | CODE |
| HIGH | skills/last30days/scripts/lib/setup_wizard.py | 1247 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/setup_wizard.py | 1319 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/setup_wizard.py | 1421 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/http.py | 254 | except ValueError: | CODE |
| HIGH | skills/last30days/scripts/lib/http.py | 908 | except (OSError, UnicodeDecodeError): | CODE |
| HIGH | skills/last30days/scripts/lib/http.py | 992 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/library_index.py | 264 | except FileExistsError: | CODE |
| HIGH | skills/last30days/scripts/lib/library_index.py | 476 | except FileNotFoundError: | CODE |
| HIGH | skills/last30days/scripts/lib/parallel_mcp.py | 191 | except (OSError, RuntimeError, ValueError): | CODE |
| HIGH | skills/last30days/scripts/lib/instagram.py | 161 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/instagram.py | 57 | except (TypeError, ValueError): | CODE |
| HIGH | skills/last30days/scripts/lib/instagram.py | 65 | except (TypeError, ValueError): | CODE |
| HIGH | skills/last30days/scripts/lib/instagram.py | 152 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/linkedin.py | 356 | except (TypeError, ValueError): | CODE |
| HIGH | skills/last30days/scripts/lib/tiktok.py | 91 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/dates.py | 70 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/bluesky.py | 230 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/github.py | 64 | except (FileNotFoundError, subprocess.TimeoutExpired, OSError): | CODE |
| HIGH | skills/last30days/scripts/lib/github.py | 1339 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/grok_x.py | 268 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/grok_x.py | 551 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/reddit_public.py | 154 | except (ValueError, TypeError, OSError): | CODE |
| HIGH | skills/last30days/scripts/lib/doctor.py | 2122 | except Exception: | CODE |
| HIGH | skills/last30days/scripts/lib/xquik.py | 432 | except (ValueError, TypeError): | CODE |
| HIGH | skills/last30days/scripts/lib/cookie_extract.py | 90 | except OSError: | CODE |
| 11 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_security_boundaries.py | 3 | CODE | |
| LOW | tests/test_setup_store_key.py | 10 | CODE | |
| LOW | tests/test_setup_wizard_pp_sources.py | 4 | CODE | |
| LOW | tests/test_env_unsubstituted_template.py | 10 | CODE | |
| LOW | tests/test_planner_quiet_mode.py | 3 | CODE | |
| LOW | tests/test_x_envelope.py | 10 | CODE | |
| LOW | tests/test_library_search.py | 3 | CODE | |
| LOW | tests/test_skill_progressive_disclosure.py | 5 | CODE | |
| LOW | tests/test_safari_cookies.py | 3 | CODE | |
| LOW | tests/test_techmeme_source.py | 8 | CODE | |
| LOW | tests/test_law7_host_plan_gate.py | 10 | CODE | |
| LOW | tests/test_env_pass.py | 14 | CODE | |
| LOW | tests/test_save_raw_per_entity.py | 7 | CODE | |
| LOW | tests/test_save_dir_env_fallback.py | 14 | CODE | |
| LOW | tests/test_cookie_extract.py | 3 | CODE | |
| LOW | tests/test_cookie_extract.py | 8 | CODE | |
| LOW | tests/test_cookie_extract.py | 8 | CODE | |
| LOW | tests/test_cookie_extract.py | 8 | CODE | |
| LOW | tests/test_cookie_extract.py | 8 | CODE | |
| LOW | tests/test_arxiv_source.py | 8 | CODE | |
| LOW | tests/test_brightdata.py | 10 | CODE | |
| LOW | tests/test_chrome_cookies.py | 3 | CODE | |
| LOW | tests/test_chrome_cookies.py | 8 | CODE | |
| LOW | tests/test_chrome_cookies.py | 17 | CODE | |
| LOW | tests/test_chrome_cookies.py | 17 | CODE | |
| LOW | tests/test_chrome_cookies.py | 17 | CODE | |
| LOW | tests/test_chrome_cookies.py | 17 | CODE | |
| LOW | tests/test_footer_nudge_suppression.py | 3 | CODE | |
| LOW | tests/test_competitors_plan_threading.py | 3 | CODE | |
| LOW | tests/test_competitors_plan_threading.py | 11 | CODE | |
| LOW | tests/test_top_comments_relevance.py | 6 | CODE | |
| LOW | tests/test_top_comments_relevance.py | 8 | CODE | |
| LOW | tests/test_env_doc_contract.py | 1 | CODE | |
| LOW | tests/test_library_feed.py | 3 | CODE | |
| LOW | tests/test_github.py | 3 | CODE | |
| LOW | tests/test_truthsocial.py | 3 | CODE | |
| LOW | tests/test_relevance.py | 8 | CODE | |
| LOW | tests/test_relevance.py | 8 | CODE | |
| LOW | tests/test_doc_security_contract.py | 3 | CODE | |
| LOW | tests/test_polymarket_disambiguation.py | 3 | CODE | |
| LOW | tests/test_doc_flag_contract.py | 3 | CODE | |
| LOW | tests/test_changelog_guard_history.py | 3 | CODE | |
| LOW | tests/test_codex_host_contract.py | 3 | CODE | |
| LOW | tests/test_changelog_workflow.py | 3 | CODE | |
| LOW | tests/test_competitors_routing.py | 7 | CODE | |
| LOW | tests/test_amazon.py | 10 | CODE | |
| LOW | tests/test_x_policy.py | 14 | CODE | |
| LOW | tests/test_pipeline_cancellation.py | 1 | CODE | |
| LOW | tests/test_setup_openclaw.py | 9 | CODE | |
| LOW | tests/test_setup_openclaw.py | 11 | CODE | |
| LOW | tests/test_slug_filename_length.py | 16 | CODE | |
| LOW | tests/test_render_title_defang.py | 12 | CODE | |
| LOW | tests/test_env_cookies.py | 6 | CODE | |
| LOW | tests/test_env_cookies.py | 8 | CODE | |
| LOW | tests/test_no_bare_open_read.py | 3 | CODE | |
| LOW | tests/test_categories.py | 12 | CODE | |
| LOW | tests/test_dripstack.py | 3 | CODE | |
| LOW | tests/test_x_api.py | 8 | CODE | |
| LOW | tests/test_polymarket.py | 3 | CODE | |
| LOW | tests/test_polymarket.py | 4 | CODE | |
| 147 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_subproc.py | 252 | def worker(): | CODE |
| MEDIUM | tests/test_subproc.py | 297 | def worker(): | CODE |
| LOW | tests/test_subproc.py | 260 | except Exception as exc: | CODE |
| LOW | tests/test_subproc.py | 303 | except Exception as exc: | CODE |
| LOW | tests/e2e_comparison.py | 136 | except Exception as exc: | CODE |
| LOW | tests/test_freshness.py | 748 | except Exception: | CODE |
| LOW | tests/test_freshness.py | 759 | except Exception: | CODE |
| LOW | …on-daemon-executor-threads-defeat-wall-clock-budget.md | 82 | except Exception as exc: # noqa: BLE001 - containment is the contract | CODE |
| LOW | skills/last30days/scripts/evaluate_search_quality.py | 570 | except Exception as exc: | CODE |
| MEDIUM | skills/last30days/scripts/last30days.py | 3601 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | skills/last30days/scripts/last30days.py | 75 | def _install_sigterm_handler() -> None: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 655 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 1354 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 1619 | except Exception: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 2603 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 4241 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 4344 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 4389 | except Exception: | CODE |
| LOW | skills/last30days/scripts/watchlist.py | 51 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/freshness.py | 505 | except Exception as exc: # verifier failures degrade to a typed verdict | CODE |
| LOW | skills/last30days/scripts/lib/freshness.py | 560 | except Exception as exc: # verifier failures degrade to a typed verdict | CODE |
| LOW | skills/last30days/scripts/lib/xurl_x.py | 341 | except Exception as exc: | CODE |
| MEDIUM | skills/last30days/scripts/lib/xurl_x.py | 68 | def _is_available_uncached() -> bool: | CODE |
| LOW | skills/last30days/scripts/lib/truthsocial.py | 116 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/hackernews.py | 131 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/hackernews.py | 175 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/hackernews.py | 321 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 96 | except Exception as exc: # the fallback must never break the pipeline | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 210 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 240 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 247 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 307 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/x_api.py | 502 | except Exception as exc: # noqa: BLE001 - the message must never leak | CODE |
| LOW | skills/last30days/scripts/lib/dripstack.py | 47 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/dripstack.py | 84 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/resolve.py | 42 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/resolve.py | 365 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/env.py | 1186 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/env.py | 1188 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/env.py | 1871 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/polymarket.py | 445 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/polymarket.py | 477 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/subproc.py | 280 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/bird_x.py | 356 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/meta_ads.py | 648 | except Exception as exc: # noqa: BLE001 - an unclassifiable transport failure | CODE |
| LOW | skills/last30days/scripts/lib/perplexity.py | 1282 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/perplexity.py | 1295 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/perplexity.py | 1345 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/cjk.py | 65 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/pinterest.py | 137 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/stocktwits.py | 75 | except Exception: # standalone / outside package | CODE |
| LOW | skills/last30days/scripts/lib/stocktwits.py | 143 | except Exception as e: # noqa: BLE001 — network/parse, degrade gracefully | CODE |
| LOW | skills/last30days/scripts/lib/stocktwits.py | 197 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | skills/last30days/scripts/lib/reddit_search.py | 195 | except Exception as e: # defensive: one bad page must not sink the run | CODE |
| LOW | skills/last30days/scripts/lib/reddit_search.py | 302 | except Exception as e: # defensive: discovery must never raise into the pipeline | CODE |
| MEDIUM | skills/last30days/scripts/lib/setup_wizard.py | 1418 | def _cleanup() -> None: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 138 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 171 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 309 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 997 | except Exception as exc: # never let a config-read failure block auth | CODE |
| 109 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_setup_store_key.py | 95 | rotated = "rotated-dummy-value-not-real" | CODE |
| LOW | tests/test_planner_quiet_mode.py | 18 | topic="Acme Corp", | CODE |
| LOW⚡ | tests/test_planner_quiet_mode.py | 48 | topic="Acme Corp", | CODE |
| LOW⚡ | tests/test_brightdata.py | 68 | assert brightdata.is_available({"BRIGHTDATA_API_KEY": "dummy-key-not-real"}) is True | CODE |
| LOW⚡ | tests/test_brightdata.py | 233 | "amazon_product", ["u"], timeout=30, config={"BRIGHTDATA_API_KEY": "dummy-key"} | CODE |
| LOW⚡ | tests/test_brightdata.py | 236 | assert "dummy-key" not in " ".join(seen["cmd"]) | CODE |
| LOW⚡ | tests/test_brightdata.py | 237 | assert seen["env"]["BRIGHTDATA_API_KEY"] == "dummy-key" | CODE |
| LOW⚡ | tests/test_brightdata.py | 272 | lambda *a, **k: _Result(returncode=1, stderr="Error: 401 for key dummy-key"), | CODE |
| LOW⚡ | tests/test_brightdata.py | 275 | "amazon_product", ["u"], timeout=30, config={"BRIGHTDATA_API_KEY": "dummy-key"} | CODE |
| LOW⚡ | tests/test_brightdata.py | 277 | assert "dummy-key" not in out["error"] | CODE |
| LOW⚡ | tests/test_brightdata.py | 278 | assert not any("dummy-key" in m for m in logged) | CODE |
| LOW | tests/test_tiktok.py | 265 | token="dummy-key", | CODE |
| LOW⚡ | tests/test_grok_x.py | 232 | monkeypatch.setenv("XAI_API_KEY", "dummy-key") | CODE |
| LOW⚡ | tests/test_grok_x.py | 233 | monkeypatch.setenv("AUTH_TOKEN", "dummy-token") | CODE |
| LOW⚡ | tests/test_grok_x.py | 343 | store.write_text('{"iss": {"auth_mode": "oidc", "refresh_token": "dummy-token"}}') | CODE |
| LOW⚡ | tests/test_reddit.py | 227 | result = enrich_with_comments(items, "fake-token", depth="quick", budget_seconds=60) | CODE |
| LOW⚡ | tests/test_reddit.py | 239 | result = enrich_with_comments(items, "fake-token", depth="quick", budget_seconds=0) | CODE |
| LOW⚡ | tests/test_reddit.py | 246 | result = enrich_with_comments([], "fake-token", depth="default", budget_seconds=60) | CODE |
| LOW⚡ | tests/test_reddit.py | 255 | result = enrich_with_comments(items, "fake-token", depth="quick", budget_seconds=60) | CODE |
| LOW⚡ | tests/test_x_policy.py | 282 | config = _grok_bot(X_BEARER_TOKEN="dummy-bearer", **_COOKIES, XQUIK_API_KEY="dummy-key") | CODE |
| LOW⚡ | tests/test_x_policy.py | 302 | config = _grok_bot(**_COOKIES, XQUIK_API_KEY="dummy-key") | CODE |
| LOW⚡ | tests/test_x_policy.py | 335 | config = _grok_bot(X_BEARER_TOKEN="dummy-bearer", XQUIK_API_KEY="dummy-key", **_COOKIES) | CODE |
| LOW⚡ | tests/test_x_policy.py | 619 | res = _resolve_x(_grok_bot(**_COOKIES, XQUIK_API_KEY="dummy-key")) | CODE |
| LOW | tests/test_x_policy.py | 244 | config = _grok_bot(LAST30DAYS_X_BACKEND="xquik", XQUIK_API_KEY="dummy-key", | CODE |
| LOW⚡ | tests/test_deadline_lifecycle.py | 212 | result = http.get(endpoint, headers={"Authorization": "Bearer dummy", "x-api-key": "dummy-key"}, | CODE |
| LOW⚡ | tests/test_deadline_lifecycle.py | 220 | assert lowered["x-api-key"] == "dummy-key" | CODE |
| LOW⚡ | tests/test_deadline_lifecycle.py | 272 | result = reddit.enrich_with_comments(items, "dummy-key", budget_seconds=2) | CODE |
| LOW | tests/test_deadline_lifecycle.py | 163 | result.extend(reddit.enrich_with_comments(items, "dummy-key", depth="quick", budget_seconds=1.2)) | CODE |
| LOW⚡ | tests/test_meta_ads_render.py | 270 | record = doctor._meta_ads_record({"SCRAPECREATORS_API_KEY": "fake-key"}) | CODE |
| LOW⚡ | tests/test_meta_ads_render.py | 276 | {"SCRAPECREATORS_API_KEY": "fake-key", "INCLUDE_SOURCES": "meta_ads"} | CODE |
| LOW | tests/test_providers_v3.py | 267 | client = providers.GeminiClient("dummy-key") | CODE |
| LOW | tests/test_source_outcomes.py | 145 | token="dummy-token", | CODE |
| LOW | tests/test_instagram_sc.py | 121 | depth="default", token="fake-token", | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 139 | depth="default", token="fake-token", | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 153 | depth="default", token="fake-token", | CODE |
| LOW | tests/test_instagram_sc.py | 203 | instagram.fetch_captions(items, token="fake-token") | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 214 | instagram.fetch_captions(items, token="fake-token") | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 225 | instagram.fetch_captions(items, token="fake-token", timeout=10) | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 237 | token="fake-token", | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 250 | instagram.fetch_captions(items, token="fake-token") | CODE |
| LOW | tests/test_instagram_sc.py | 275 | token="dummy-key", | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 90 | assert client("dummy-key").generate_text("model", "prompt") == "direct" | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 95 | assert headers["authorization"] == "Bearer dummy-key" | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 105 | assert providers.OpenAIClient("dummy-key").generate_text("model", "prompt") == "direct" | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 108 | assert source_requests[0][2]["authorization"] == "Bearer dummy-key" | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 120 | assert providers.OpenAIClient("dummy-key").generate_text("model", "prompt") == "direct" | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 135 | "dummy-key", "model", "topic", "2026-09-01", "2026-10-01", depth="quick" | CODE |
| LOW⚡ | tests/test_provider_loopback_proxy.py | 142 | assert endpoint_requests[0][2]["authorization"] == "Bearer dummy-key" | CODE |
| LOW | tests/test_provider_loopback_proxy.py | 156 | "topic", ("2026-09-01", "2026-10-01"), "dummy-key", deep=False | CODE |
| LOW | tests/test_provider_loopback_proxy.py | 163 | assert endpoint_requests[0][2]["authorization"] == "Bearer dummy-key" | CODE |
| LOW | tests/test_watchlist_costs.py | 40 | "providers.OpenRouterClient('dummy-key').generate_text('example/model', 'prompt')\n" | CODE |
| LOW⚡ | tests/test_meta_ads_pipeline.py | 16 | return {"SCRAPECREATORS_API_KEY": "fake-key", "INCLUDE_SOURCES": include} | CODE |
| LOW⚡ | tests/test_meta_ads_pipeline.py | 212 | assert captured["token"] == "fake-key" | CODE |
| LOW | tests/test_meta_ads_pipeline.py | 160 | cfg = {"SCRAPECREATORS_API_KEY": "fake-key"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 226 | config = {"AUTH_TOKEN": "dummy-token", "CT0": "dummy-ct0"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 239 | config = {"AUTH_TOKEN": "dummy-token", "CT0": "dummy-ct0", "XAI_API_KEY": "dummy-key"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 277 | "AUTH_TOKEN": "dummy-token", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 279 | "XQUIK_API_KEY": "dummy-key", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 292 | config = {"XQUIK_API_KEY": "dummy-key"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 324 | "AUTH_TOKEN": "dummy-token", | CODE |
| 88 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_evaluator_v3.py | 16 | CODE | |
| LOW | tests/test_evaluator_v3.py | 267 | CODE | |
| LOW | tests/test_github_redirect_auth.py | 83 | CODE | |
| LOW | tests/test_github_redirect_auth.py | 161 | CODE | |
| LOW | tests/test_store_topic_membership.py | 85 | CODE | |
| LOW | tests/test_store_topic_membership.py | 224 | CODE | |
| LOW | tests/test_briefing_v3.py | 32 | CODE | |
| LOW | tests/test_doctor.py | 1823 | CODE | |
| LOW | tests/test_subproc.py | 19 | CODE | |
| LOW | tests/test_subproc.py | 103 | CODE | |
| LOW | tests/test_subproc.py | 552 | CODE | |
| LOW | tests/test_subproc.py | 589 | CODE | |
| LOW | tests/test_subproc.py | 630 | CODE | |
| LOW | tests/test_subproc.py | 701 | CODE | |
| LOW | tests/test_subproc.py | 723 | CODE | |
| LOW | tests/test_changelog_workflow.py | 234 | CODE | |
| LOW | tests/test_grounding_v3.py | 623 | CODE | |
| LOW | tests/hermes/test_no_critical_scan_findings.py | 58 | CODE | |
| LOW | skills/last30days/scripts/store.py | 297 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 321 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 2420 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 2911 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 3250 | CODE | |
| LOW | skills/last30days/scripts/lib/freshness.py | 96 | CODE | |
| LOW | skills/last30days/scripts/lib/freshness.py | 419 | CODE | |
| LOW | skills/last30days/scripts/lib/rerank.py | 922 | CODE | |
| LOW | skills/last30days/scripts/lib/truthsocial.py | 51 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 268 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 609 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 834 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 1074 | CODE | |
| LOW | skills/last30days/scripts/lib/techmeme.py | 146 | CODE | |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 68 | CODE | |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 215 | CODE | |
| LOW | skills/last30days/scripts/lib/x_api.py | 700 | CODE | |
| LOW | skills/last30days/scripts/lib/resolve.py | 154 | CODE | |
| LOW | skills/last30days/scripts/lib/resolve.py | 183 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 320 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 368 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 547 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 1147 | CODE | |
| LOW | skills/last30days/scripts/lib/library.py | 238 | CODE | |
| LOW | skills/last30days/scripts/lib/arxiv.py | 227 | CODE | |
| LOW | skills/last30days/scripts/lib/arxiv.py | 243 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 1675 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 1802 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 2131 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 2295 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 3317 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 3726 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 3824 | CODE | |
| LOW | skills/last30days/scripts/lib/polymarket.py | 450 | CODE | |
| LOW | skills/last30days/scripts/lib/polymarket.py | 685 | CODE | |
| LOW | skills/last30days/scripts/lib/hiring_signals.py | 186 | CODE | |
| LOW | skills/last30days/scripts/lib/agentcookie.py | 125 | CODE | |
| LOW | skills/last30days/scripts/lib/subproc.py | 121 | CODE | |
| LOW | skills/last30days/scripts/lib/subproc.py | 165 | CODE | |
| LOW | skills/last30days/scripts/lib/bird_x.py | 378 | CODE | |
| LOW | skills/last30days/scripts/lib/bird_x.py | 829 | CODE | |
| LOW | skills/last30days/scripts/lib/perplexity.py | 476 | CODE | |
| 92 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/last30days/scripts/lib/telegram.py | 0 | parse youtube search response to normalized format. returns: list of item dicts ready for normalization. | STRING |
| HIGH | skills/last30days/scripts/lib/pinterest.py | 0 | parse youtube search response to normalized format. returns: list of item dicts ready for normalization. | STRING |
| HIGH | skills/last30days/scripts/lib/threads.py | 0 | parse youtube search response to normalized format. returns: list of item dicts ready for normalization. | STRING |
| HIGH | skills/last30days/scripts/lib/instagram.py | 0 | parse youtube search response to normalized format. returns: list of item dicts ready for normalization. | STRING |
| HIGH | skills/last30days/scripts/lib/tiktok.py | 0 | parse youtube search response to normalized format. returns: list of item dicts ready for normalization. | STRING |
| HIGH | skills/last30days/scripts/lib/youtube_yt.py | 0 | parse youtube search response to normalized format. returns: list of item dicts ready for normalization. | STRING |
| HIGH | skills/last30days/scripts/lib/pinterest.py | 0 | search tiktok via scrapecreators api. args: topic: search topic from_date: start date (yyyy-mm-dd) to_date: end date (yy | STRING |
| HIGH | skills/last30days/scripts/lib/threads.py | 0 | search tiktok via scrapecreators api. args: topic: search topic from_date: start date (yyyy-mm-dd) to_date: end date (yy | STRING |
| HIGH | skills/last30days/scripts/lib/instagram.py | 0 | search tiktok via scrapecreators api. args: topic: search topic from_date: start date (yyyy-mm-dd) to_date: end date (yy | STRING |
| HIGH | skills/last30days/scripts/lib/tiktok.py | 0 | search tiktok via scrapecreators api. args: topic: search topic from_date: start date (yyyy-mm-dd) to_date: end date (yy | STRING |
| HIGH | skills/last30days/scripts/lib/instagram.py | 0 | generate multiple youtube search queries from a topic. mirrors reddit.py's expand_reddit_queries() pattern: 1. extract c | STRING |
| HIGH | skills/last30days/scripts/lib/tiktok.py | 0 | generate multiple youtube search queries from a topic. mirrors reddit.py's expand_reddit_queries() pattern: 1. extract c | STRING |
| HIGH | skills/last30days/scripts/lib/youtube_yt.py | 0 | generate multiple youtube search queries from a topic. mirrors reddit.py's expand_reddit_queries() pattern: 1. extract c | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CONFIGURATION.md | 221 | COMMENT | |
| LOW | CONFIGURATION.md | 241 | AUTH_TOKEN=<your-auth-token> | COMMENT |
| LOW | tests/test_footer_nudge_suppression.py | 41 | # selection. Seal that source too. | COMMENT |
| LOW | tests/test_doctor.py | 121 | return_value=("missing", "no token store at ~/.xurl"), | COMMENT |
| LOW | mcp/internal/engine/embed.go | 1 | // Package engine wraps the vendored Python last30days engine. The engine | COMMENT |
| LOW | mcp/internal/engine/run.go | 21 | COMMENT | |
| LOW | mcp/internal/engine/extract.go | 21 | COMMENT | |
| LOW | …ns/discovery-checkpoint-protocol-design-conventions.md | 321 | # phrase as the --discover argument on this leg only): | COMMENT |
| LOW | .github/workflows/osv-scanner.yml | 1 | name: OSV-Scanner | COMMENT |
| LOW | skills/last30days/references/save-html-brief.md | 21 | # "What I learned:" prose label, the bold-lead-in paragraphs with their | COMMENT |
| LOW | skills/last30days/references/save-html-brief.md | 41 | **{Third headline}** - {body} | COMMENT |
| LOW | skills/last30days/scripts/setup-pass.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | skills/last30days/scripts/setup-keychain.sh | 1 | #!/bin/bash | COMMENT |
| LOW | skills/last30days/scripts/lib/xurl_x.py | 81 | # OSError covers FileNotFoundError (no xurl on PATH) and | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 21 | COMMENT | |
| LOW | skills/last30days/scripts/lib/rerank.py | 101 | # left the sweep ranking noise against noise, and it dutifully emitted five | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 181 | # engaging — that no keyword or like-count surfaces. It is floated to a minimum | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 681 | (candidate.local_relevance * 100.0 * 0.7) | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 701 | # never going to make -- a "Weber Grills" run legitimately surfaces a | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 801 | ): | COMMENT |
| LOW | skills/last30days/scripts/lib/signals.py | 61 | COMMENT | |
| LOW | skills/last30days/scripts/lib/hackernews.py | 101 | COMMENT | |
| LOW | skills/last30days/scripts/lib/x_api.py | 101 | # X-specific body markers for credit exhaustion, matched on any status on | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 41 | CONFIG_FILE = CONFIG_DIR / ".env" | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 621 | ('LAST30DAYS_X_BACKEND', None), | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 701 | ('LAST30DAYS_AMAZON_DOMAIN', 'https://www.amazon.com'), | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 841 | if ignored_project_env_path: | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 1261 | """ | COMMENT |
| LOW | skills/last30days/scripts/lib/health.py | 121 | COMMENT | |
| LOW | skills/last30days/scripts/lib/cjk.py | 41 | "没有", "看", "好", "自己", "这", "那", "这个", "那个", "什么", "怎么", | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 121 | } | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 461 | # Amazon: opt-in additive source, dual-gated. The Bright Data CLI must be | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2441 | # post retrieved in Phase 1 was still pruned before fusion, which is exactly | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2941 | ) | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2961 | # Real X handles from explicit flags, @mentions in topic, or Phase 2 discovery. | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 3541 | max_days=lookback_window_days, | COMMENT |
| LOW | skills/last30days/scripts/lib/pipeline.py | 4261 | related_handles = [] | COMMENT |
| LOW | skills/last30days/scripts/lib/http.py | 1301 | COMMENT | |
| LOW | skills/last30days/scripts/lib/quality_nudge.py | 261 | core_active.append("youtube") | COMMENT |
| LOW | skills/last30days/scripts/lib/linkedin.py | 41 | # it as an error marks a whole run partial and hides a legitimate null behind | COMMENT |
| LOW | skills/last30days/scripts/lib/github.py | 161 | content_score = token_overlap_relevance(query, title) | COMMENT |
| LOW | skills/last30days/scripts/lib/trustpilot.py | 61 | # runner-up's review volume to win automatically. Lookalike/squatter pages have | COMMENT |
| LOW | skills/last30days/scripts/lib/doctor.py | 481 | # Diagnose/doctor load config in plan_only mode, so browser cookies are not | COMMENT |
| LOW | skills/last30days/scripts/lib/doctor.py | 561 | # R3/R8: When no auto-chain backend is CONFIGURED (all MISSING) but grok has | COMMENT |
| LOW | skills/last30days/scripts/lib/doctor.py | 1001 | "linkedin": _linkedin_record, | COMMENT |
| LOW | skills/last30days/scripts/lib/doctor.py | 1621 | if not failed and not partial: | COMMENT |
| LOW | skills/last30days/scripts/lib/doctor.py | 1641 | # pin values, INCLUDE_SOURCES). A schema or fingerprint mismatch is treated | COMMENT |
| LOW | skills/last30days/scripts/lib/doctor.py | 1821 | return False | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1041 | transcript = _clean_vtt(raw_vtt) | COMMENT |
| LOW | skills/last30days/scripts/lib/relevance.py | 61 | # They still help when paired with stronger entity/topic matches. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 953 | - **`--competitors` flag for auto-discovered comparison fan-out.** Pass `--competitors` on a single-entity topic and the | CODE |
| MEDIUM⚡ | tests/test_trustpilot_source.py | 165 | # ---- shared scaffolding for domain-resolution and warm-up tests ---- | COMMENT |
| MEDIUM⚡ | tests/test_topic_shape.py | 34 | # No sentence scaffolding: the verb-phrase framing must be gone. | COMMENT |
| MEDIUM | tests/test_ranking_query_scaffolding.py | 8 | # with sentinels so only the fixed scaffolding words remain. | COMMENT |
| MEDIUM⚡ | tests/test_render_comparison_multi.py | 109 | # Envelope scaffolding present | COMMENT |
| MEDIUM | docs/releases/v3.0.9.md | 23 | - **Offline quality evaluation.** @j-sperling's PR ([#233](https://github.com/mvanhorn/last30days-skill/pull/233)) added | CODE |
| MEDIUM | skills/last30days/references/comparison.md | 17 | - Stdout shows a merged comparison with the `## Head-to-Head` scaffold + per-entity Resolved Entities block. | CODE |
| MEDIUM | skills/last30days/scripts/lib/render.py | 1520 | # Reuse the existing comparison scaffold by feeding it the synthesized | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/render.py | 1521 | # topic. _parse_comparison_entities splits on " vs " so the scaffold | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/bird_x.py | 568 | # Build OR-group query: ("multi-agent" OR "agent simulation") since:DATE | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/topic_shape.py | 77 | # Framing scaffolding stripped (iteratively) from the start of a title before | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/relevance.py | 63 | # The second group is scaffolding emitted by planner's ranking-query templates | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/relevance.py | 83 | # planner ranking-query scaffolding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_skill_progressive_disclosure.py | 49 | assert "Skip Step 0" in setup.split("## Step 0: First-Run Setup Wizard", 1)[0] | CODE |
| LOW⚡ | tests/test_skill_progressive_disclosure.py | 63 | entry = setup.split("## Step 0: First-Run Setup Wizard", 1)[0] | CODE |
| LOW | tests/test_onboarding_contract.py | 34 | self.assertIn("## Step 0: First-Run Setup Wizard", self.step0) | CODE |
| LOW | tests/test_grok_bot_host_contract.py | 94 | assert "## Step 0: First-Run Setup Wizard" in step0 | CODE |
| LOW | docs/reference/old-nux-wizard-v3.0.0.md | 10 | ## Step 0: First-Run Setup Wizard | COMMENT |
| LOW | skills/last30days/references/setup-wizard.md | 9 | ## Step 0: First-Run Setup Wizard | COMMENT |
| LOW | skills/last30days/scripts/test_device_auth.py | 40 | # Step 1: Start device flow | COMMENT |
| LOW | skills/last30days/scripts/test_device_auth.py | 67 | # Step 2: Poll for token | COMMENT |
| LOW | skills/last30days/scripts/test_device_auth.py | 106 | # Step 3: Fetch profile | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/instagram.py | 514 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/instagram.py | 517 | # Step 3: Attach captions to items | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 485 | # Step 0: Creator reels (high-signal, runs first) | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 496 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/tiktok.py | 440 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 458 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 461 | # Step 3: Attach captions to items | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 685 | # Step 1: Fetch the watch page HTML | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 694 | # Step 2: Extract captions URL from ytInitialPlayerResponse | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 747 | # Step 3: Fetch the VTT subtitle file | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1246 | # Step 1: Multi-query search — run yt-dlp for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1268 | # Step 2: Fetch transcripts for top videos. | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1299 | # Step 3: Attach transcripts and extract highlights. Mark captions_disabled | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1585 | # Step 1: Search | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1643 | # Step 2: Fetch transcripts for top videos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_skill_progressive_disclosure.py | 49 | assert "Skip Step 0" in setup.split("## Step 0: First-Run Setup Wizard", 1)[0] | CODE |
| LOW⚡ | tests/test_skill_progressive_disclosure.py | 63 | entry = setup.split("## Step 0: First-Run Setup Wizard", 1)[0] | CODE |
| LOW | tests/test_onboarding_contract.py | 34 | self.assertIn("## Step 0: First-Run Setup Wizard", self.step0) | CODE |
| LOW | tests/test_grok_bot_host_contract.py | 94 | assert "## Step 0: First-Run Setup Wizard" in step0 | CODE |
| LOW | skills/last30days/scripts/test_device_auth.py | 40 | # Step 1: Start device flow | COMMENT |
| LOW | skills/last30days/scripts/test_device_auth.py | 67 | # Step 2: Poll for token | COMMENT |
| LOW | skills/last30days/scripts/test_device_auth.py | 106 | # Step 3: Fetch profile | COMMENT |
| LOW | skills/last30days/scripts/lib/x_judge.py | 56 | # Text has the token, but we need to check if it's the acronym (US) | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/instagram.py | 514 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/instagram.py | 517 | # Step 3: Attach captions to items | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 485 | # Step 0: Creator reels (high-signal, runs first) | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 496 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/tiktok.py | 440 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 458 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 461 | # Step 3: Attach captions to items | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 685 | # Step 1: Fetch the watch page HTML | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 694 | # Step 2: Extract captions URL from ytInitialPlayerResponse | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 747 | # Step 3: Fetch the VTT subtitle file | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1246 | # Step 1: Multi-query search — run yt-dlp for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1268 | # Step 2: Fetch transcripts for top videos. | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1299 | # Step 3: Attach transcripts and extract highlights. Mark captions_disabled | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1585 | # Step 1: Search | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1643 | # Step 2: Fetch transcripts for top videos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_techmeme_source.py | 128 | """Non-string date values (int/null) are treated as undated and kept; | STRING |
| HIGH | skills/last30days/scripts/lib/health.py | 168 | "nvm": ("nvm install --lts", "reinstall node via nvm: nvm install --lts && nvm use --lts"), | CODE |
| HIGH | skills/last30days/scripts/lib/setup_wizard.py | 897 | "requests/month). Install with: npm i -g @brightdata/cli && brightdata login" | CODE |
| HIGH | skills/last30days/scripts/lib/discovery_handoff.py | 784 | # Only a real JSON boolean is a junk verdict: null, "false", 0, or | COMMENT |
| HIGH | skills/last30days/scripts/lib/backends.py | 392 | prescription="npm install -g xurl && xurl auth oauth2 login", | CODE |
| HIGH | skills/last30days/scripts/lib/doctor.py | 762 | fix="npm i -g @brightdata/cli && brightdata login", | CODE |
| HIGH | skills/last30days/scripts/lib/youtube_yt.py | 784 | f'-o "$TMPD/%(id)s" {quoted_url} >/dev/null 2>&1 || true; ' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/last30days/scripts/lib/subproc.py | 177 | Run a subprocess with process-group cleanup on timeout. Spawns ``cmd`` inside its own process group via ``start_new | STRING |
| HIGH | skills/last30days/scripts/lib/http.py | 787 | Make an HTTP request and return JSON response. Args: method: HTTP method (GET, POST, etc.) url: Req | STRING |
| HIGH | skills/last30days/scripts/lib/http.py | 1150 | Fetch a URL and return decoded text, or None on any failure. Keyless helper for Reddit site search and shreddit HTM | STRING |
| HIGH | skills/last30days/scripts/lib/dates.py | 8 | Validate and normalize an --as-of date. Args: as_of_date: Date string in YYYY-MM-DD format. Returns: | STRING |
| HIGH | skills/last30days/scripts/lib/reddit_enrich.py | 41 | Fetch Reddit thread JSON data. Args: url: Reddit thread URL mock_data: Mock data for testing | STRING |
| HIGH | skills/last30days/scripts/lib/reddit_enrich.py | 203 | Enrich a Reddit item with real engagement data. Args: item: Reddit item dict mock_thread_data: Mock | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_polymarket.py | 101 | # Single word, should just return that word | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/planner.py | 692 | # Hebrew-language topics: elevate web search (grounding) to the front of | STRING |
| MEDIUM | skills/last30days/scripts/lib/bird_x.py | 316 | """Get comprehensive Bird search status. | STRING |
| MEDIUM | skills/last30days/scripts/lib/pipeline.py | 3086 | # eval harness stays fully offline: this path calls the GitHub API (and the | COMMENT |
| MEDIUM⚡ | skills/last30days/scripts/lib/github.py | 1156 | # Project-mode search: fetch comprehensive data for specific repos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/last30days/scripts/lib/x_judge.py | 143 | # Check if top-3 frequency authors have poor on-topic ratio | COMMENT |
| LOW | skills/last30days/scripts/lib/x_judge.py | 219 | # Check if handle qualifies for extracted promotion | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 231 | # Check if group or other can read (bits 0o044) | COMMENT |
| LOW | skills/last30days/scripts/lib/ui.py | 11 | # Check if we're in a real terminal (not captured by Claude Code) | COMMENT |
| LOW | skills/last30days/scripts/lib/bird_x.py | 560 | # Check if we got results | COMMENT |
| LOW | skills/last30days/scripts/lib/quality_nudge.py | 280 | # Check if configured but errored (yt-dlp installed but failed this run) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_fun_vote_weighting.py | 22 | CODE | |
| LOW | tests/test_backend_descriptors.py | 53 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 321 | CODE | |
| LOW | skills/last30days/scripts/lib/ui.py | 404 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 1679 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2204 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 4701 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 5231 | CODE | |
| LOW | skills/last30days/scripts/lib/http.py | 771 | CODE | |
| LOW | skills/last30days/scripts/lib/quality_nudge.py | 319 | CODE | |
| LOW | skills/last30days/scripts/lib/doctor.py | 236 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_corpus_source.py | 19 | def _set_mtime(path: Path, value: str) -> None: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | skills/last30days/scripts/lib/cookie_extract.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | skills/last30days/scripts/lib/chrome_cookies.py | 26 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/last30days/scripts/setup-pass.sh | 10 | # Usage: | COMMENT |
| LOW | skills/last30days/scripts/setup-keychain.sh | 8 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | skills/last30days/scripts/lib/pipeline.py | 4760 | # Create a retry subquery with the simplified core subject | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_youtube_yt.py | 248 | "Don't forget to subscribe and hit the bell. " | CODE |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 127 | r"^(hey |hi |what's up|welcome back|in today's video|don't forget to)", | CODE |