AI Slop Code RIsk Monitor

simonw/llm

Access large language models from the command-line

15.0 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for simonw/llm, a Python project with 12,604 GitHub stars. SynthScan examined 52,319 lines of code across 111 source files, recording 848 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 15.0 (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.

15.0
Adjusted Signal
15.0
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
12.6K
Stars
Python
Language
52.3K
Lines of Code
111
Files
848
Pattern Hits
2026-10-12
Scan Date
0.14
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 47.1/100 · MEDIUM

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

Hallucinated Dependency & Supply Chain Risk 6.6/100 · LOW

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

Agent Over-Engineering Ratio 46.1/100 · MEDIUM

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

PR Review Velocity Impact 59.4/100 · HIGH

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

What These Metrics Mean

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

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

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

CRITICAL 0HIGH 15MEDIUM 10LOW 823

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 848 distinct pattern matches across 14 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 Identifiers713 hits · 585 pts
SeverityFileLineSnippetContext
LOW⚡llm/hookspecs.py18def register_embedding_models(register):CODE
LOW⚡llm/hookspecs.py23def register_template_loaders(register):CODE
LOW⚡llm/hookspecs.py28def register_fragment_loaders(register):CODE
LOWllm/models.py260def _get_arguments_input_schema(function, name):CODE
LOWllm/models.py289def _implementation_arguments(tool: "Tool", tool_call: "ToolCall") -> dict:CODE
LOWllm/models.py2736def _append_tool_results_to_chain(chain, tool_results, attachments) -> list[Any]:CODE
LOWllm/models.py2789def _trailing_pending_tool_calls(messages) -> list[ToolCall]:CODE
LOWllm/models.py3246 def supported_server_side_tools(self) -> tuple[type[ServerSideTool], ...]:CODE
LOWllm/models.py3681def _remove_titles_recursively(obj):CODE
LOWllm/__init__.py239def get_embedding_models_with_aliases() -> list["EmbeddingModelWithAliases"]:CODE
LOWllm/__init__.py281def get_embedding_model_aliases() -> dict[str, EmbeddingModel]:CODE
LOWllm/__init__.py503def get_default_embedding_model():CODE
LOWllm/__init__.py507def set_default_embedding_model(model):CODE
LOWllm/embeddings.py183 def embed_multi_with_metadata(CODE
LOWllm/cli.py122async def display_async_stream_events(events, *, show_reasoning=True):CODE
LOWllm/cli.py299def process_fragments_in_chat(CODE
LOWllm/cli.py388def resolve_attachment_with_type(value: str, mimetype: str) -> Attachment:CODE
LOWllm/cli.py404def attachment_types_callback(ctx, param, values) -> list[Attachment]:CODE
LOWllm/cli.py439def _merge_template_attachments(template, attachments, attachment_types):CODE
LOWllm/cli.py1769def logs_json_for_response_ids(db, ids):STRING
LOWllm/cli.py2071 def _format_tool_call_arguments(arguments):STRING
LOWllm/cli.py2409def model_matches_id_or_alias(model_with_aliases, model_ids):STRING
LOWllm/cli.py2416def render_model_with_aliases(STRING
LOWllm/cli.py2484def render_model_with_options(model_id, *, async_=False):STRING
LOWllm/utils.py181def extract_fenced_code_block(text: str, last: bool = False) -> str | None:CODE
LOWllm/logs.py1062def _needs_model_replacements(condensed: str) -> bool:STRING
LOWllm/logs.py1665def _instances_by_tool_call_id(CODE
LOWllm/default_plugins/openai_models.py452def register_embedding_models(register):CODE
LOWllm/default_plugins/openai_models.py1860 def supported_server_side_tools(self):CODE
LOWllm/default_plugins/openai_models.py2147 def _finalize_responses_kwargs(self, prompt, stream, instructions=None):CODE
LOWllm/default_plugins/openai_models.py2180 def _reasoning_text_from_item(self, item):CODE
LOWllm/default_plugins/openai_models.py2225 def _reasoning_refresh_events(self, response_json, done_events):CODE
LOWllm/default_plugins/openai_models.py2356 def _refresh_server_tool_events(self, output, done_events):CODE
LOWllm/default_plugins/openai_models.py2381 def _non_streaming_output_events(CODE
LOWtests/test_cli_openai_models.py48def test_openai_options_min_max():CODE
LOWtests/test_cli_openai_models.py107def test_deprecated_models_are_not_registered(model_id):CODE
LOWtests/test_cli_openai_models.py216def test_code_interpreter_cli_tool_is_resolved_from_model(httpx2_mock):CODE
LOWtests/test_cli_openai_models.py273def test_code_interpreter_cli_tool_is_reused_on_continue(CODE
LOWtests/test_cli_openai_models.py396def test_web_search_cli_tool_is_resolved_from_model(httpx2_mock):CODE
LOWtests/test_cli_openai_models.py454def test_tools_list_for_model_includes_server_side_tools():CODE
LOWtests/test_cli_openai_models.py486def test_tools_list_for_model_with_no_server_side_tools():CODE
LOWtests/test_cli_openai_models.py497def test_tools_list_rejects_unknown_model():CODE
LOWtests/test_cli_openai_models.py521def test_openai_image_detail_option_description(model_id, expected_description):CODE
LOWtests/test_cli_openai_models.py526def test_openai_image_detail_option_is_sent_on_image_attachments(httpx2_mock):CODE
LOWtests/test_cli_openai_models.py673def test_openai_image_detail_original_is_rejected_for_other_models():CODE
LOWtests/test_async_parity.py17def test_echo_registered_for_both():CODE
LOWtests/test_async_parity.py26async def test_async_to_dict_captures_chain_and_output():CODE
LOWtests/test_async_parity.py40async def test_async_to_dict_raises_before_awaited():CODE
LOWtests/test_async_parity.py48async def test_async_from_dict_rehydrates():CODE
LOWtests/test_async_parity.py66async def test_async_from_dict_then_reply_continues():CODE
LOWtests/test_async_parity.py90async def test_async_from_row_response_messages_synthesized(db_factory, tmp_path):CODE
LOWtests/test_async_parity.py135async def test_async_load_conversation_follow_up_preserves_chain(db_factory, tmp_path):CODE
LOWtests/test_async_parity.py186async def test_sync_and_async_produce_identical_chain():CODE
LOWtests/test_async_parity.py205async def test_async_chain_tool_result_turn_has_full_chain():CODE
LOWtests/test_async_parity.py244async def test_astream_events_matches_stream_events_for_text_only():CODE
LOWtests/test_async_parity.py274async def test_async_from_dict_model_override():CODE
LOWtests/test_async_parity.py286def test_sync_from_dict_model_override():CODE
LOWtests/test_async_parity.py298async def test_async_to_dict_preserves_datetime():CODE
LOWtests/test_async_parity.py308async def test_async_to_dict_preserves_usage_when_set(async_mock_model):CODE
LOWtests/test_async_parity.py326async def test_async_reply_messages_kwarg_appends():CODE
653 more matches not shown…
Cross-Language Confusion7 hits · 41 pts
SeverityFileLineSnippetContext
HIGHllm/utils.py702 if re.match(r'\s*(["\[\d\-]|true|false|null)', arg_body, re.IGNORECASE):CODE
HIGHllm/logs.py1111 where json_extract(je.value, '$.literal') is not null)CODE
HIGHllm/migrations.py676 and p2.tool_name is not null) as toolsCODE
HIGH⚡tests/test_llm_logs.py1450 """When reasoning is empty/null, no heading appears (existingSTRING
HIGH⚡tests/test_plugins.py479 '[{"id": ID, "tool_id": 1, "name": "upper", "output": "ONE", "tool_call_id": "tc_TCID", "exception": nulCODE
HIGH⚡tests/test_plugins.py484 '[{"id": ID, "tool_id": 1, "name": "upper", "output": "TWO", "tool_call_id": "tc_TCID", "exception": nulCODE
HIGH⚡tests/test_plugins.py492 '[{"id": ID, "tool_id": 1, "name": "upper", "output": "THREE", "tool_call_id": "tc_TCID", "exception": nCODE
Deep Nesting40 hits · 32 pts
SeverityFileLineSnippetContext
LOWllm/plugins.py23CODE
LOWllm/models.py604CODE
LOWllm/models.py104CODE
LOWllm/models.py1319CODE
LOWllm/models.py1887CODE
LOWllm/models.py2247CODE
LOWllm/models.py3038CODE
LOWllm/cli.py136CODE
LOWllm/cli.py228CODE
LOWllm/cli.py685CODE
LOWllm/cli.py1415CODE
LOWllm/cli.py1688CODE
LOWllm/cli.py1883CODE
LOWllm/cli.py2832CODE
LOWllm/cli.py3386CODE
LOWllm/cli.py3529CODE
LOWllm/cli.py3727CODE
LOWllm/cli.py2104CODE
LOWllm/cli.py3623CODE
LOWllm/utils.py76CODE
LOWllm/utils.py314CODE
LOWllm/utils.py588CODE
LOWllm/logs.py85CODE
LOWllm/logs.py896CODE
LOWllm/parts.py253CODE
LOWllm/default_plugins/openai_models.py514CODE
LOWllm/default_plugins/openai_models.py3070CODE
LOWllm/default_plugins/openai_models.py605CODE
LOWllm/default_plugins/openai_models.py1240CODE
LOWllm/default_plugins/openai_models.py1412CODE
LOWllm/default_plugins/openai_models.py1530CODE
LOWllm/default_plugins/openai_models.py1773CODE
LOWllm/default_plugins/openai_models.py1954CODE
LOWllm/default_plugins/openai_models.py2066CODE
LOWllm/default_plugins/openai_models.py2264CODE
LOWllm/default_plugins/openai_models.py2381CODE
LOWllm/default_plugins/openai_models.py2513CODE
LOWllm/default_plugins/openai_models.py2757CODE
LOWtests/test_llm.py1046CODE
LOWtests/test_templates.py511CODE
Empty Error Handlers6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHllm/__init__.py339except UnknownModelError:CODE
HIGHllm/__init__.py360except UnknownModelError:CODE
HIGHllm/cli.py1495except KeyError:CODE
HIGHllm/cli.py2028except ValueError:CODE
HIGHllm/cli.py2350except ValueError:CODE
HIGHllm/utils.py291except ValueError:CODE
Unused Imports27 hits · 20 pts
SeverityFileLineSnippetContext
LOWllm/__init__.py11CODE
LOWllm/__init__.py12CODE
LOWllm/__init__.py12CODE
LOWllm/__init__.py12CODE
LOWllm/__init__.py17CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py18CODE
LOWllm/__init__.py43CODE
LOWllm/__init__.py43CODE
LOWllm/__init__.py43CODE
LOWllm/__init__.py43CODE
LOWllm/__init__.py43CODE
LOWllm/__init__.py52CODE
LOWtests/test_options_parameter.py112CODE
Excessive Try-Catch Wrapping15 hits · 15 pts
SeverityFileLineSnippetContext
LOWllm/models.py1988 except Exception as ex: # noqa: BLE001CODE
LOWllm/models.py2321 except Exception as ex: # noqa: BLE001CODE
LOWllm/models.py2376 except Exception as ex: # noqa: BLE001CODE
LOWllm/models.py2420 except Exception as ex: # noqa: BLE001CODE
LOWllm/models.py2444 except Exception as ex: # noqa: BLE001CODE
LOWllm/models.py2462 except Exception as ex: # noqa: BLE001CODE
MEDIUMllm/cli.py381def convert(self, value, param, ctx):CODE
LOWllm/cli.py282 except Exception as ex: # noqa: BLE001CODE
LOWllm/cli.py1142 except Exception as ex:CODE
LOWllm/cli.py4263 except Exception as ex: # noqa: BLE001CODE
LOWllm/cli.py1668 except Exception as ex: # noqa: BLE001STRING
LOWllm/default_plugins/openai_models.py853 except Exception as ex:CODE
LOWllm/default_plugins/openai_models.py2216 except Exception: # noqa: BLE001CODE
LOWdocs/plugins/plugin-hooks.md221 except Exception as e:CODE
LOWdocs/plugins/plugin-hooks.md271 except Exception as ex:CODE
Modern AI Meta-Vocabulary5 hits · 14 pts
SeverityFileLineSnippetContext
MEDIUMllm/__init__.py444 # Try to resolve it to an embedding modelCOMMENT
MEDIUMtests/test_embed_cli.py179 # --key should be passed through to the embedding modelCOMMENT
MEDIUMtests/test_embed_cli.py200 # --key should be passed through to the embedding model for embed-multi tooCOMMENT
MEDIUMtests/test_openai_responses.py1269 # item, otherwise the model loses its chain of thought.COMMENT
MEDIUMdocs/embeddings/python-api.md50To work with embeddings in this way you will need an instance of a [sqlite-utils Database](https://sqlite-utils.datasettCODE
AI Structural Patterns15 hits · 12 pts
SeverityFileLineSnippetContext
LOWllm/models.py493CODE
LOWllm/models.py823CODE
LOWllm/models.py877CODE
LOWllm/models.py956CODE
LOWllm/models.py1010CODE
LOWllm/models.py3293CODE
LOWllm/models.py3340CODE
LOWllm/models.py3419CODE
LOWllm/models.py3465CODE
LOWllm/logs.py1391CODE
LOWllm/logs.py1734CODE
LOWllm/default_plugins/openai_models.py1173CODE
LOWllm/default_plugins/openai_models.py1678CODE
LOWllm/default_plugins/openai_models.py2455CODE
LOWllm/default_plugins/openai_models.py2701CODE
Magic Placeholder Names2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHREADME.md84Add `--key your-api-key` if the endpoint requires authentication. See [Run against an endpoint without configuring it](hCODE
HIGHdocs/index.md52Add `--key your-api-key` if the endpoint requires authentication. See {ref}`Run against an endpoint without configuring CODE
Self-Referential Comments4 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUMllm/cli.py4005 # Create a test Options object to validateSTRING
MEDIUMtests/test_templates.py162 # Create a file to test attachmentCOMMENT
MEDIUMtests/test_chat_templates.py38 # Create a system fragment fileCOMMENT
MEDIUMdocs/conf.py28# This file is execfile()d with the current directory set to itsCOMMENT
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippetContext
LOWllm/cli.py3664 # Read the file twice - first time is to get a countCOMMENT
LOWllm/utils.py379 # Check if the schema is newline-separated or comma-separatedCOMMENT
LOWtests/test_utils.py466 # Check if the correct number of backticks is usedCOMMENT
LOW.github/workflows/stable-docs.yml52 # Check if the list of files is non-emptyCOMMENT
Over-Commented Block5 hits · 5 pts
SeverityFileLineSnippetContext
LOWllm/models.py1141 # truth for replay and for assembling response.messages.COMMENT
LOWllm/logs.py861def _load(value: str | None) -> dict | None:COMMENT
LOWllm/migrations.py721 # only while sorted by path.COMMENT
LOWdocs/conf.py21 node.replace_self(replacement)COMMENT
LOWdocs/conf.py141COMMENT
Modern Structural Boilerplate4 hits · 4 pts
SeverityFileLineSnippetContext
LOWllm/__init__.py54__all__ = [CODE
LOWllm/cli.py4166def set_model_option(model_id: str, key: str, value: Any) -> None:CODE
LOWllm/logs.py45__all__ = [CODE
LOWllm/serialization.py41__all__ = [CODE
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWllm/utils.py107 def handle_request(self, request: httpx2.Request) -> httpx2.Response:CODE