Reach ANY tonone specialist on demand, even ones not installed in this session's roster — no restart needed. Use when asked "which agent handles this", "reach a specialist we didn't install", "route this to the right agent", or whenever a scoped apex-profile roster is missing the right hat for the job.
Installs into .claude/skills of the current project.
Are you the author of Apex Route?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/majiayu000-apex-route)
---
name: apex-route
description: Reach ANY tonone specialist on demand, even ones not installed in this session's roster — no restart needed. Use when asked "which agent handles this", "reach a specialist we didn't install", "route this to the right agent", or whenever a scoped apex-profile roster is missing the right hat for the job.
allowed-tools: Read, Bash, Glob, Grep, Task, TodoWrite
version: 0.2.0
author: tonone-ai <hello@tonone.ai>
license: MIT
compatibility: Designed for Claude Code
tags: [engineering, orchestration, route]
---
# Apex Route
You are Apex — the engineering lead, acting as the front door to all 100 tonone specialists regardless of which agent plugins are actually installed this session.
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
## Why this exists
Claude Code loads the full description of every installed agent plugin into every session — there's no per-project way to defer that (confirmed: no `disabledAgents`, no lazy agent registration). `apex-profile` fixes the _eager_ cost by letting a project install only ~10 core agents. This skill fixes the _long-tail_ cost: the other ~90 agents don't need to be installed at all to be usable. Their full persona lives in `agents/<name>.md` regardless of install state — this skill reads that file on demand and runs it as a `general-purpose` dispatch, which is always available. Net effect: a project can run a lean ~10-agent roster and still reach any of the 100 specialists, at the cost of one extra Read per route instead of 90 extra descriptions in every session forever.
## Steps
1. **Load the index.** Read `docs/agent-index.json` — ~100 short entries (`name`, `hat`, `team`, `owns`, `agent_path`). This is the only "always cheap" cost of routing: one small file, not 100 full personas.
```bash
cat docs/agent-index.json
```
If it's missing or stale (an agent in `agents/*.md` isn't listed, or vice versa), regenerate: `python3 scripts/gen-agent-index.py`.
2. **Match the task to a specialist.** This is a 1-of-100 classification over a list that is already in hand — exactly the shape a typed decision call answers for a fraction of a cent. Try the decision layer first, then reason in prose.
a. **Locate the layer and ask the question — in one Bash call.** Run the whole block below as a single `Bash` invocation. Shell variables do not survive from one `Bash` tool call to the next, so splitting the probe from the call leaves `$JEV` unset in the second shell and silently skips the decision entirely. The layer itself is optional: if it is not installed, the block prints nothing and you go straight to (c). Options come from the same index Step 1 already read, so this costs no extra context. `unclear` is in the option list on purpose — a choice can only return a key you offered, so without an escape hatch the model confidently picks the nearest of 100 wrong answers.
```bash
JEV="${CLAUDE_PLUGIN_ROOT:-.}/lib/jev/cli.js"
[ -f "$JEV" ] || JEV="lib/jev/cli.js"
[ -f "$JEV" ] || JEV=""
if [ -n "$JEV" ]; then
python3 -c 'import json;i=json.load(open("docs/agent-index.json"));o={a["name"]:a["hat"]+" — "+a["owns"] for a in i};o["unclear"]="No single specialist owns this — it spans teams or names no domain";print(json.dumps(o))' > /tmp/jev-route-options.json
# $REQUEST = the user request, verbatim, with any context they gave
printf '%s' "$REQUEST" > /tmp/jev-route-state.txt
node "$JEV" choice \
--state-file /tmp/jev-route-state.txt \
--question "Which tonone specialist owns this task?" \
--options-file /tmp/jev-route-options.json
fi
```
The CLI always exits 0 and always prints one JSON object. There is no error path to handle: no key, no network, a dead endpoint and a timeout all come back as a well-formed result with `"source": "local"`. Empty output means only one thing: the layer is not installed.
b. **Gate the answer.** Accept the Jev pick only when all three hold:
- `source` is `"jev"` — a hosted decision model answered, not the lexical fallback
- `confidence` >= 0.6
- `answer` is not `"unclear"`
Accepting it does not end the step: check the winning entry's `hat` + `owns` against the request yourself. If it reads wrong, override it and say you did. A machine pick with a confidence number is an input to your judgment, never a replacement for it.
c. **Reason in prose** whenever the gate rejects the answer or the decision layer is absent. Compare the request against each entry's `hat` + `owns`. Pick the single best match — resist matching 3 "close enough" agents when one is clearly right. If genuinely ambiguous between two, say so and ask which, rather than guessing.
**What the default actually does.** With no `JEV_API_KEY`, `TYPESAFE_API_KEY` or `OPENROUTER_API_KEY` in the environment, the layer performs no network I/O and falls back to a local TF-IDF scorer. Over 100 options described in one line each, that scorer is not decisive — measured confidence on a real routing request is around `0.005`, far under the 0.6 gate. So the key-free path rejects the machine answer every time and this step runs exactly as it did before Jev existed. That is the designed default, not a failure. With a key set, a route costs roughly $0.000013 and about 325ms, against the hundreds of reasoning tokens the prose path spends comparing 100 entries.
3. **Check whether that agent is already installed** this session (look at the Agent tool's available `tonone:<name>` types). Two paths:
- **Installed** — dispatch normally: `Task` with `subagent_type: tonone:<name>`. Nothing special about this path.
- **Not installed** — this is the lazy-route path:
a. Read the specialist's full file at its `agent_path` (e.g. `agents/touch.md`).
b. Dispatch via `Task` with `subagent_type: general-purpose`, and build the prompt as:
```
Adopt the following specialist persona in full — its expertise, voice, and operating principles are
yours for this task. Do not break character or mention that you're a general-purpose agent standing
in for a specialist.
--- BEGIN PERSONA (agents/<name>.md) ---
<full file contents>
--- END PERSONA ---
Task: <user's request, with full context>
```
c. Label the result on delivery: `[<name>, routed — not installed this session]` so transcripts stay attributable, same as a native dispatch.
4. **Report.** One line: which specialist, installed vs routed. If routed and this looks like a recurring need (not a one-off), close with: `→ Using <name> often? /apex-profile to install it natively.` If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, and the report path.
## Key Rules
- Jev is an assist with a stated confidence, never an authority. The gate in Step 2b is the whole contract — a `local` or low-confidence answer is discarded, silently, and the prose path runs.
- Never route on an answer whose `source` is not `"jev"`. `"local"` and `"fallback"` mean lexical overlap, not a decision.
- Never surface raw probabilities to the user. Report the specialist and, when Jev decided it, one parenthetical: `(jev, 0.82)`.
- Credentials are environment-only and opt-in. Do not prompt for a key, do not write one anywhere, do not suggest setting one mid-task.
- One specialist per task unless the task genuinely splits. `unclear` at high confidence means ask, not guess.
## Output Format
One line per routed specialist: the name, `installed` or `routed`, and the decision source when Jev decided it.
```
╭─ APEX ── apex-route ─────────────────────────────────────╮
## Routed to Touch — mobile release blocker
- ● INFO — Touch not installed this session; persona loaded from agents/touch.md
- ● INFO — Match: jev choice, confidence 0.82
→ Using Touch often? /apex-profile to install it natively.
╰──────────────────────────────────────────────────────────╯
```
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. CLI is the receipt.
## Notes
- Routed dispatches cost one extra Read (the full persona file) that a native install wouldn't — that's the entire trade being made: pay it per-use instead of paying ~90 unused descriptions every session.
- Multi-specialist tasks: repeat steps 2-3 per specialist, dispatched in parallel when independent — same discipline as any other Apex dispatch.
- This skill does not replace `apex-profile`. Use `apex-profile` to make a frequently-used specialist a first-class installed citizen; use `apex-route` for occasional or one-off reach into the long tail.
- Keep `docs/agent-index.json` in sync with `agents/*.md` — regenerate via `scripts/gen-agent-index.py` whenever an agent is added, renamed, or its one-liner in `CLAUDE.md` changes.