Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Maintain /do routing tables when skills or agents change.
.claude/skills/notque-routing-table-updater/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 85% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 32% | 0% |
This skill maintains the /do routing indices when skills or agents are added, modified, or removed. It implements a Phase-Gated Pipeline -- scan, extract, generate, update, verify -- with deterministic script execution at each phase.
The skill reads metadata from all skills and agents (never modifies them) and validates and repairs the generated routing indices skills/INDEX.json and agents/INDEX.json. PostToolUse hooks (hooks/posttooluse-sync-skill-index.py, hooks/posttooluse-sync-agent-index.py) regenerate the indices automatically on every SKILL.md or agent-file edit; this skill covers drift those hooks miss (bulk changes, deletes outside the harness, corrupted index files).
| Signal | Load These Files | Why | |---|---|---| | batch registration of many skills (invoked by pipeline-scaffolder) | batch-mode.md | Loads detailed guidance from batch-mode.md. | | resolving trigger conflicts: priority rules and severity levels | conflict-resolution.md | Loads detailed guidance from conflict-resolution.md. | | errors, error handling | error-handling.md | Loads detailed guidance from error-handling.md. | | worked update scenarios: new skill, conflict, manual entry, complexity change | examples.md | Loads detailed guidance from examples.md. | | extracting trigger phrases: 'use when' clauses, action verbs, domain keywords, complexity inference | extraction-patterns.md | Loads detailed guidance from extraction-patterns.md. | | routing entry format: frontmatter routing block fields, INDEX.json entry shape, regeneration | routing-format.md | Loads detailed guidance from routing-format.md. | | skill-entry examples for registering a newly created skill | skill-examples.md | Loads detailed guidance from skill-examples.md. |
Goal: Find every skill and agent file in the repository.
Constraints: Repository must be at agents toolkit root (requires commands/do.md); only scan skills/*/SKILL.md and agents/*.md formats; file permissions must allow reading.
Step 1: Run scan script
bashpython3 ~/.claude/skills/meta/routing-table-updater/scripts/scan.py --repo $HOME/vexjoy-agent
Step 2: Validate scan output
Expected output is JSON with skills_found, agents_found, skills (array of paths to skills//SKILL.md), `agents` (array of paths to agents/.md).
Step 3: Check for gaps
Compare discovered count against expected. If missing, check directory naming, agent file naming, or file permissions.
Gate: All skill directories and agent files are discovered without permission errors. Proceed to Phase 2 only after the gate passes. See references/error-handling.md for gate failure recovery.
Goal: Extract YAML frontmatter, trigger patterns, complexity, and routing table targets from every discovered file.
Constraints: YAML frontmatter must be valid; required fields (name, description) must be present; trigger patterns extracted from description text; complexity inference must follow references/extraction-patterns.md.
Step 1: Run extraction script
bashpython3 ~/.claude/skills/meta/routing-table-updater/scripts/extract_metadata.py --input scan_results.json --output metadata.json
Step 2: Verify extraction completeness
For each capability, confirm extracted fields: name, description, trigger_patterns (skills), domain_keywords (agents), complexity (Simple, Medium, Complex), routing_table (Intent Detection, Task Type, Domain-Specific, or Combination).
Step 3: Validate trigger pattern quality
Review against references/extraction-patterns.md. Patterns must be specific enough to avoid false matches, broad enough to catch common phrasings, and free of generic terms.
Description trimming: skill descriptions trim safely to ≤40 router-line tokens when the frontmatter routing.triggers array stays untouched — triggers carry routing weight independently of the description. Verify trims with scripts/skill-sprawl-audit.py plus the routing-benchmark and trigger-ambiguity CI jobs (evidence: PR #801, 11 trims, routing-benchmark 68/68).
Gate: All YAML parsed successfully, required fields are present, trigger patterns are extracted for skills, and domain keywords are extracted for agents. Proceed to Phase 3 only after the gate passes. See references/error-handling.md for gate failure recovery.
Goal: Map extracted metadata to routing entries and detect trigger conflicts before the indices are rebuilt.
Constraints: Deterministic generation (no randomness); pattern conflicts detected immediately; entries sorted alphabetically; duplicates within the same group block gate passage.
Step 1: Run generation script
bashpython3 ~/.claude/skills/meta/routing-table-updater/scripts/generate_routes.py --input metadata.json --output routing_entries.json
Step 2: Understand the generation process
references/conflict-resolution.md)Step 3: Review conflict detection output
Low-severity conflicts: script applies specificity rules automatically. High-severity conflicts: script blocks gate passage and requires manual resolution.
Gate: All capabilities are mapped, conflicts are documented, and no duplicates remain within the same group. Proceed to Phase 4 only after the gate passes. See references/error-handling.md for gate failure recovery.
Goal: Bring skills/INDEX.json and agents/INDEX.json in line with filesystem state.
Constraints: Both indices are generated, gitignored artifacts — repair means regenerating from frontmatter via the repo scripts; hand-edits to index files are lost on the next regeneration; source SKILL.md and agent files stay untouched; run from the repo root.
Step 1: Regenerate both indices
bashcd $HOME/vexjoy-agent python3 scripts/generate-skill-index.py python3 scripts/generate-agent-index.py
Step 2: Check for phantom entries
Every entry's file path must exist on disk:
bashpython3 - <<'EOF' import json, os for idx, key in (("skills/INDEX.json", "skills"), ("agents/INDEX.json", "agents")): entries = json.load(open(idx))[key] phantom = [n for n, e in entries.items() if not os.path.exists(e["file"])] print(idx, len(entries), "entries,", len(phantom), "phantom", phantom or "") EOF
Gate: Both generators exit 0 and both indices contain zero phantom file paths. On generator failure, fix the offending frontmatter (the error names the file) and rerun. Proceed to Phase 5 only after the gate passes.
Goal: Final validation of the skill package and the rebuilt indices.
Constraints: No duplicate trigger phrases within an index; every index entry's file path exists; complexity values must match Simple/Medium/Complex; overlapping patterns documented with priority rules.
Step 1: Run validation script
bashpython3 ~/.claude/skills/meta/routing-table-updater/scripts/validate.py
Validates skill package structure, SKILL.md frontmatter, and script executability. Exit 0 = pass.
Step 2: Understand verification checks
file path exists (Phase 4 Step 2 check)Gate: All checks pass. Task complete ONLY if final gate passes. See references/error-handling.md for gate failure recovery.
See references/skill-examples.md for worked examples (new skill created, agent description updated, conflict detection, manual entry preserved).
When invoked by pipeline-scaffolder Phase 4 (INTEGRATE), this skill operates in batch mode to register N skills and 0-1 agents in a single pass.
See references/batch-mode.md for batch input format, batch process, and the batch vs single mode comparison table.
This skill is typically invoked after other creation skills complete:
Invocation by other skills:
skill: routing-table-updaterThe skill reads metadata from all skills and agents but never modifies them. Its only write targets are the generated indices skills/INDEX.json and agents/INDEX.json, always via the repo generator scripts.
See references/error-handling.md for the full error matrix (YAML parse errors, routing conflicts, manual entry overwrites, markdown validation failures) and per-phase gate failure recovery.
${CLAUDE_SKILL_DIR}/references/routing-format.md: routing entry format specification (frontmatter routing block fields, INDEX.json entry shape, regeneration commands)${CLAUDE_SKILL_DIR}/references/extraction-patterns.md: Trigger phrase extraction patterns (regex, keyword maps, complexity inference)${CLAUDE_SKILL_DIR}/references/conflict-resolution.md: Conflict types, priority rules, severity levels, resolution process${CLAUDE_SKILL_DIR}/references/examples.md: Real-world examples of routing table updates (new skill, updated agent, conflict detection, manual preservation)${CLAUDE_SKILL_DIR}/references/skill-examples.md: Worked examples for the 5-phase pipeline (Phase 1-5 walkthroughs)${CLAUDE_SKILL_DIR}/references/batch-mode.md: Batch mode invocation by pipeline-scaffolder (input format, process, comparison)${CLAUDE_SKILL_DIR}/references/error-handling.md: Error matrix and per-phase gate failure recovery| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | fail→fail | 20,840 | 18,419 | -12% | 1 | 1 | 0% | 3,671 | 5,567 | +52% | 0 | 0 | — |
case-21 | fail→fail | 5,253 | 5,008 | -5% | 1 | 1 | 0% | 199 | 2,705 | +1259% | 0 | 0 | — |
case-01 | fail→fail | 7,895 | 6,276 | -21% | 1 | 1 | 0% | 1,411 | 2,733 | +94% | 0 | 0 | — |
case-02 | fail→fail | 3,595 | 5,430 | +51% | 1 | 1 | 0% | 508 | 2,739 | +439% | 0 | 0 | — |
case-15 | pass→pass | 12,120 | 8,461 | -30% | 1 | 1 | 0% | 1,791 | 3,742 | +109% | 0 | 0 | — |
case-03 | fail→fail | 4,908 | 6,227 | +27% | 1 | 1 | 0% | 270 | 2,813 | +942% | 0 | 0 | — |
case-04 | fail→pass | 10,127 | 2,445 | -76% | 1 | 1 | 0% | 1,599 | 2,859 | +79% | 0 | 0 | — |
case-05 | fail→pass | 11,289 | 4,642 | -59% | 1 | 1 | 0% | 2,152 | 3,299 | +53% | 0 | 0 | — |
case-06 | fail→pass | 15,037 | 5,398 | -64% | 1 | 1 | 0% | 2,834 | 3,497 | +23% | 0 | 0 | — |
case-07 | pass→fail | 13,016 | 2,394 | -82% | 1 | 1 | 0% | 2,042 | 2,890 | +42% | 0 | 0 | — |
case-08 | fail→pass | 9,416 | 1,737 | -82% | 1 | 1 | 0% | 1,504 | 2,786 | +85% | 0 | 0 | — |
case-09 | fail→pass | 17,636 | 8,952 | -49% | 1 | 1 | 0% | 3,056 | 4,022 | +32% | 0 | 0 | — |
case-10 | pass→pass | 10,975 | 8,876 | -19% | 1 | 1 | 0% | 1,645 | 3,871 | +135% | 0 | 0 | — |
case-11 | fail→pass | 9,160 | 3,716 | -59% | 1 | 1 | 0% | 1,470 | 3,106 | +111% | 0 | 0 | — |
case-12 | fail→pass | 7,028 | 2,768 | -61% | 1 | 1 | 0% | 1,143 | 2,963 | +159% | 0 | 0 | — |
case-13 | fail→fail | 8,003 | 2,270 | -72% | 1 | 1 | 0% | 1,307 | 2,861 | +119% | 0 | 0 | — |
case-14 | pass→pass | 7,746 | 2,251 | -71% | 1 | 1 | 0% | 1,279 | 2,771 | +117% | 0 | 0 | — |
case-16 | fail→pass | 9,692 | 3,210 | -67% | 1 | 1 | 0% | 1,595 | 3,030 | +90% | 0 | 0 | — |
case-17 | pass→pass | 9,233 | 3,000 | -68% | 1 | 1 | 0% | 1,401 | 2,993 | +114% | 0 | 0 | — |
case-18 | pass→pass | 7,831 | 2,595 | -67% | 1 | 1 | 0% | 1,148 | 2,885 | +151% | 0 | 0 | — |
case-19 | pass→pass | 9,841 | 3,977 | -60% | 1 | 1 | 0% | 1,668 | 3,058 | +83% | 0 | 0 | — |
case-22 | fail→fail | 6,693 | 9,314 | +39% | 1 | 1 | 0% | 1,007 | 3,940 | +291% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.