Agents with big skill rosters choose on almost no information: the roster arrives as an index โ€“ one truncated line per skill (Hermes cuts descriptions to 60 characters) โ€“ so the skill that edits .pptx files reads nearly the same as the one that authors them, and on turns where nothing fits, a list of names still invites a guess. TypeSafe's skill-suggestion cookbook fixes it with progressive disclosure: one cheap request ranks all 182 skills and asks whether the turn needs one at all; a second request re-reads only the top three in full detail and may reject all of them. The winner's name lands in a single line of the system prompt. This guide summarises the recipe and its measured results.

Why the baseline is bad

Measured over 488 requests against claude-haiku-4-5 (315 covered by exactly one skill, 173 covered by none, including 85 everyday requests and 46 near-misses written to punish guessing like "post this to Mastodon" on a roster covering X but not Mastodon), the agent alone with just its roster loads the wrong skill 16.8% of the time and loads one when nothing fits 9.8%. Of 36 wrong first picks, 10 came from the right skill's own category โ€“ the agent looks in roughly the right place, and the hard part is telling lookalikes apart.

Call 1 โ€“ skim all 182

One request carries two question kinds: a Choice over all 182 skill names (index description as each option's criteria โ€“ the same text the agent gets) whose probabilities are the ranking, plus three Nouls asking different ways whether the turn wants action rather than explanation (act on the user's system? consult a documented procedure? or does prose suffice โ€“ inverted). Their mean decides whether anything is suggested at all; under 0.30, stay quiet. Both go out in one round trip.

Call 2 โ€“ read the top 3 properly

Three options leave room for each skill's full description plus the opening of its SKILL.md, so the same question goes to better evidence: a Choice over the shortlist, plus one absolute fits::{name} Noul per candidate โ€“ does this skill do the specific thing asked? All can come back low, and a shortlist whose best fits score lands under 0.30 is dropped entirely.

The .pptx pair separates exactly here: the wide ranking puts the editing skill first (0.700 vs 0.300) for a deck-authoring request; re-read in full, the Choice flips to the authoring skill. Note the Choice and the Nouls can disagree (here the Nouls still score the editing skill higher) โ€“ they answer different questions: the Choice settles which, the Nouls settle whether to say anything at all. This is the same Choice-vs-Noul split as failure mode 8 in the Jev 1.13 jaggedness guide.

The whole recipe is two requests and two thresholds

def suggest(request: str) -> tuple[str, ...]:
    """At most one skill name for a request, or () for "nothing here applies"."""
    wide = rank_wide(request)
    if wide["gate"] < GATE_THRESHOLD:  # 0.30
        return ()
    shortlist = tuple(name for name, _ in wide["ranked"][:SHORTLIST])  # top 3
    result = rerank(request, shortlist, EXCERPT_CHARS)
    if max(result["fits"].values()) < FITS_THRESHOLD:  # 0.30
        return ()
    return (result["winner"],)

The suggestion goes into its own block after the roster, never inside it โ€“ so the roster text stays identical every turn and prefix caching still holds:

<skill_relevance>
Relevant to the current request: pptx-author. Ignore this if it does not
fit what the user actually asked for.
</skill_relevance>

The wording does two jobs: it says the suggestion can be ignored (pushing harder wins compliance on wrong suggestions too, and a wrong one is worse than none), and even an empty turn still sends a "nothing appears relevant" sentence, leaving the roster's own "err on the side of loading" instruction opposed rather than unopposed.

Measured results

Wrong skillSkill when nothing fits
Agent alone, just its roster16.8%9.8%
Agent with TypeSafe suggestion7.3%4.0%
Agent handed the right answer (ceiling)2.5%1.2%

That is 2.3ร— fewer wrong loads and 2.4ร— fewer needless ones โ€“ most of the gap between guessing from a truncated index and being handed the answer. Of 315 covered requests, the suggestion fixed 37 and broke 7 the agent had right on its own: a confident wrong suggestion persuades, which is the price of putting one in front of the turn. (The ceiling row is not zero either โ€“ an agent handed the right skill still does not always load it.)

Bottom line

Copy the shape for any agent carrying a large roster: cheap ranking over everything, then a close look at two or three โ€“ and let either step come back empty-handed. Full source: TypeSafe's skill-suggestion cookbook (runs used jev-1.12); see also intent routing, confidence-gated routing and speculative fan-out in the TypeSafe patterns docs for the same shape elsewhere.