> ## Documentation Index
> Fetch the complete documentation index at: https://docs.decimal.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Which skills get used

> Find the skills an agent never loads, read one skill's numbers, and decide whether to fix its description, make it opt-in or retire it.

Every skill on an agent's list adds its description to every request, whether or not the model uses it. The agent's **Prompt & skills** page shows which skills earn that cost, over the last 30 days.

## Read the skills table

An agent's page opens on **Prompt & skills**. Its **Skills** table has a row per skill on the list the model sees:

| Column | What it shows |
| - | - |
| **Why it's on the list** | *Added to this agent*, *Offered to all agents* or *Linked from the registry* |
| **Version** | `v3 · latest` or `v2 · pinned` |
| **Loaded · 300 runs in 30 days** | Runs that loaded it and their share of all runs: `12 · 4%`. If this agent's routing offered it, also `of 120 offers` |
| **Lift on this agent** | The agent's runs with the skill against runs it was held out of at random. `Not measured` until such a test ends |
| **Benchmark lift** | The skill's eval suite run with and without it: `+12 pts 20 cases`, or `Not measured` |

**Never loaded** means it was on the list and no run loaded it. **Unavailable** means the count couldn't be read, so it isn't a zero. Sort by **Loaded** to bring them together; the model's list order doesn't change.

A load count isn't an effect. The model loads a skill when the request fits, so runs that loaded it aren't comparable to runs that didn't. Only the lift columns say whether a skill helps.

Rows under *Not sent: over the limit* or *Added, but not offered* never reach the model, so their zero says nothing. For every skill at once, **Skills → Your skills** has **Loaded · 30 d**, **Benchmark lift** and a **Never loaded** filter.

## One skill's numbers

Click a skill's name for its side panel. **Use in this agent · 30 days** reads like this:

> Loaded on 12 runs of 300.
> support-agent's routing offered it 120 times; a run loaded it after 12 (10%).
> Graded runs that loaded it passed 88% of the time (25 graded).

A pass rate appears only from 5 graded runs. Below that, the panel says `Pass rate needs at least 5 graded runs; 3 so far.` A trend needs 5 graded runs in each half of the window.

**Open skill page** has a **Usage and quality** pane. **My agents** counts your organization's runs:

| Cell | What it shows |
| - | - |
| **Activations** | Runs that loaded it. This page's name for Loaded |
| **Eval pass** | Pass rate from 5 graded runs, or `1 graded, needs 5` |
| **AI quality score** | An LLM's 1 to 10 rating of sampled runs |
| **Selected when offered** | Loads divided by offers: `4 of 155 router offers · Menu bloat`. *Well-tuned* from 70%, *Mixed signal* from 40%, *Menu bloat* below |

Under **Global**, that last cell becomes **Delivered when offered**. It divides a different step, so the two percentages don't compare. See [Offered, Delivered, Loaded](https://docs.decimal.ai/sdk/python/frameworks/how-skills-reach-the-model.md#offered-delivered-loaded) for the steps and [SkillScore](https://docs.decimal.ai/guides/skillscore.md) for the public numbers.

### Offered, not used

Offers minus loads is the number to watch: the model saw the skill's line and passed. The skill page's **Live Traces** tab shows it as a **Discoverability gap**.

A low count isn't always the skill's fault:

* **`activation not measurable for prompt-injection usage`:** the skill reached the model through prompt text, so nothing reports a pick. You get counts, not a rate.
* **Always included:** every run already has the full text, so the model has no reason to load it.
* **A rare task:** a skill for refund disputes should be passed over on most requests.

## A skill nobody loads

Under the table, the page totals the idle skills, with the tokens their descriptions cost, and adds: "Zero loads alone do not show whether a skill is needed." Once a skill has been offered in at least 5 successful production runs, it also offers **Review removing 1 skill**.

First [open a few of those runs](https://docs.decimal.ai/guides/tracing.md) and read what was asked. Then:

| What the runs show | Do this |
| - | - |
| The task needed the skill and the model passed | Rewrite the description. It's [the trigger](https://docs.decimal.ai/guides/authoring-skills.md#step-2-write-the-description-as-the-trigger) |
| This agent's tasks never need it | **Remove from this agent**, in the row's **⋯** menu |
| It's offered to every agent and few use it | [**Make it opt-in…**](https://docs.decimal.ai/guides/agent-setup-versions.md#make-it-opt-in) keeps it on the agents that loaded it |

Removing is staged: [**Review & apply**](https://docs.decimal.ai/guides/agent-setup-versions.md) shows the evidence, such as `support-agent never loaded it in 30 days`, before anything changes.

## When to retire one

Retire a skill when the model does as well without it, not when its load count is low. A skill loaded often can still add nothing.

Benchmark lift near `0 pts` suggests the model already knows this. For a skill that teaches public knowledge, that's [the expected end](https://docs.decimal.ai/guides/authoring-skills.md#lifecycle-re-testing-and-retirement). A private or house-style skill isn't expected to retire, so check its eval first.

To measure on your own traffic, **Measure on live traffic…** in the row's menu leaves the skill out of a random share of runs. On OpenAI Agents SDK agents, [`decimalai.evaluate()`](https://docs.decimal.ai/guides/evaluations#test-a-change-before-it-ships-decimalai-evaluate) with `exclude_skills=` runs a set of cases without it.

To take a skill you own off every agent, its creator or an org admin can choose **⋯ More → Deactivate** on its page. A published skill follows [its own steps](https://docs.decimal.ai/guides/authoring-skills.md#lifecycle-re-testing-and-retirement).

## From code

```python theme={null}
from decimalai import SkillRouter

router = SkillRouter()  # key from decimalai.init() or DECIMAL_API_KEY
for skill in router.get_metrics("support-agent"):
    print(skill["name"], skill["activation_count"], skill["metrics"].get("evaluated_count"))
```

`activation_count` is Loaded, and a skill with no loads isn't in the result. The 5-run floor is the page's, so check `evaluated_count` before trusting `pass_rate`.

For one skill's offers:

```bash theme={null}
curl -H "Authorization: Bearer $DECIMAL_API_KEY" \
  "https://api.decimal.ai/api/v1/skills/refund-policy/router-stats?agent_name=support-agent"
```

It returns `offered_count`, `activated_count` (Loaded), `offered_not_activated_count` and `activation_rate`, which is `null` when a rate isn't measurable.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.