git clone https://github.com/Intense-Visions/harness-engineering
T=$(mktemp -d) && git clone --depth=1 https://github.com/Intense-Visions/harness-engineering "$T" && mkdir -p ~/.claude/skills && cp -r "$T/agents/skills/claude-code/harness-router" ~/.claude/skills/intense-visions-harness-engineering-harness-router-b416e8 && rm -rf "$T"
agents/skills/claude-code/harness-router/SKILL.mdHarness Router
Natural language entry point to all harness skills. Classifies intent by scope/domain, confirms routing with reasoning, dispatches to the appropriate skill.
When to Use
- When the user invokes
with a natural language description/harness - When the user is unsure which harness skill to use
- NOT when the user already knows the specific skill (e.g.,
)/harness:tdd - NOT for non-harness tasks (general coding, file operations, etc.)
Process
Iron Law
The router confirms before dispatching. Never silently route. Always present the chosen skill, scope classification, and reasoning — then wait for confirmation.
Phase 1: CLASSIFY — Parse Intent and Search
-
Check for empty input. Show usage help and stop:
Usage: /harness <describe what you want to do> Examples: /harness fix the button spacing on the settings page /harness we need a notification system /harness this page is slow /harness redesign how the sidebar filters work /harness clean up my code I'll figure out the right skill and process level for you. -
Search the skill catalog. Call
to get ranked matches.search_skills({ query: "<user's intent>" }) -
Classify scope into one of four tiers:
Scope Signal Words Description quick-fix fix, tweak, adjust, update, change X to Y, correct Small targeted change, no design decisions guided-change redesign, refactor, improve, rework Moderate scope, clear architecture full-exploration build, create, add system for, we need, design Ambiguous scope, design decisions needed diagnostic broken, slow, failing, debug, review, analyze Something broken or needs analysis Additional signals: single file → lower ceremony; multiple systems → higher ceremony; error messages → diagnostic.
-
Map scope to entry skill:
Scope Primary Skill Alternates quick-fix harness-tdd
if structuralharness-refactoringguided-change harness-planning
if tradeoffs involvedharness-architecture-advisorfull-exploration harness-brainstorming— diagnostic harness-debugging
for reviews,harness-code-review
for performanceharness-perfIf
results strongly favor a different skill, prefer search results. Scope classification is the fallback when search is ambiguous.search_skills -
Assess confidence:
- High: Top result clearly dominates and aligns with scope classification
- Low: Top 2-3 results close in score, or scope classification conflicts with search results
Phase 2: CONFIRM — Present Decision with Reasoning
High confidence:
This looks like a [scope-level] — [reasoning]. I'll route to `harness:[skill]` because [why this skill fits]. Proceed? (y / n / suggest another)
Wait for confirmation.
Low confidence (multiple candidates):
This could be a few things: 1. `harness:[skill-1]` — [description] 2. `harness:[skill-2]` — [description] 3. `harness:[skill-3]` — [description] Which fits best? (1 / 2 / 3)
Wait for the user to choose.
User rejects: If they name a skill, confirm and dispatch. If they re-phrase, re-run CLASSIFY. Do not loop more than twice — after two misses, list all available skills and let the user pick.
Phase 3: DISPATCH — Invoke Selected Skill
- Pass original intent as context so the user does not repeat themselves.
- Invoke via
:run_skill
with original intent as argument context.run_skill({ skill: "<selected-skill>", path: "<project-root>" }) - Hand off cleanly. Once invoked, the router's job is done. The dispatched skill owns all subsequent interaction.
Examples
Quick Fix: "fix the button spacing on the settings page" quick-fix — single component, clear target →
harness-tdd
Guided Change: "redesign how the sidebar filters work" guided-change — moderate scope, some decisions →
harness-planning or harness-architecture-advisor
Full Exploration: "we need a notification system" full-exploration — ambiguous scope, multiple approaches →
harness-brainstorming
Diagnostic: "this page is slow" diagnostic — performance symptom →
harness-perf
Ambiguous: "clean up my code" Could be refactoring, dead code, or architecture cleanup → Present candidates:
harness-refactoring, harness-codebase-cleanup, harness-cleanup-dead-code
Harness Integration
— Phase 1: matches intent against the skill catalog. Returns ranked results.search_skills
— Phase 3: dispatches to selected skill with project path and original intent.run_skill
— Not used by the router. Validation is the dispatched skill's responsibility.harness validate
Success Criteria
- Quick-fix intents route to
, full-exploration toharness-tdd
, diagnostics to appropriate diagnostic skillharness-brainstorming - Ambiguous intents present top 2-3 candidates for user choice
- Confirmation always includes scope classification, chosen skill, and one-line reasoning
- User can reject and re-phrase or pick a different skill
- Dispatched skill receives original intent as context
MCP tool is used for matching — no custom scoring codesearch_skills
with no arguments shows usage help/harness
Rationalizations to Reject
| Rationalization | Reality |
|---|---|
| "The intent is obvious, I can skip confirmation" | The Iron Law requires confirmation before every dispatch. Even obvious intents benefit from the user seeing scope classification. |
| "I should suggest downstream skills the dispatched skill will chain into" | Each skill owns its own transitions. Surfacing the full chain adds noise and duplicates logic in the dispatched skill. |
| "Search results don't match well, so I'll guess based on keywords" | If returns poor results, present top candidates and let the user choose. Guessing silently is worse than admitting ambiguity. |
| "The user rejected twice, I should keep trying" | After two misses, list available skills and let the user pick directly. Do not loop indefinitely. |
Gates
- No silent dispatch. Every routing decision must be confirmed before the skill is invoked.
- No bypassing search_skills. The skill catalog search must be used. Do not hardcode intent-to-skill mappings.
- No downstream chaining. The router dispatches to exactly one skill. Do not pre-load or suggest follow-on skills.
- No more than two re-classification attempts. After two rejections, show the full list.
Escalation
returns no results: Skills index may be stale. Suggestsearch_skills
to regenerate, then retry.harness update-skills-index- Intent spans multiple skills: Ask: "This involves both [skill A] and [skill B]. Which should we start with?" Do not dispatch to multiple skills.
- Intent outside harness catalog: Say so plainly: "This doesn't match any harness skill. Handle directly, or re-describe if you think a skill should apply."