llm-buster — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited llm-buster (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill when the user wants to know which LLM calls in an existing codebase are doing work a regex, parser, classifier, or lookup table could do for free. The skill is an audit tool, not a refactoring tool — it surfaces call sites, classifies the task, applies a rubric, proposes a deterministic replacement, and estimates impact. The user decides what to actually swap.
LLMs are paid wizards. They earn their keep when the input is open-ended, the output requires reasoning or generation, or the task surface is too broad to specify. They are wildly overused for tasks a 20-line parser would nail.
Three load-bearing consequences:
One block per call site, grouped 🟢 → 🟡 → 🔴. Example of a single finding (full template in references/report.md):
🟢 — `services/intent.py:42`
>
Task: classification (3 fixed labels:refund/shipping/other). Prompt is a system message listing the labels with 4 hardcoded few-shot examples; output is parsed withlabel = resp.choices[0].message.content.strip().lower().
>
Replacement:rapidfuzz.process.extractOne(text, LABELS, scorer=fuzz.token_set_ratio)with a 60-score floor, fallback to"other". ~15 lines.
>
Risks: loses ability to handle paraphrases the few-shots didn't cover ("money back" → refund). Mitigate by adding aliases to a dict, or shadow-mode for a week against the live LLM and grow the alias list from disagreements.>
Per-call cost: ~280 input + ~3 output tokens ongpt-4o-mini≈ \$0.00005.× requests/month = $TBD.
The audit ends with one closing line: "Want me to apply the 🟢 replacements?"
Activate on any of:
import openai, from anthropic, @anthropic-ai/sdk, openai (npm), or HTTP to api.openai.com / api.anthropic.com;litellm, google.genai / Vertex Gemini SDK, boto3 with bedrock-runtime, ollama. The skill still activates here but operates in detection-only mode for those providers — see references/detection.md § "Detection-only providers". Replacement recipes still target OpenAI/Anthropic call sites in the same repo;/llm-buster or names this skill.Do not activate for:
Before running grep, confirm you're actually looking at a project and not a one-shot scratch file. Check three things:
ls -la # is there a .git/ ? a pyproject.toml / package.json / Cargo.toml ?
find . -type f -not -path '*/\.*' | wc -l # how many tracked files?If the answer is "one loose .py file" or "no project metadata", abort the per-call report machinery and just inspect the file conversationally — a 200-line script doesn't need a verdict table, a per-file pivot, or a duplication pass. Tell the user: "This looks like a single script, not a project — I'll skip the audit format and just walk through the LLM calls inline. OK?"
From the project root. Two passes — the second is for the broader provider surface so the user sees their full LLM cost footprint (calls there enter detection-only mode — see next section).
# Pass 1 — in-scope: OpenAI + Anthropic SDKs and raw HTTP. Full replacement recipes apply.
rg -n --no-heading -e 'from openai' -e 'import openai' -e 'openai\.' \
-e 'from anthropic' -e 'import anthropic' -e 'anthropic\.' \
-e 'client\.chat\.completions\.create' -e 'client\.messages\.create' \
-e 'api\.openai\.com' -e 'api\.anthropic\.com' \
--glob '!**/node_modules/**' --glob '!**/.venv/**' --glob '!**/dist/**'
# TS/JS
rg -n --no-heading -e "from ['\"]openai['\"]" -e "from ['\"]@anthropic-ai/sdk['\"]" \
-e 'new OpenAI\(' -e 'new Anthropic\(' \
--glob '!**/node_modules/**' --glob '!**/dist/**'
# Pass 2 — detection-only: other providers and wrappers. Verdict rubric applies; no replacement recipes.
rg -n --no-heading \
-e 'import ollama' -e 'from ollama' -e 'ollama\.(chat|generate)\(' \
-e 'from litellm' -e 'litellm\.' \
-e 'from google import genai' -e 'google\.generativeai' -e 'from vertexai' -e 'GenerativeModel\(' -e 'generate_content\(' \
-e "boto3\.client\(['\"]bedrock-runtime" -e 'invoke_model\(' -e '\.converse\(' \
-e 'from langchain_(google_genai|aws|ollama|mistralai|cohere)' \
-e 'from llama_cpp' -e 'localhost:(11434|8000)/v1' \
--glob '!**/node_modules/**' --glob '!**/.venv/**' --glob '!**/dist/**'If rg is unavailable, grep -rn with the same patterns works. If pass 1 returns hits, you usually don't need to chase wrapper frameworks (LangChain ChatOpenAI, instructor, LiteLLM to OpenAI) — most projects also call the SDK directly somewhere. See references/detection.md for AST queries and the full wrapper pattern list when grep misses.
This produces the call-site list. Everything downstream operates on that list.
When pass 1 is empty but pass 2 has hits, the project is non-OpenAI/Anthropic (Gemini, Bedrock, Ollama, etc.). The audit still runs — same scope check, same per-call loop, same verdict rubric — but each finding omits the proposed replacement code block and instead writes:
Replacement recipe out of scope for this skill version (provider: `<gemini|bedrock|ollama|...>`); the rubric still applies and this call is a candidate for deterministic replacement using the same task category.
Also: do not report dollar savings for local runtimes (Ollama, vLLM, llama-cpp) — substitute "latency / GPU-time saved" qualitatively. See references/detection.md § "Detection-only providers" for the per-provider grep patterns and edge cases.
Load references on demand, not all up front:
pydantic, dateutil, rapidfuzz, sklearn TF-IDF + LogReg, email-validator, sentence-transformers). Load when writing the proposed replacement for a 🟢 or 🟡 call.For each call site found in inventory, run these five steps in order. Do not skip step 2.
response_format={"type":"json_object"} set? Is there a tools= / tool_choice= argument forcing a function call? Is the assistant text parsed with json.loads, a regex, or fed verbatim to a user? The contract tells you whether the call is structured (replaceable candidate) or freeform (probably not).Full table in references/rubric.md. Five verdict modes:
Decision shortcut for the colour rubric:
| Signal | Verdict |
|---|---|
| Fixed output schema + structured/semi-structured input + finite domain | 🟢 |
| Fixed schema but messy input (OCR, free-form chat, mixed languages) | 🟡 |
| Finite category set (≤ ~20 labels) + ≥100 labeled examples available | 🟡 |
| Deterministic sub-task buried inside an otherwise-LLM prompt (heuristic, pick-from-list, ratio bucketing) | 🟡 (sub-task extraction) |
| Prompt contains "explain", "summarize", "rephrase", "write", "answer the user's question" | 🔴 |
| Output is shown verbatim to a human end-user as natural language | 🔴 |
| Multi-step reasoning, chain-of-thought, or agentic tool-loop | 🔴 |
| Stateful conversation context required | 🔴 |
| Reasoning over free-form prose produced by another LLM upstream | 🔴 (hard — see H3 in references/rubric.md) |
When two rows fight, the harder verdict wins (i.e. 🔴 trumps 🟢). Structural verdicts (❌, 🔵) replace the colour, not extend it.
client.chat.completions.create calls can be 🟢 and 🔴 sitting in adjacent files.× requests/month = $TBD. Do not invent traffic.tiktoken for OpenAI models (pip install tiktoken, then encoding_for_model("gpt-4o-mini").encode(text)).client.messages.count_tokens(...) API for Anthropic models — costs nothing and returns exact counts.anthropic-tokenizer (TS) / gpt-tokenizer (TS) for JS projects without Python tooling.tokens: estimate pending — install tiktoken and proceed. Do not substitute len(text) / 4 or any other char-based heuristic; it's off by 30–60% on code and structured data and silently inflates the savings table.When the user asks "audit this project" or "is this LLM call necessary", produce the report from references/report.md:
N calls found across M files.file:line);If the project has > ~15 call sites, group by file rather than listing all inline, and offer to deep-dive a subset.
LLMChain(prompt=PromptTemplate(...)) and instructor's client.chat.completions.create(response_model=MyModel) both wrap the underlying call. Find the template / pydantic model — that's the spec. See references/detection.md.rg over .ipynb returns JSON-escaped fragments (" response = requests.post(...)\n"). Convert with jupyter nbconvert --to script or the stdlib snippet in references/detection.md before classifying.Evaluation_methods/, data_gen/, prepare_data/, or LLM-as-judge harnesses cannot be replaced with deterministic code by definition. Tag as ❌ and skip the colour rubric — see references/rubric.md § "❌ Out of scope".tools= or response_format={"type":"json_schema",...}), the model can return any JSON shape. Calls with a true schema are stronger 🟢 candidates than calls with just json_object.input → output examples is usually 🟢 — those examples _are_ the lookup table. Build a dict from the examples and pattern-match.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.