Route the accumulated session context to the loaded core protocol whose deficit it shows — /route.

MITAuto-check passed

Install Route

skills CLI
$ npx skills add jongwony/epistemic-protocols --skill route -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jongwony/epistemic-protocols route --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jongwony/epistemic-protocols.git skills-src && mkdir -p .claude/skills && cp -r skills-src/route/skills/route .claude/skills/route && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
route
GitHub stars
173
Token cost
~3.4k tokens
SKILL.md length
1,475 words
Files
2
Skills in repo
29
Repo updated
First seen
Licence
MIT

At a glance

Route the accumulated session context to the loaded core protocol whose deficit it shows — /route.

  • Works in 4 steps: Take the candidates from the harness's… → Resolve each candidate's deficit from… → Match the accumulated session context… → …
  • SKILL.md covers What it does and Rules
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Route is an agent skill from jongwony/epistemic-protocols. Route the accumulated session context to the loaded core protocol whose deficit it shows — /route. Invokes the dominant match, nudges when several fit, silent when none, monitors while a gate holds.

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).

The repository describes itself as: Epistemic protocols for Claude Code — structure human-AI interaction quality at every decision point - https://epistemic-protocols.com. The licence is MIT.

Example prompts

  • “/route”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Take the candidates from the harness's own loaded-skills listing: the loaded core protocol identifiers, and nothing else. Route carries no…
  2. Resolve each candidate's deficit from that protocol's own declared description — the text the protocol itself publishes, which names the…
  3. Match the accumulated session context against each resolved deficit. The question per protocol is whether the context, as it stands now…
  4. Decide by the option-set relay test

What it can do on your machine

Read from SKILL.md and the folder at commit 69bb95b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Route loads about 3.4k tokens when it runs. Until then it costs about 51 tokens; SKILL.md has 1,475 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~51
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jongwony/epistemic-protocols at commit 69bb95b, republished under its MIT licence (© jongwony). 1,475 words, ~3,444 tokens.

Download SKILL.mdSave it as .claude/skills/route/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
route
description
Route the accumulated session context to the loaded core protocol whose deficit it shows — /route. Invokes the dominant match, nudges when several fit, silent when none, monitors while a gate holds.

Route Skill

Route the accumulated session context to the core epistemic protocol whose deficit it shows, and invoke that protocol. Type: (DeficitUnrouted, AI, ROUTE, AccumulatedContext) → ProtocolInvocation.

What it does

  1. Take the candidates from the harness's own loaded-skills listing: the loaded core protocol identifiers, and nothing else. Route carries no matching table of its own; a protocol not loaded is not a candidate.
  2. Resolve each candidate's deficit from that protocol's own declared description — the text the protocol itself publishes, which names the interaction deficit it resolves. A listing that already carries those descriptions has resolved them and nothing further is read; a listing that carries identifiers alone leaves the deficits unresolved, and resolving them requires the capability to read a loaded skill's own declared description. A candidate whose description cannot be resolved drops out rather than being matched on a guess about what its identifier means.
  3. Match the accumulated session context against each resolved deficit. The question per protocol is whether the context, as it stands now, is the situation that description names.
  4. Decide by the option-set relay test:
    • one protocol is the analytically dominant match → call the skill-invocation capability with that protocol's skill identifier, passing a one-sentence deficit-framed statement of the current context as its argument. Issuing that call is what discharges this branch: naming the match belongs to the matching step, and the routing is the call. The invoked protocol's own opening detection and first gate hold the user's judgment.
    • several protocols fit, or the one match is weak → emit one line per fitting protocol, ↗ /command — reason, and stop.
    • nothing fits, or no candidate's deficit resolved → say nothing.
    • a gate holds the user's judgment — a protocol presented a checkpoint this session, and its own contract has not yet taken an answer at it, closed it, or entrusted the prompt to the session — → that protocol reads the prompt first, the way its contract reads any free response at that stop: an answer, a decline, a withdrawal, a dismissal, or a handoff to the session under a continuation it holds. Route reads the context that reading leaves, and reads off it which gates still hold: a checkpoint the reading closed, or whose contract entrusted the prompt to the session, holds no longer, so where none holds Route is in the ordinary branches above and what the protocol recorded is residual, read at the next prompt (Rule #5). A checkpoint presented during the current turn has had no prompt to read since it was presented; it holds by its contract alone until that contract takes an answer at it, so a deficit recognized mid-turn behind such a gate is routed in monitor mode. One gate still holding, with a different protocol the dominant match → monitor mode: emit one ↗ /command — reason line as a finding, invoke nothing, and let the turn go back to that gate. Detecting a deficit and switching to it are separate flows: the finding is a line in the transcript, which the user reads where that gate next stops for them, and whether to switch is theirs to answer there — as a free response, which the protocol handles the way its contract handles any free response at that stop. That protocol's contract ends at its own boundary; the finding lives in the transcript, outside it, and adds no path to the contract. More than one gate holding — reachable only through the user's own invocation, since Route invokes nothing while one holds → silence: each protocol's own gate governs, and Route arbitrates nothing between them. Whether a gate holds is read from what its contract says of the checkpoint it presented, never from a session store; a protocol's prose in context holds nothing, and neither does an invocation whose checkpoint the contract has since closed.
── FLOW ──
Route(C) → Candidates(listing) → P → Resolve(P) → D → Match(C, D) → M →
  holding(C) = ∅ ∧ single(M):                       call(skill_invocation, id(protocol(M)), deficit_statement(C)) → stop
  holding(C) = ∅ ∧ |M| ≥ 1 ∧ ¬single(M):            emit(↗ /command — reason) → stop       -- one line per protocol that fits
  holding(C) = ∅ ∧ |M| = 0:                         silence → stop                          -- reached by no match and by dom(D) = ∅ alike
  holding(C) = {A} ∧ single(M) ∧ protocol(M) ≠ A:   finding(↗ /command — reason) → continue   -- monitor mode: a line in the transcript; no invoke, no stop
  holding(C) = {A} ∧ single(M) ∧ protocol(M) = A:   silence → continue                        -- monitor mode: A is already the match
  holding(C) = {A} ∧ ¬single(M):                    silence → continue                        -- monitor mode: nothing dominates
  |holding(C)| ≥ 2:                                 silence → continue                        -- each gate governs; Route arbitrates nothing between them
-- Route is invoked at a recognition point: the prompt, or a moment during the turn where preparing a response or action shows a deficit; holding(C) is read after each protocol whose checkpoint stood at the last prompt has read that prompt by its own contract, and a checkpoint presented since then holds until its contract takes an answer at it; C is the context that reading leaves, as it stands at the recognition point
-- exactly one branch fires; a stop ends Route's turn — its invocation to its outcome — at the recognition point: what was done before it stands, work that turns on the deficit waits for the invoked protocol or for the turn after the nudge lines, and resumes on silence; a continue leaves the holding gates to govern under their own contracts, Route choosing no precedence and advancing no judgment
-- work on C itself is never a branch

── TYPES ──
C  = AccumulatedContext   -- the session at the recognition point Route is invoked at — the prompt, or a moment during the turn where preparing a response or action shows a deficit — including evidence recognized during the current turn; any protocol whose checkpoint stood at the last prompt has first read that prompt by its own contract
P  = Set(ProtocolId)      -- loaded core protocol identifiers, read off the harness listing; candidacy and nothing more
D  = Map(ProtocolId, Deficit)  -- each candidate's deficit, read off that protocol's own declared description
Resolve = P → D           -- identity where the listing already carries the descriptions; otherwise it requires the
                          -- capability to read a loaded skill's own declared description
                          -- p ∉ dom(D) exactly where that description could not be resolved, so p never reaches Match
M  = Set(Protocol)        -- candidates in dom(D) whose resolved deficit the context shows; M ⊆ dom(D) ⊆ P
deficit_statement(C) = one sentence naming the deficit the context shows, handed to the invoked protocol
holding(C) = Set(Protocol)     -- the protocols whose presented checkpoint still holds the user's judgment, each by its own contract's reading of what the user has said since it was presented: a checkpoint the contract has taken an answer at, closed, or entrusted to the session under a continuation it holds is not in the set; one presented during the current turn, with no prompt since, has had nothing to read and is in the set until its contract takes an answer at it; read off C, never off a session store; a protocol's prose in context puts nothing in it
single(M) = dominant, if |M| = 1   -- dominant is evaluated only for a singleton
          = false,    otherwise    -- protocol(M) names the one member, and is projected only under single(M)
Finding   = ↗ /command — reason  -- one line in the transcript while one gate holds; the user reads it where that gate next stops for them and answers it, if at all, to that protocol
residual(A) ⊆ C                -- what a protocol recorded as unresolved, in its own terms, when it converged or deactivated; accumulated context like any other, so Match reads it at the next prompt
ProtocolInvocation = Invoke(protocol, deficit_statement) | Nudge(List(protocol)) | Silence | Finding
deficit:  DeficitUnrouted   -- the context shows a deficit no protocol has yet been called for
preserves: C                -- context is read, never rewritten
invariant: Routing over Doing; composition is Route's — each protocol ends at its own boundary

Rules

  1. Routing is the whole of Route's turn, except in monitor mode — Route's turn runs from its invocation, at the prompt or at a recognition mid-turn, to exactly one of the three outcomes: the invocation call, the nudge lines, or silence. In monitor mode (a gate holds the user's judgment) Route emits at most one finding and ends nothing: a finding requires exactly one holding gate and a different protocol as the single dominant match, and otherwise Route is silent; either way the holding gates govern the turn under their own contracts, and a finding sits in the transcript where the user next reads it. A finding is Extension — it relays a match and exercises no authority — so it may not stop the loop, and it invokes nothing. The finding is Route's output, produced by invoking Route; a line written in its place without the invocation is not one. A prompt that arrives while a gate holds is that protocol's to read first, as its contract reads any free response at that stop; Route reads the context that reading leaves, and a checkpoint the reading closed or entrusted to the session holds no longer. Taking the candidates and resolving their deficits is the matching step, not the deliverable. Where no protocol dominates, the nudge or silence branch is already the complete end. The object-level work the context was asking for belongs to the invoked protocol or to what follows Route's outcome, never to Route's own. At a recognition mid-turn, what was already done stands; work that turns on the deficit waits — for the invoked protocol, whose first gate is where it resumes, or for the turn after the nudge lines, which end the turn with that work reported as it stands — and resumes on silence. A turn that took up that work before the routing decision its recognition owed has skipped the routing it was invoked to do.
  2. The loaded set bounds candidacy; each protocol's own description supplies its deficit; Match reads each deficit against the object it concerns — the harness's loaded-skills listing is the sole source of which protocols are candidates, and each candidate's own declared description is the sole source of what deficit it resolves. Route reads no curated routing table, no other plugin's catalog file, and no session store. Resolving an identifier the listing carried without its description is not reading a table: it is reading the same text the listing would have carried, from where the protocol itself states it. At Match, read each declared deficit against the object it concerns and the ground that can settle that object. Carry an already-recognized deficit through that comparison until current evidence settles it or defeats the earlier fit. A proposed question, assumption, or repair is pending work on the deficit; route the remaining fit through Decide before taking up that response. Where settlement requires the user's determination, keep the deficit open until the user's words in accumulated context supply it — evidence that is not the user's may defeat the earlier fit, and it closes nothing; assess that evidence independently of the action the utterance requests.
  3. Core protocols only — Route invokes epistemic protocols that resolve a named interaction deficit. It never routes to itself or to another utility skill.
  4. No gate of its own — Route presents no options. The invoked protocol's first gate is where the user judges; a nudge line is a pointer, not a question, and a finding is a pointer left in the transcript. Route never terminates a protocol and never folds its state: what becomes of the holding gate when the user takes a finding is whatever that protocol's own contract provides for that response, with any residual recorded there.
  5. Route composes from residual — a core protocol resolves the one deficit it names and stops where that deficit ends — at convergence, or at a deactivation its own contract provides — recording what it could not resolve as residual in its own terms. That residual is accumulated context like any other: at the next prompt Route reads it for the deficit it now shows and routes there, with no pointer from the protocol that left it. Where a protocol's own contract already states a route onward, that route is the protocol's and Route reads it as context like the rest; the composition Route performs is the one that needs no such statement — a protocol detects its own boundary, Route detects the next deficit, and the two detections meet in the transcript. Route places nothing inside a protocol.
  6. Route keeps no state — everything Route does is done by reading the accumulated context at each invocation: it holds no stack of parked protocols and records no resumption point outside the transcript. What a protocol leaves when the user turns away from it — a residual folded at a dismissal or a withdrawal, or a checkpoint its own contract holds across a continuation — is that protocol's record, in its own terms, and Rule #5 is how Route comes back to it: read at the next prompt as the deficit it then shows.

© jongwony, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in route/skills/route of jongwony/epistemic-protocols.

  • SKILL.md
  • agents/openai.yaml

Open the folder on GitHubat commit 69bb95b

Compare with similar skills

Route next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Route compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Route this skilljongwony/epistemic-protocols173—~3.4kAutomated safety check: PassMIT
OmniRoute Routing CLIdiegosouzapw/OmniRoute74k—~342Automated safety check: PassMIT
OmniRoute Combo Routingdiegosouzapw/OmniRoute74k—~2.1kAutomated safety check: PassMIT
Intelligence Routeruvnet/ruflo74k—~874Automated safety check: NotesMIT
Loading Indicatorsthedaviddias/Front-End-Checklist74k—~434Automated safety check: PassMIT
Font Loadingthedaviddias/Front-End-Checklist74k—~400Automated safety check: PassMIT

Similar skills

  • OmniRoute Routing CLI

    diegosouzapw/OmniRoute

    Creates, switches, and inspects OmniRoute model-routing combos, plus a suggestion command with cost and latency constraints.

    74k GitHub stars~342 tokensUpdated yesterday
    AI & LLM EngineeringAuto-check passed
  • OmniRoute Combo Routing

    diegosouzapw/OmniRoute

    Manages OmniRoute routing combos through its REST API: create and update combos, choose from 19 strategies, set fallback chains, test outcomes and read metrics.

    74k GitHub stars~2.1k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Intelligence Route

    ruvnet/ruflo

    Route tasks via the 3-tier model selector and learned patterns; emits a routing rationale via hooksexplain

    74k GitHub stars~874 tokensUpdated yesterday
    DevelopmentAuto-check: notes
  • Loading Indicators

    thedaviddias/Front-End-Checklist

    A skill your agent uses when auditing slow page loads, heavy assets, or rendering delays related to Show loading indicators.

    74k GitHub stars~434 tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Font Loading

    thedaviddias/Front-End-Checklist

    A skill your agent uses when auditing slow page loads, heavy assets, or rendering delays related to Optimize web font loading.

    74k GitHub stars~400 tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Lazy Loading

    thedaviddias/Front-End-Checklist

    A skill your agent uses when auditing slow page loads, heavy assets, or rendering delays related to Implement lazy loading for offscreen content.

    74k GitHub stars~487 tokensUpdated yesterday
    Frontend & DesignAuto-check passed

More from jongwony/epistemic-protocols

All 29 skills in this repo
  • Outcome

    jongwony/epistemic-protocols

    This skill should be used when the user asks to "run the outcome eval", "paired bare vs protocol", "which decisions did the protocol surface", "count what the AI asked or presented", "does /inquire…

    173 GitHub stars~1.3k tokensUpdated yesterday
    Auto-check: notes
  • Realize

    jongwony/epistemic-protocols

    This skill should be used when the user asks to "run the eval", "test whether the protocol actually works at runtime", "check type realization", "measure protocol fulfillment", "run the…

    173 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check: notes
  • Verify

    jongwony/epistemic-protocols

    This skill should be used when the user asks to "verify protocols", "check consistency before commit", "validate definitions", "run pre-commit checks", "verify soundness", or wants to ensure…

    173 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Encapsulation

    jongwony/epistemic-protocols

    This skill should be used when the user asks to "audit plugin encapsulation", "check self-containment semantics", "find contributor-knowledge assumptions", or invokes /encapsulation.

    173 GitHub stars~2k tokensUpdated yesterday
    Auto-check passed
  • Formal Review

    jongwony/epistemic-protocols

    This skill should be used when the user asks to "formal review", "formal lens review", or invokes /formal-review.

    173 GitHub stars~3.5k tokensUpdated yesterday
    Auto-check: notes
  • Recollect

    jongwony/epistemic-protocols

    The user vaguely recalls something discussed before but cannot name it — one session, or a line of work, topic, or settled concept across several: find it in past records to recognize.

    173 GitHub stars~8.7k tokensUpdated yesterday
    Auto-check passed

Questions about Route

What does Route do?

Route the accumulated session context to the loaded core protocol whose deficit it shows — /route. Route is an agent skill from jongwony/epistemic-protocols. Route the accumulated session context to the loaded core protocol whose deficit it shows — /route.

How do I install Route in Claude Code?

Run `npx skills add jongwony/epistemic-protocols --skill route -a claude-code`. Or copy the skill folder (route/skills/route in jongwony/epistemic-protocols) into .claude/skills/route in your project. Claude Code loads it when a task matches its description.

How do I install Route in Codex?

Run `npx skills add jongwony/epistemic-protocols --skill route -a codex`. Or copy the skill folder (route/skills/route in jongwony/epistemic-protocols) into .agents/skills/route in your project. Codex loads it when a task matches its description.

Can I use Route in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jongwony/epistemic-protocols --skill route -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/route, .gemini/skills/route, .github/skills/route and .opencode/skills/route in your project.

What does Route need to run?

SKILL.md names no scripts, command-line tools or credentials: Route is instructions for the agent only.

Does Route access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Route safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Route use?

Route is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Route use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Route?

Skills that share tags, products or a category with Route: OmniRoute Routing CLI (diegosouzapw/OmniRoute, 74k stars), OmniRoute Combo Routing (diegosouzapw/OmniRoute, 74k stars), Intelligence Route (ruvnet/ruflo, 74k stars) and Loading Indicators (thedaviddias/Front-End-Checklist, 74k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Route?

jongwony (a GitHub user) maintains it in jongwony/epistemic-protocols, which has 173 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 6, 2026.

Source: jongwony/epistemic-protocols on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.