AI Slop Code RIsk Monitor

apurvsinghgautam/robin

AI-Powered Dark Web OSINT Tool

28.5 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for apurvsinghgautam/robin, a Python project with 7,506 GitHub stars. SynthScan examined 14,600 lines of code across 45 source files, recording 379 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 28.5 (Elevated pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

28.5
Adjusted Signal
28.5
Raw Pattern Score
100%
Time Factor
2026-10-03
Last Push
7.5K
Stars
Python
Language
14.6K
Lines of Code
45
Files
379
Pattern Hits
2026-10-12
Scan Date
0.16
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 67.8/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 2.5/100 · LOW

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

Agent Over-Engineering Ratio 73.6/100 · HIGH

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

PR Review Velocity Impact 76.6/100 · CRITICAL

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

What These Metrics Mean

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

Pattern-Signal History

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 0HIGH 7MEDIUM 5LOW 367

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

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

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers305 hits · 308 pts
SeverityFileLineSnippetContext
LOWui.py443def _render_investigation_body(inv):CODE
LOWui.py472def _followup_history_messages(chat_history, max_turns=5):CODE
LOWsearch.py164def fetch_search_results_detailed(endpoint, query):CODE
LOWsearch.py342def get_search_results_detailed(refined_query, max_workers=5, per_host_limit=None):CODE
LOWmcp_server.py911def _read_saved_investigation(directory: Path, filename: str) -> Optional[str]:CODE
LOWmcp_server.py1661 async def robin_list_investigations(limit: Annotated[int, Field(ge=1, le=200)] = 20) -> str:CODE
LOW⚡tests/test_model_smoke.py26 def test_real_stages_pass_the_grounded_fixture(self):CODE
LOW⚡tests/test_model_smoke.py32 def test_invented_artifacts_and_padded_selections_fail_the_fixture(self):CODE
LOW⚡tests/test_model_smoke.py38 def test_repeating_identifiers_in_the_query_is_not_artifact_extraction(self):CODE
LOWtests/test_model_compatibility.py50 def test_openai_and_gateway_requests_omit_sampling(self):CODE
LOWtests/test_model_compatibility.py65 def test_claude_requests_omit_sampling(self):CODE
LOWtests/test_model_compatibility.py78 def test_gemini_requests_omit_sampling_for_current_models(self):CODE
LOWtests/test_model_compatibility.py92 def test_mistral_retains_the_clients_documented_sampling_default(self):CODE
LOWtests/test_model_compatibility.py100 def test_local_and_custom_requests_preserve_server_defaults(self):CODE
LOWtests/test_model_compatibility.py136 def test_modern_content_blocks_and_local_thinking_prefixes(self):CODE
LOWtests/test_model_compatibility.py152 def test_health_checks_accept_answer_blocks_but_reject_reasoning_only(self):CODE
LOWtests/test_model_compatibility.py165 def test_streams_exclude_reasoning_even_when_tags_span_tokens(self):CODE
LOWtests/test_packaging.py56 def test_secrets_and_case_data_stay_out_and_the_example_env_and_logo_ship(self):CODE
LOWtests/test_packaging.py67 def test_the_dockerfile_labels_the_server_and_pre_creates_robin_owned_directories(self):CODE
LOWtests/test_packaging.py82 def test_every_echo_goes_to_stderr(self):CODE
LOWtests/test_packaging.py90 def test_tor_and_the_model_warm_up_write_to_stderr_in_the_background(self):CODE
LOWtests/test_packaging.py102 def test_requirements_pins_mcp_to_an_exact_version(self):CODE
LOWtests/test_packaging.py105 def test_server_json_is_publishable_and_mounts_the_volume(self):CODE
LOWtests/test_llm.py30 def test_a_label_is_dropped_before_the_indices_are_read(self):CODE
LOWtests/test_llm.py42 def test_list_markers_are_not_indices_and_real_ranges_expand(self):CODE
LOWtests/test_llm.py58 def test_llm_uses_the_prompt_modules_own_objects(self):CODE
LOWtests/test_llm.py66 def test_every_preset_has_a_prompt_a_persona_and_a_sidebar_label(self):CODE
LOWtests/test_llm.py78 def test_each_prompt_keeps_its_substitution_points_and_grounding_rule(self):CODE
LOWtests/test_llm.py107 def test_the_streaming_handler_hands_every_chunk_to_the_ui_and_none_to_stdout(self):CODE
LOWtests/test_llm.py122 def test_the_filters_rate_limit_retry_logs_rather_than_prints(self):CODE
LOWtests/test_llm.py146 def test_a_verbose_registry_refresh_reports_on_stderr_only(self):CODE
LOWtests/test_llm.py177 def test_the_ui_filter_is_the_detailed_selection(self):CODE
LOWtests/test_llm.py190 def test_the_detailed_variant_reports_the_reply_and_reads_long_ranges(self):CODE
LOWtests/test_llm.py204 def test_a_lost_identifier_or_empty_answer_keeps_the_original_query(self):CODE
LOWtests/test_llm.py220 def test_an_answer_that_keeps_identifiers_is_used_verbatim(self):CODE
LOWtests/test_llm.py240 def test_every_stage_preserves_the_final_answer(self):CODE
LOWtests/test_search.py54 def test_each_host_keeps_only_its_first_three_results(self):CODE
LOW⚡tests/test_search.py66 def test_a_tracker_tagged_duplicate_does_not_use_up_the_cap(self):CODE
LOW⚡tests/test_search.py72 def test_results_are_link_and_title_dicts(self):CODE
LOW⚡tests/test_search.py80 def test_each_engine_reports_whether_it_answered_came_back_empty_or_failed(self):CODE
LOWtests/test_search.py98 def test_result_counts_show_what_dedup_and_the_cap_removed(self):CODE
LOWtests/test_search.py116 def test_abuse_results_are_dropped_before_anything_else_and_counted(self):CODE
LOWtests/test_search.py138 def test_plus_and_ampersand_reach_the_engine_verbatim(self):CODE
LOWtests/test_search.py154 def test_redirect_wrappers_are_unwrapped_and_engine_navigation_dropped(self):CODE
LOWtests/test_search.py171 def test_anchor_text_is_scrubbed_and_navigation_dropped(self):CODE
LOWtests/test_search.py237 def test_a_dead_engine_costs_one_attempt(self):CODE
LOWtests/test_search.py253 def test_the_slowest_engine_still_counts(self):CODE
LOWtests/test_mcp_investigate.py40 def test_a_host_that_samples_runs_it_on_its_own_model(self):CODE
LOWtests/test_mcp_investigate.py48 def test_the_sampling_client_reaches_the_host(self):CODE
LOWtests/test_mcp_investigate.py61 def test_without_sampling_a_configured_model_runs_it(self):CODE
LOWtests/test_mcp_investigate.py75 def test_with_no_model_it_points_at_the_tools_path(self):CODE
LOWtests/test_mcp_investigate.py85 def test_a_failed_run_is_a_status_with_the_providers_words_fenced(self):CODE
LOWtests/test_mcp_investigate.py105 def test_each_unfinished_status_is_reported_as_itself(self):CODE
LOWtests/test_mcp_investigate.py122 def test_an_engine_outage_in_the_real_pipeline_is_reported_as_one(self):CODE
LOWtests/test_mcp_investigate.py135 def test_every_pipeline_status_is_allowed_through(self):CODE
LOWtests/test_mcp_investigate.py148 def test_the_report_and_pivots_are_fenced_as_model_output(self):CODE
LOWtests/test_mcp_investigate.py164 def test_run_details_and_model_names_are_fenced_on_every_status(self):CODE
LOWtests/test_mcp_investigate.py176 def test_nothing_readable_hands_back_the_kept_links_fenced(self):CODE
LOWtests/test_mcp_investigate.py184 def test_a_long_report_is_trimmed_for_a_capped_client(self):CODE
LOWtests/test_mcp_investigate.py212 def test_a_finished_run_is_saved_once_with_what_robin_measured(self):CODE
245 more matches not shown…
Excessive Try-Catch Wrapping40 hits · 44 pts
SeverityFileLineSnippetContext
LOWhealth.py25 except Exception as e:CODE
LOWhealth.py91 except Exception as e:CODE
LOWhealth.py125 except Exception as e:CODE
LOWui.py173 except Exception:CODE
LOWui.py548 except Exception as e:CODE
LOWllm.py454 except Exception as e:CODE
LOWllm.py467 except Exception:CODE
LOWllm_utils.py175 except Exception as exc: # noqa: BLE001 - never let the picker hard-failCODE
LOWpipeline.py71 except Exception:CODE
LOWpipeline.py192 except Exception as exc:CODE
LOWpipeline.py199 except Exception as exc:CODE
LOWpipeline.py210 except Exception as exc:CODE
LOWpipeline.py226 except Exception as exc:CODE
LOWpipeline.py245 except Exception as exc:CODE
LOWpipeline.py266 except Exception as exc:CODE
LOWpipeline.py283 except Exception as exc:CODE
LOWsearch.py208 except Exception:CODE
LOWsearch.py212 except Exception as exc:CODE
LOWsearch.py246 except Exception:CODE
LOWsearch.py305 except Exception:CODE
LOWsearch.py360 except Exception as exc: # A worker that died is a failed engine.CODE
MEDIUMsearch.py243def _result_host(link):CODE
LOWmodel_registry.py513 except Exception as exc: # noqa: BLE001 - any failure falls back a layerCODE
LOWscrape.py138 except Exception:CODE
LOWscrape.py627 except Exception as exc:CODE
LOWscrape.py680 except Exception as exc:CODE
MEDIUMscrape.py220def _codec(name):CODE
LOWmcp_server.py812 except Exception:CODE
LOWmcp_server.py829 except Exception:CODE
LOWmcp_server.py1162 except Exception as exc: # a missing key or an unknown model nameCODE
LOWmcp_server.py1177 except Exception as exc:CODE
LOWmcp_server.py1227 except Exception as exc:CODE
LOWmcp_server.py1771 except Exception as exc:CODE
LOWmcp_server.py1829 except Exception as exc:CODE
LOWtests/test_mcp_saving.py357 except Exception as exc:CODE
LOWtests/model_smoke.py100 except Exception as exc:CODE
LOWtests/test_store.py122 except Exception as exc: # surfaced below, never swallowedCODE
MEDIUMtests/test_store.py118def worker(inv):CODE
MEDIUMtests/test_models.py539def write(providers):CODE
LOWtests/test_models.py542 except Exception as exc: # surfaced belowCODE
Empty Error Handlers6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHmodel_registry.py272except ValueError:CODE
HIGHmodel_registry.py464except OSError:CODE
HIGHscrape.py245except UnicodeDecodeError:CODE
HIGHscrape.py533except ValueError:CODE
HIGHmcp_server.py573except ValueError:CODE
HIGHtests/stubs.py150except OSError:CODE
Deep Nesting19 hits · 16 pts
SeverityFileLineSnippetContext
LOWhealth.py33CODE
LOWui.py29CODE
LOWui.py484CODE
LOWllm.py59CODE
LOWllm_utils.py416CODE
LOWsearch.py90CODE
LOWsearch.py164CODE
LOWmodel_registry.py468CODE
LOWscrape.py644CODE
LOWtests/test_model_compatibility.py100CODE
LOWtests/test_llm.py107CODE
LOWtests/test_llm.py122CODE
LOWtests/test_llm.py146CODE
LOWtests/test_mcp_investigate.py386CODE
LOWtests/test_mcp_tools.py872CODE
LOWtests/test_mcp_tools.py940CODE
LOWtests/test_mcp_saving.py77CODE
LOWtests/test_config.py117CODE
LOWtests/test_config.py199CODE
Magic Placeholder Names1 hit · 8 pts
SeverityFileLineSnippetContext
HIGH⚡tests/test_config.py41 for raw in ("your_ollama_url", "YOUR_API_KEY", '"your_key"', "", " ",CODE
Modern Structural Boilerplate4 hits · 4 pts
SeverityFileLineSnippetContext
LOWstore.py11logger = logging.getLogger(__name__)CODE
LOWpipeline.py29logger = logging.getLogger(__name__)CODE
LOWmodel_registry.py19logger = logging.getLogger(__name__)CODE
LOWmcp_server.py47logger = logging.getLogger(__name__)CODE
Modern AI Meta-Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMconfig.py20# Ollama applies its own context window rather than the model's full capability,COMMENT
AI Structural Patterns3 hits · 3 pts
SeverityFileLineSnippetContext
LOWpipeline.py151CODE
LOWmcp_server.py1010CODE
LOWmcp_server.py1411CODE