Skill selection with Jev

SkillDev tools

Lets your agent pick the right installed skill for a request, or none, by ranking the whole skill catalog.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Skill selection with Jev skill

About this capability

Use when unsure which of many installed skills applies to a request, if any, or when asked to make skill loading cheaper or more accurate. Jev ranks the whole catalog and may say no skill is needed.

What this skill tells your AI

The instructions your AI receives, as published by kerpopule/hermes-jev-skills in skills/jev-skill-select/SKILL.md and read by ahel’s review.

Two round trips, about 1.1 s — but not two requests. The first round trip ranks every skill against the turn: the catalog is cut into batches of 120 that are asked side by side, so a 377-skill catalog is four requests sent at once and a 960-skill one is eight, all landing in the time of the slowest (both measured at 1.0 to 1.2 s for the pair of round trips). The second round trip is one request: it reads the top five properly, judges each on its own, and may reject them all. Wall clock and billed requests are not the same number, and it is the requests you pay for: reckon on ceil(skills / 120) + 1 per turn that reaches Jev. A turn that nothing in the catalog comes close to ends after the first request, about 0.7 s. Small talk and ordinary turns come back with no skill. Reading the skill folders is extra: about 0.15 s for 460 skills.

Acknowledgements never leave the machine. "ok", "thanks, that worked", "got it", "never mind", "yes go ahead", a bare "stop" and turns that are only punctuation or emoji are answered locally in 0 ms. That gate is deliberately narrow. Anything with a question mark, an instruction however short ("do it", "stop it", "do all of them now"), a number, or a word the gate cannot read is sent to Jev, and that includes every request written in a non-Latin script. A wrong ask costs a fraction of a cent; a wrong skip makes the feature quietly do nothing.

On Hermes

/jev skills on makes the hermes-jev plugin do this once per fresh turn. When a skill clearly fits, a one-line suggestion is attached to the turn naming it; load it with skill_view unless it plainly does not apply. It asks Hermes which folders this session actually loads — the profile's skills folder and every skills.external_dirs folder — and it respects skills.disabled. Project-local skill folders are not read.

The suggestion is then checked against Hermes's own loader before it is made: a name that skill_view cannot open in this session is never offered, and the name offered is the one the loader answers to. So you will not be sent to a procedure you do not have — which matters on a profile whose catalog is smaller than the one Jev was ranking, and on a machine where a skill was never installed. Unverifiable means silent, because a suggestion is never worth a call that fails.

Asking directly (any agent)

jev pick-skill --turn "<the request>"            # searches Hermes, Claude Code, Codex and ./skills folders
jev pick-skill --turn "..." --root ~/my/skills   # or name the folders; repeat --root for each one

--root replaces the default folders, so name every folder you want searched. From Python, skillpick.discover_roots(hermes_home) returns the folders Hermes reads, shared ones included, ready to pass to skillpick.discover().

The reply

{"status": "ok", "needs_skill": 0.78, "skills": [{"name": "xlsx", "path": ".../xlsx/SKILL.md", "match": 0.72}], "latency_ms": 1143}

needs_skill (0–1) and up to three {name, path, match}, best first. Load the first one whose match is 0.5 or more. An empty list means proceed without a skill; do not go hunting for one.

Three other shapes, all with an empty skills list:

ReplyMeaningWhat to do
{"status": "ok", "needs_skill": 0.0, "skills": [], "latency_ms": 0, "skipped": "trivial"}Answered locally; Jev was not askedProceed without a skill
{"status": "ok", "needs_skill": 0.0, "skills": [], "latency_ms": 663}Jev ranked the catalog and nothing came close, so there was no second requestProceed without a skill
{"status": "fail_open", "reason": "...", "skills": []}Jev was not asked or did not answer: outage, no skills found, or the turn looked like it held a secretProceed as if this skill did not exist. This is not a "no skill needed" verdict

skills_dropped appears on any of them when the catalog is over the 960-skill cap. It is how many skills, the last ones found, were never ranked, so "no skill fits" does not cover them. Their names are logged once per process. Disable skills you do not use to get back under the cap.

Notes

  • It reads only each skill's name and description from its front matter, and only the first 200 characters of the description, so a skill with a vague or long-winded description will not be found. Fix the description, not the threshold.
  • When two folders hold a skill of the same name, the first folder searched wins. On Hermes that is the profile's own folder.
  • The turn is redacted before sending; a turn that looks like it holds a secret is not sent, and you get fail_open with an empty list.
  • If any one batch fails, the whole pick fails open. A partial ranking would say "no skill" with confidence whenever the right skill sat in the batch that was lost.
  • A suggestion is advice. If the loaded skill does not match the task once you read it, drop it and carry on.

Signals

GitHub stars
404
Forks
36
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
jev-skill-select
Source
github.com/kerpopule/hermes-jev-skills