AI agent skill that researches any topic across Reddit, X, YouTube, HN, Polymarket, and the web - then synthesizes a grounded summary
This report presents the forensic synthetic code analysis of mvanhorn/last30days-skill, a Python project with 52,058 GitHub stars. SynthScan v2.0 examined 101,586 lines of code across 341 source files, recording 3371 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 40.6 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).
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.
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.
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.
The scanner identified 3371 distinct pattern matches across 20 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.
| 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 | 102 | def test_probe_false_uses_local_evidence_only(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 110 | def test_probe_false_without_stored_auth_reports_unavailable(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 118 | def test_probe_true_keeps_the_live_check(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 126 | def test_x_backend_chain_local_only_never_calls_live_check(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 134 | def test_x_backend_chain_default_stays_live(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 149 | def test_threads_available_with_sc_key_only(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 152 | def test_threads_unavailable_without_sc_key(self): | CODE |
| LOW⚡ | tests/test_env_v3.py | 156 | def test_threads_availability_predicate_is_key_only(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 70 | def test_cross_platform_comparable(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 82 | def test_zero_or_missing_votes(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 87 | def test_monotonic_within_platform(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 103 | def test_scored_extract_prefixes_vote_count(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 109 | def test_scored_extract_no_score_no_prefix(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 115 | def test_scored_extract_negative_score_no_malformed_prefix(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 123 | def test_prompt_contains_traction_guidance(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 134 | def test_high_vote_top_comment_scores_higher(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 146 | def test_fallback_without_votes_still_scores(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 165 | def test_relevance_gate_excludes_entity_miss(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 181 | def test_zero_final_score_excluded(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 189 | def test_funny_floor_blocks_high_vote_unfunny(self): | CODE |
| LOW⚡ | tests/test_fun_vote_weighting.py | 198 | def test_votes_promote_funnyish_over_threshold(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 215 | def test_bounded_amplification_does_not_overturn_humor_gap(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 224 | def test_meaningful_at_medium_orders_by_votes(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 237 | def test_level_scaling_high_more_than_low(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 253 | def test_crowd_boost_tag_when_votes_lift_ranking(self): | CODE |
| LOW | tests/test_fun_vote_weighting.py | 266 | 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 | 50 | def test_setup_without_cookie_flag_disables_browser_cookie_setup(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 64 | def test_setup_cookie_flag_allows_browser_cookie_setup(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 78 | def test_no_browser_cookies_overrides_setup_cookie_flag(monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 103 | def test_diagnose_overrides_setup_cookie_flag(monkeypatch): | CODE |
| LOW⚡ | tests/test_security_boundaries.py | 128 | def test_research_run_defaults_to_browser_cookie_read(): | CODE |
| LOW⚡ | tests/test_security_boundaries.py | 136 | def test_no_browser_cookies_flag_disables_research_run_cookie_read(): | CODE |
| LOW⚡ | tests/test_security_boundaries.py | 144 | def test_watchlist_subprocess_disables_browser_cookies(): | CODE |
| LOW | tests/test_security_boundaries.py | 158 | def test_project_config_ignored_by_default_and_cannot_self_trust(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_security_boundaries.py | 178 | def test_project_config_loads_with_process_trust_signal(tmp_path, monkeypatch): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 28 | def test_collapses_whitespace(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 45 | def test_short_text_returns_whole(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 49 | def test_empty_returns_empty_set(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 52 | def test_normalizes_before_ngrams(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 90 | def test_completely_different(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 98 | def test_filters_single_char_tokens(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 114 | def test_completely_different(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 118 | def test_takes_max_of_both_methods(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 150 | def test_includes_author_and_container(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 174 | def test_removes_near_duplicates(self): | CODE |
| LOW⚡ | tests/test_dedupe_v3.py | 183 | def test_keeps_first_of_duplicates(self): | CODE |
| 2540 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_diagnose_compat.py | 50 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_diagnose_compat.py | 52 | # --------------------------------------------------------------------------- | 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 | 60 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 62 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 106 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 201 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 203 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 222 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 224 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 308 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_prescriptions.py | 310 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_prescriptions.py | 129 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_prescriptions.py | 131 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 59 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 139 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 190 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 192 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 205 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 207 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 230 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 232 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 245 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 247 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 269 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 271 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 284 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 286 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 317 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 319 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 344 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 346 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 368 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_internals_v3.py | 370 | # --------------------------------------------------------------------------- | COMMENT |
| 138 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_fun_vote_weighting.py | 10 | CODE | |
| LOW | tests/test_security_boundaries.py | 3 | CODE | |
| LOW | tests/test_setup_wizard_pp_sources.py | 4 | CODE | |
| LOW | tests/test_planner_quiet_mode.py | 3 | CODE | |
| LOW | tests/test_library_search.py | 3 | CODE | |
| LOW | tests/test_safari_cookies.py | 3 | CODE | |
| LOW | tests/test_techmeme_source.py | 8 | 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_cookie_extract.py | 14 | CODE | |
| LOW | tests/test_cookie_extract.py | 14 | CODE | |
| LOW | tests/test_arxiv_source.py | 8 | CODE | |
| LOW | tests/test_chrome_cookies.py | 3 | CODE | |
| LOW | tests/test_chrome_cookies.py | 8 | CODE | |
| LOW | tests/test_chrome_cookies.py | 16 | CODE | |
| LOW | tests/test_chrome_cookies.py | 16 | CODE | |
| LOW | tests/test_chrome_cookies.py | 16 | CODE | |
| LOW | tests/test_chrome_cookies.py | 16 | CODE | |
| LOW | tests/test_footer_nudge_suppression.py | 3 | CODE | |
| LOW | tests/test_rerank_fun.py | 3 | CODE | |
| LOW | tests/test_competitors_plan_threading.py | 3 | CODE | |
| LOW | tests/test_competitors_plan_threading.py | 11 | 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_check_config_ytdlp_detection.py | 14 | CODE | |
| LOW | tests/test_codex_host_contract.py | 3 | CODE | |
| LOW | tests/test_competitors_resolve_integration.py | 3 | CODE | |
| LOW | tests/test_check_config_memory_dir.py | 17 | CODE | |
| LOW | tests/test_check_config_memory_dir.py | 22 | CODE | |
| LOW | tests/test_setup_openclaw.py | 9 | CODE | |
| LOW | tests/test_setup_openclaw.py | 11 | CODE | |
| LOW | tests/test_quality_nudge.py | 8 | 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_instagram_sc.py | 5 | CODE | |
| LOW | tests/test_categories.py | 12 | CODE | |
| LOW | tests/test_dripstack.py | 3 | CODE | |
| LOW | tests/test_polymarket.py | 3 | CODE | |
| LOW | tests/test_polymarket.py | 4 | CODE | |
| LOW | tests/test_html_publish.py | 3 | CODE | |
| LOW | tests/test_trustpilot_source.py | 7 | CODE | |
| LOW | tests/test_setup_wizard.py | 8 | CODE | |
| LOW | tests/test_competitors.py | 3 | CODE | |
| LOW | tests/test_registers.py | 1 | CODE | |
| LOW | tests/test_corpus_source.py | 1 | CODE | |
| LOW | tests/test_env_keychain.py | 11 | CODE | |
| 116 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_competitors_resolve_integration.py | 292 | except Exception as exc: | CODE |
| LOW | tests/e2e_comparison.py | 110 | except Exception as exc: | CODE |
| LOW | tests/test_freshness.py | 748 | except Exception: | CODE |
| LOW | tests/test_freshness.py | 759 | except Exception: | CODE |
| LOW | tests/test_competitor_subrun_isolation.py | 85 | 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 | hooks/scripts/check-config.sh | 169 | except Exception: | CODE |
| LOW | skills/last30days/scripts/evaluate_search_quality.py | 574 | except Exception as exc: | CODE |
| MEDIUM | skills/last30days/scripts/last30days.py | 2360 | print("Error: --deep-research requires PERPLEXITY_API_KEY or OPENROUTER_API_KEY", file=sys.stderr) | CODE |
| LOW | skills/last30days/scripts/last30days.py | 459 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 947 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 1204 | except Exception: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 1591 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 2518 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 2593 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/last30days.py | 2665 | except Exception: | CODE |
| LOW | skills/last30days/scripts/watchlist.py | 49 | 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 | 186 | except Exception as exc: | CODE |
| MEDIUM | skills/last30days/scripts/lib/xurl_x.py | 64 | def _is_available_uncached() -> bool: | CODE |
| LOW | skills/last30days/scripts/lib/truthsocial.py | 108 | 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 | 176 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 201 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 208 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 251 | except Exception: | 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 | 700 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/env.py | 1127 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/polymarket.py | 334 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/polymarket.py | 366 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/subproc.py | 77 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/bird_x.py | 249 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/bird_x.py | 256 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/perplexity.py | 672 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/perplexity.py | 679 | except Exception as e: | CODE |
| LOW | skills/last30days/scripts/lib/perplexity.py | 743 | except Exception as e: | 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 |
| MEDIUM | skills/last30days/scripts/lib/setup_wizard.py | 1042 | def _cleanup() -> None: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 108 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 135 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 257 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 338 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 713 | except Exception as exc: # never let a config-read failure block auth | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 871 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 943 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 971 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 1003 | except Exception as exc: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 1023 | except Exception: | CODE |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 1045 | except Exception: | CODE |
| 80 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_briefing_v3.py | 32 | CODE | |
| LOW | tests/test_subproc.py | 17 | CODE | |
| LOW | tests/test_pipeline_v3.py | 199 | CODE | |
| LOW | tests/hermes/test_no_critical_scan_findings.py | 58 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 152 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 1443 | CODE | |
| LOW | skills/last30days/scripts/last30days.py | 1942 | 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 | 728 | CODE | |
| LOW | skills/last30days/scripts/lib/truthsocial.py | 51 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 215 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 523 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 735 | CODE | |
| LOW | skills/last30days/scripts/lib/planner.py | 929 | CODE | |
| LOW | skills/last30days/scripts/lib/techmeme.py | 146 | CODE | |
| LOW | skills/last30days/scripts/lib/reddit_keyless.py | 181 | 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 | 208 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 256 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 398 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 679 | CODE | |
| LOW | skills/last30days/scripts/lib/env.py | 1140 | CODE | |
| LOW | skills/last30days/scripts/lib/arxiv.py | 193 | CODE | |
| LOW | skills/last30days/scripts/lib/arxiv.py | 209 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 1286 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 1501 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 2228 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 2624 | CODE | |
| LOW | skills/last30days/scripts/lib/render.py | 2675 | CODE | |
| LOW | skills/last30days/scripts/lib/polymarket.py | 339 | CODE | |
| LOW | skills/last30days/scripts/lib/polymarket.py | 566 | CODE | |
| LOW | skills/last30days/scripts/lib/hiring_signals.py | 186 | CODE | |
| LOW | skills/last30days/scripts/lib/subproc.py | 30 | CODE | |
| LOW | skills/last30days/scripts/lib/bird_x.py | 559 | CODE | |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 62 | CODE | |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 418 | CODE | |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 474 | CODE | |
| LOW | skills/last30days/scripts/lib/setup_wizard.py | 531 | CODE | |
| LOW | skills/last30days/scripts/lib/digg.py | 69 | CODE | |
| LOW | skills/last30days/scripts/lib/jobs.py | 199 | CODE | |
| LOW | skills/last30days/scripts/lib/jobs.py | 454 | CODE | |
| LOW | skills/last30days/scripts/lib/providers.py | 238 | CODE | |
| LOW | skills/last30days/scripts/lib/providers.py | 358 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 280 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 367 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 524 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 1044 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 1230 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 1844 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2279 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2379 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2419 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2624 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2748 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2850 | CODE | |
| LOW | skills/last30days/scripts/lib/http.py | 520 | CODE | |
| LOW | skills/last30days/scripts/lib/fusion.py | 110 | CODE | |
| LOW | skills/last30days/scripts/lib/instagram.py | 87 | CODE | |
| 26 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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 | tests/test_planner_quiet_mode.py | 17 | topic="Acme Corp", | CODE |
| LOW⚡ | tests/test_reddit.py | 225 | result = enrich_with_comments(items, "fake-token", depth="quick", budget_seconds=60) | CODE |
| LOW⚡ | tests/test_reddit.py | 242 | result = enrich_with_comments(items, "fake-token", depth="quick", budget_seconds=0) | CODE |
| LOW⚡ | tests/test_reddit.py | 248 | result = enrich_with_comments([], "fake-token", depth="default", budget_seconds=60) | CODE |
| LOW⚡ | tests/test_reddit.py | 257 | result = enrich_with_comments(items, "fake-token", depth="quick", budget_seconds=60) | CODE |
| LOW | tests/test_source_outcomes.py | 133 | token="dummy-token", | CODE |
| LOW | tests/test_instagram_sc.py | 120 | depth="default", token="fake-token", | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 138 | depth="default", token="fake-token", | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 152 | depth="default", token="fake-token", | CODE |
| LOW | tests/test_instagram_sc.py | 202 | instagram.fetch_captions(items, token="fake-token") | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 213 | instagram.fetch_captions(items, token="fake-token") | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 224 | instagram.fetch_captions(items, token="fake-token", timeout=10) | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 236 | token="fake-token", | CODE |
| LOW⚡ | tests/test_instagram_sc.py | 249 | instagram.fetch_captions(items, token="fake-token") | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 156 | config = {"AUTH_TOKEN": "dummy-token", "CT0": "dummy-ct0"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 169 | "AUTH_TOKEN": "dummy-token", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 171 | "XQUIK_API_KEY": "dummy-key", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 184 | config = {"XQUIK_API_KEY": "dummy-key"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 214 | "AUTH_TOKEN": "dummy-token", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 216 | "XQUIK_API_KEY": "dummy-key", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 242 | config = {"AUTH_TOKEN": "dummy-token", "CT0": "dummy-ct0"} | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 289 | present = spec.probe({key: "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 398 | res = backends.resolve("reddit", {"SCRAPECREATORS_API_KEY": "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 411 | {"SCRAPECREATORS_API_KEY": "dummy-key", "LAST30DAYS_REDDIT_SC_MIN_ITEMS": "5"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 417 | res = backends.resolve("reddit", {"SCRAPECREATORS_API_KEY": "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 423 | {"SCRAPECREATORS_API_KEY": "dummy-key", "LAST30DAYS_REDDIT_SC_MIN_ITEMS": "lots"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 431 | "SCRAPECREATORS_API_KEY": "dummy-key", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 484 | self._assert_parity({"XAI_API_KEY": "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 488 | {"AUTH_TOKEN": "dummy-token", "CT0": "dummy-ct0"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 494 | {"XQUIK_API_KEY": "dummy-key", "LAST30DAYS_X_BACKEND": "xquik"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 508 | res = backends.resolve("youtube", {"SCRAPECREATORS_API_KEY": "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 516 | res = backends.resolve("youtube", {"SCRAPECREATORS_API_KEY": "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 537 | "web", {"BRAVE_API_KEY": "dummy-key", "EXA_API_KEY": "dummy-key"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 555 | "web", {"BRAVE_API_KEY": "dummy-key", "EXA_API_KEY": "dummy-key"}, pin="exa", | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 587 | {"BRAVE_API_KEY": "dummy-key"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 588 | {"SERPER_API_KEY": "dummy-key"}, | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 600 | res = backends.resolve("web", {"BRAVE_API_KEY": "dummy-key"}) | CODE |
| LOW⚡ | tests/test_backend_descriptors.py | 613 | res = backends.resolve("reddit", {"SCRAPECREATORS_API_KEY": "dummy-key"}) | CODE |
| LOW | tests/test_backend_descriptors.py | 360 | config = {"AUTH_TOKEN": "dummy-token", "CT0": "dummy-ct0"} | CODE |
| LOW | tests/test_pinterest.py | 24 | depth="default", token="fake-token", | CODE |
| LOW | tests/test_pinterest.py | 62 | depth="default", token="fake-token", | CODE |
| LOW⚡ | tests/test_linkedin.py | 43 | self.assertEqual("Jane Doe", item["author"]) | CODE |
| LOW⚡ | tests/test_linkedin.py | 79 | raw = self._make_post(author={"name": "Jane Doe", "full_name": "Jane M Doe"}) | CODE |
| LOW⚡ | tests/test_linkedin.py | 81 | self.assertEqual("Jane Doe", items[0]["author"]) | CODE |
| LOW⚡ | tests/test_linkedin.py | 197 | "AI agents", "2026-05-27", "2026-06-26", depth="quick", token="fake-token" | CODE |
| LOW⚡ | tests/test_linkedin.py | 210 | "AI agents", "2026-05-27", "2026-06-26", token="fake-token" | CODE |
| LOW | tests/test_linkedin.py | 26 | "name": "Jane Doe", | CODE |
| LOW | tests/test_grounding_v3.py | 33 | items, artifact = grounding.brave_search("test", ("2026-02-25", "2026-03-27"), "fake-key") | CODE |
| LOW | tests/test_grounding_v3.py | 67 | items, artifact = grounding.serper_search("test", ("2026-02-25", "2026-03-27"), "fake-key") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_onboarding_contract.py | 30 | start = self.text.index("## Step 0: First-Run Setup Wizard") | CODE |
| LOW | docs/reference/old-nux-wizard-v3.0.0.md | 10 | ## Step 0: First-Run Setup Wizard | COMMENT |
| LOW | skills/last30days/SKILL.md | 282 | - Output is `FIRST_RUN_DETECTED` → this is a first run. Jump immediately to `## Step 0: First-Run Setup Wizard` and comp | CODE |
| LOW | skills/last30days/SKILL.md | 284 | **Named failure mode (2026-06-22, first-run setup skip - Fredy Montero run):** Model read "proceed to Step 0.5" in the b | CODE |
| LOW | skills/last30days/SKILL.md | 297 | - **If the user provided a topic** (e.g. `/last30days Kanye West`, `/last30days nvidia earnings`): confirm the first-run | CODE |
| LOW | skills/last30days/SKILL.md | 430 | ## 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 | 502 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/instagram.py | 505 | # Step 3: Attach captions to items | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 473 | # Step 0: Creator reels (high-signal, runs first) | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 484 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/tiktok.py | 436 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 454 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 457 | # Step 3: Attach captions to items | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 465 | # Step 1: Fetch the watch page HTML | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 474 | # Step 2: Extract captions URL from ytInitialPlayerResponse | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 527 | # Step 3: Fetch the VTT subtitle file | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 965 | # Step 1: Multi-query search — run yt-dlp for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 983 | # Step 2: Fetch transcripts for top videos. | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1014 | # Step 3: Attach transcripts and extract highlights. Mark captions_disabled | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1203 | # Step 1: Search | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1261 | # Step 2: Fetch transcripts for top videos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_onboarding_contract.py | 30 | start = self.text.index("## Step 0: First-Run Setup Wizard") | 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/instagram.py | 502 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/instagram.py | 505 | # Step 3: Attach captions to items | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 473 | # Step 0: Creator reels (high-signal, runs first) | COMMENT |
| LOW | skills/last30days/scripts/lib/instagram.py | 484 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/tiktok.py | 436 | # Step 1: Multi-query keyword search — run ScrapeCreators for each expanded query | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 454 | # Step 2: Fetch captions for top N | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/tiktok.py | 457 | # Step 3: Attach captions to items | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 465 | # Step 1: Fetch the watch page HTML | COMMENT |
| LOW⚡ | skills/last30days/scripts/lib/youtube_yt.py | 474 | # Step 2: Extract captions URL from ytInitialPlayerResponse | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 527 | # Step 3: Fetch the VTT subtitle file | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 965 | # Step 1: Multi-query search — run yt-dlp for each expanded query | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 983 | # Step 2: Fetch transcripts for top videos. | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1014 | # Step 3: Attach transcripts and extract highlights. Mark captions_disabled | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1203 | # Step 1: Search | COMMENT |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 1261 | # Step 2: Fetch transcripts for top videos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | skills/last30days/scripts/lib/subproc.py | 37 | Run a subprocess with process-group cleanup on timeout. Spawns ``cmd`` inside its own process group via ``os.setsid | STRING |
| HIGH | skills/last30days/scripts/lib/http.py | 531 | 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 | 743 | Fetch a URL and return decoded text, or None on any failure. Keyless helper for Reddit RSS and shreddit HTML endpoi | 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 |
|---|---|---|---|---|
| HIGH | tests/test_techmeme_source.py | 128 | """Non-string date values (int/null) are treated as undated and kept; | STRING |
| HIGH | tests/test_check_config_memory_dir.py | 97 | # Either mkdir silently failed (2>/dev/null) or it succeeded under a permissive | COMMENT |
| HIGH | skills/last30days/scripts/lib/health.py | 154 | "nvm": ("nvm install --lts", "reinstall node via nvm: nvm install --lts && nvm use --lts"), | CODE |
| HIGH | skills/last30days/scripts/lib/backends.py | 272 | prescription="npm install -g xurl && xurl auth oauth2 login", | CODE |
| HIGH | skills/last30days/scripts/lib/youtube_yt.py | 557 | f'-o "$TMPD/%(id)s" {quoted_url} >/dev/null 2>&1 || true; ' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 525 | - **`--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_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/SKILL.md | 957 | - Stdout shows a merged comparison with the `## Head-to-Head` scaffold + per-entity Resolved Entities block. | CODE |
| MEDIUM | skills/last30days/scripts/lib/render.py | 1127 | # Reuse the existing comparison scaffold by feeding it the synthesized | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/render.py | 1128 | # topic. _parse_comparison_entities splits on " vs " so the scaffold | COMMENT |
| MEDIUM | skills/last30days/scripts/lib/bird_x.py | 372 | # Build OR-group query: ("multi-agent" OR "agent simulation") since:DATE | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CONFIGURATION.md | 161 | **Example `.env` skeleton** (placeholders only - replace with your own values): | COMMENT |
| LOW | CONFIGURATION.md | 181 | 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 | // MinPythonVersion mirrors the engine's MIN_PYTHON constant in | COMMENT |
| LOW | mcp/internal/engine/extract.go | 21 | COMMENT | |
| LOW | .github/workflows/osv-scanner.yml | 1 | name: OSV-Scanner | COMMENT |
| LOW | skills/last30days/SKILL.md | 961 | # SKILL_DIR = absolute path of the directory containing THIS SKILL.md you just Read. | 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/last30days.py | 2641 | "x_error": report.errors_by_source.get("x"), | 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 | # Local auth evidence (doctor / safe-diagnose path — no subprocess, no | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 121 | # function of the post's engagement percentile *within the run's X pool* (so it | COMMENT |
| LOW | skills/last30days/scripts/lib/rerank.py | 581 | + (candidate.freshness * 0.2) | COMMENT |
| LOW | skills/last30days/scripts/lib/hackernews.py | 101 | COMMENT | |
| LOW | skills/last30days/scripts/lib/env.py | 41 | COMMENT | |
| LOW | skills/last30days/scripts/lib/env.py | 421 | if ignored_project_env_path: | COMMENT |
| LOW | skills/last30days/scripts/lib/env.py | 741 | return 'scrapecreators' | COMMENT |
| LOW | skills/last30days/scripts/lib/health.py | 101 | if proc.returncode in (126, 127): | COMMENT |
| LOW | skills/last30days/scripts/lib/cjk.py | 41 | "没有", "看", "好", "自己", "这", "那", "这个", "那个", "什么", "怎么", | COMMENT |
| LOW | skills/last30days/scripts/lib/quality_nudge.py | 201 | # Active means yt-dlp is installed and search did not error at the top | 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 | 761 | # absent, or corrupt — corruption is treated as absence, never a crash. | COMMENT |
| 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 | 596 | # Hebrew-language topics: elevate web search (grounding) to the front of | STRING |
| MEDIUM | skills/last30days/scripts/lib/bird_x.py | 198 | """Get comprehensive Bird search status. | STRING |
| MEDIUM | skills/last30days/scripts/lib/pipeline.py | 1769 | # eval harness stays fully offline: this path calls the GitHub API (and the | COMMENT |
| MEDIUM⚡ | skills/last30days/scripts/lib/github.py | 841 | # Project-mode search: fetch comprehensive data for specific repos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skills/last30days/scripts/lib/env.py | 163 | # 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 | 363 | # Check if we got results | COMMENT |
| LOW | skills/last30days/scripts/lib/quality_nudge.py | 219 | # 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 | 21 | CODE | |
| LOW | skills/last30days/scripts/lib/ui.py | 400 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 856 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 1230 | CODE | |
| LOW | skills/last30days/scripts/lib/pipeline.py | 2850 | CODE | |
| LOW | skills/last30days/scripts/lib/doctor.py | 138 | 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 | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | skills/last30days/scripts/lib/cookie_extract.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | skills/last30days/scripts/lib/chrome_cookies.py | 24 | 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 | 2676 | # Create a retry subquery with the simplified core subject | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_youtube_yt.py | 235 | "Don't forget to subscribe and hit the bell. " | CODE |
| LOW | skills/last30days/scripts/lib/youtube_yt.py | 108 | r"^(hey |hi |what's up|welcome back|in today's video|don't forget to)", | CODE |