Skip to content
Back to skills

Jev Style Adopt

ASecurity

Find LLM API calls in a codebase that only return a decision (a category, yes/no, or a 1-5 rating) and move them to the local Jev-Style decision model safely - scan, pick candidates with the user, rewrite each as a typed noul/choice/score question with a confidence cascade back to the LLM, run in shadow mode, measure agreement with jev-style eval, then switch. Use when the user wants to cut LLM cost or latency for classification, routing, moderation, gating or scoring calls, or asks which LLM...

  • 12 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 26, 2026
ai-agentspythongoapi

Works with

  • cli
  • api

Security analysis

A92/100
  • mediumUses curl or wget to download content

Pro scans all 2 files and shows the line behind each finding

Scanned September 26, 2026

npx -y skills add lawrence3699/jev-style --skill jev-style-adopt --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Jev Style Adopt?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Jev Style Adopt
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lawrence3699-jev-style-adopt/badge)](https://www.skillsdirectory.com/skills/lawrence3699-jev-style-adopt)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: jev-style-adopt
description: Find LLM API calls in a codebase that only return a decision (a category, yes/no, or a 1-5 rating) and move them to the local Jev-Style decision model safely - scan, pick candidates with the user, rewrite each as a typed noul/choice/score question with a confidence cascade back to the LLM, run in shadow mode, measure agreement with jev-style eval, then switch. Use when the user wants to cut LLM cost or latency for classification, routing, moderation, gating or scoring calls, or asks which LLM calls a small local model could replace.
---

# Replace decision-only LLM calls with Jev-Style

Many codebases send a hosted LLM a prompt and then parse one word, a boolean or a number out of the
reply. Those calls pay for text generation to get a label. Jev-Style answers the same question
locally, in one forward pass, with a probability per option. This skill moves them over without
changing behaviour blindly: **scan -> choose -> rewrite with a cascade -> shadow -> measure -> switch**.

Never delete the LLM path in the first change. Every step below is reversible.

## 1. Scan

```sh
python3 <this-skill-dir>/scripts/find_decisions.py path/to/src --json /tmp/decision_calls.json
```

It lists LLM call sites whose prompt or parsing looks decision-shaped (classify / "yes or no" /
"respond with only" / rate 1-5 / enum or bool schemas / tiny `max_tokens` / `.strip().lower() == "yes"`)
with a guessed type. It is a heuristic: read every hit. Drop calls that need generated text, world
knowledge not in the input, multi-step math, or tool use.

## 2. Choose with the user

Show a short table: file:line, what it decides, guessed type, how often it runs (ask, or look for
loops/queues), and what a wrong answer costs. Recommend starting with one high-volume, low-risk call.
Confirm the server is running (`curl -s http://127.0.0.1:8765/healthz`; else the `jev-style-serve`
skill).

## 3. Translate the prompt into a typed question

| LLM prompt pattern | Jev-Style question |
|---|---|
| "Classify into one of A, B, C. Respond with only the name." | `choice`, criteria `{A: desc, B: desc, C: desc}` (add `other` if the prompt allowed none) |
| "Answer yes or no: does X ...?" / returns bool | `noul`, instructions = X as a **statement** ("The ticket asks for a refund."), optional `criteria.true/false` |
| "Rate 1 to 5" / "low, medium, high" | `score`, criteria = the levels, **lowest first**, with short descriptions |
| JSON with several such fields | one request, several questions about the same state |

Move instructions about *what to judge* into `instructions`/`criteria`; move the *input* into `state`
(text or a JSON object with named fields). Put facts the prompt made the LLM compute (totals, dates,
counts) into the state, computed in code.

## 4. Rewrite with a cascade and shadow logging

Keep the old function as `*_llm`. The new one asks Jev-Style first and falls back to the LLM when the
model is unsure or unreachable. While shadowing, it also calls the LLM and logs both answers in the
`jev-style eval` format. Python sketch (adapt to the codebase's language and HTTP client):

```python
import json, os, time, httpx

JEV_URL = os.environ.get("JEV_STYLE_URL", "http://127.0.0.1:8765")
SHADOW = os.environ.get("JEV_SHADOW_LOG")          # e.g. logs/route_shadow.jsonl while measuring
THRESHOLD = 0.60                                  # replace with the value jev-style eval recommends
TEAMS = {"billing": "charges, refunds, invoices", "shipping": "delivery, delays, lost parcels",
         "returns": "exchanges, wrong item", "account": "login, password, privacy"}

def route(ticket: str) -> str:
    q = {"type": "choice", "instructions": "Which team should handle this support ticket?", "criteria": TEAMS}
    try:
        a = httpx.post(f"{JEV_URL}/v1/systemone", json={"state": ticket, "questions": {"team": q}},
                       timeout=5).raise_for_status().json()["answers"]["team"]
    except Exception:
        return route_llm(ticket)                   # server down: old behaviour
    confident = max(a["probabilities"].values()) >= THRESHOLD
    if SHADOW:
        llm = route_llm(ticket)
        with open(SHADOW, "a") as f:
            f.write(json.dumps({"state": ticket, "questions": {"team": {**q, "label": llm}},
                                "jev": a, "ts": time.time()}) + "\n")
        return llm                                 # shadow mode: production keeps the LLM answer
    return a["choice"] if confident else route_llm(ticket)
```

Make sure the LLM label is one of the option names (normalise case/whitespace; map unknown replies to
`other` or skip the row; `jev-style eval` skips unreadable labels with a warning). Add a test that the new function returns the LLM result when the server is
unreachable.

## 5. Shadow, then measure

Turn shadow mode on (`JEV_SHADOW_LOG=...`) in staging or production for enough traffic: at least a few
hundred decisions per question. Then:

```sh
jev-style eval logs/route_shadow.jsonl --url http://127.0.0.1:8765
```

(`eval` ignores the extra `jev`/`ts` keys and re-asks the model, so the numbers reflect the current
server.) Read **agreement with the LLM** (`acc`) and `automate @1% / 5% / 10%`: the share of calls the
model can answer alone at that disagreement budget, and the confidence threshold for it. Agreement
with the LLM is not accuracy: if the user can label a sample by hand, evaluate on that too.

## 6. Switch, gradually

Set `THRESHOLD` to the threshold for the error budget the user accepts, turn shadow mode off, and ship.
Only calls above the threshold skip the LLM; the rest still use it. Report the expected share of LLM
calls saved (= the automation coverage) and keep the shadow log option for re-checking after prompt or
model changes. Never tune the threshold on the same rows you report as the final number.

Files in this skill

  • SKILL.md5.7 KB
  • scripts/find_decisions.py7.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.