How Reverse‑Skill's Priority‑Based Routing System Works in routing.json
Reverse‑Skill uses a three‑stage matching algorithm in skills/config/routing.json to select the most relevant skill: keyword matching, highest‑score selection, and priority‑list tie‑breaking.
The routing.json file serves as the single source of truth for determining which markdown skill file to invoke for a given reverse‑engineering or pentesting request. This article explains the priority‑based routing system by examining the actual JSON structure and the PowerShell scripts that execute the logic.
Routing.json Structure Overview
The configuration file contains four top‑level sections that control skill selection:
meta— Contains thefallbackId(defaultR0) and a human‑readable description of the scoring algorithmroutes— DefinesR1throughR41, each with keyword rules and a targetskillfile pathpriority— Ordered array that resolves ties when multiple routes achieve the same scoredefaultSkill— Fallback skill used when routing fails entirely
The meta.scoring field (line 6) explicitly documents the algorithm: candidates enter the pool when any keyword rule matches, the highest score wins, and the priority list breaks ties with earlier entries preferred.
Stage 1: Keyword Matching with Regex Rules
Each route contains a keywords array of rule objects. Every rule supports three matching conditions:
| Field | Purpose | Required |
|---|---|---|
must |
Regex that must match the request | Yes |
exclude |
Regex that must not match (filters false positives) | No |
mustAll |
Array of regexes where all must match | No |
A route receives a hit when any of its rules evaluates to true. The route's score equals its total number of matching rules across all keyword entries.
Consider route R1 for APK reverse engineering:
"R1": {
"keywords": [
{
"must": "\\bandroid\\b",
"exclude": "\\bios\\b",
"mustAll": ["\\bapk\\b", "\\breverse\\b"]
},
{
"must": "\\bsmali\\b"
}
],
"skill": "apk-reverse/SKILL.md"
}
The first rule requires "android" without "ios", plus both "apk" and "reverse". The second rule matches "smali" alone. If both rules match, R1 scores 2.
Stage 2: Candidate Scoring and Selection
After evaluating all routes, the engine builds a candidate set containing only routes with score > 0. The algorithm then:
- Finds the maximum score across all candidates
- Filters to routes achieving that maximum
- Uses the
priorityarray to select the first matching route
This prioritization mechanism ensures deterministic behavior when multiple routes are equally specific.
The priority array (truncated) appears as:
"priority": [
"R4",
"R1",
"R2",
"R3",
"R5",
"R6",
"R7",
"R8",
"R9",
"R10",
"R11",
"R12",
"R13",
"R14",
"R15",
"R16",
"R17",
"R18",
"R19",
"R20",
"R21",
"R22",
"R23",
"R24",
"R25",
"R26",
"R27",
"R28",
"R29",
"R30",
"R31",
"R32",
"R33",
"R34",
"R35",
"R36",
"R37",
"R38",
"R39",
"R40",
"R41",
"R0"
]
If R1 and R4 both score 2, R4 wins because it appears earlier in the priority list.
Stage 3: Fallback Handling
When no keyword rules match, the engine routes to meta.fallbackId (R0 by convention). Route R0 typically contains a generic skill or a request‑for‑clarification prompt.
The fallback ensures the system degrades gracefully rather than failing silently on ambiguous inputs.
Script Implementation in master-route.ps1
The routing logic executes in skills/scripts/master-route.ps1 (with a POSIX counterpart in master-route.sh). The script implements the algorithm as follows:
# Load routing configuration
$routing = Get-Content -Raw -Path "$PSScriptRoot/../config/routing.json" | ConvertFrom-Json
# Receive user hint via --hint parameter
$hint = $args | Select-String '^--hint=(.+)$' | ForEach-Object { $_.Matches.Groups[1].Value }
# Stage 1: Score all routes
$candidates = @()
foreach ($routeId in $routing.routes.Keys) {
$score = 0
$route = $routing.routes.$routeId
foreach ($rule in $route.keywords) {
$matchesMust = $hint -cmatch $rule.must
$notExcluded = !($rule.exclude) -or ($hint -cnotmatch $rule.exclude)
$allMustMatch = !($rule.mustAll) -or ($rule.mustAll | ForEach-Object { $hint -cmatch $_ } | Where-Object { $_ } | Measure-Object).Count -eq $rule.mustAll.Count
if ($matchesMust -and $notExcluded -and $allMustMatch) {
$score++
}
}
if ($score -gt 0) {
$candidates += [pscustomobject]@{
Id = $routeId
Score = $score
Skill = $route.skill
}
}
}
# Stage 2 & 3: Select by maximum score, priority tie‑break
if ($candidates.Count -eq 0) {
$selectedId = $routing.meta.fallbackId
} else {
$maxScore = ($candidates.Score | Measure-Object -Maximum).Maximum
$topCandidates = $candidates | Where-Object { $_.Score -eq $maxScore }
$selectedId = $routing.priority | Where-Object {
$_ -in ($topCandidates | Select-Object -ExpandProperty Id)
} | Select-Object -First 1
}
# Output the selected skill path
$routing.routes.$selectedId.skill
Invoke the router from the command line:
# Bash interface
./skills/scripts/master-route.sh --hint="android root detection bypass"
# PowerShell interface
.\skills\scripts\master-route.ps1 --hint="frida hook objective-c"
Maintaining Coherence with verify-routing-coherence.ps1
Human documentation in skills/MASTER-ROUTING.md includes a priority table matching the routing.json order. The skills/scripts/verify-routing-coherence.ps1 script prevents drift between these sources:
# Extract priority from routing.json
$jsonPriority = $routing.priority
# Parse MASTER-ROUTING.md table rows
$mdContent = Get-Content "$PSScriptRoot/../MASTER-ROUTING.md" -Raw
$mdPriority = [regex]::Matches($mdContent, '^\|\s*(\d+)\s*\|\s*(R\d+)\s*\|', 'Multiline') |
ForEach-Object { $_.Groups[2].Value }
# Compare sequences
if (Compare-Object $jsonPriority $mdPriority) {
Write-Error "Priority mismatch between routing.json and MASTER-ROUTING.md"
exit 1
}
Write-Host "Priority list is consistent."
Run verification during CI or local development:
powershell -File skills/scripts/verify-routing-coherence.ps1
Summary
- Keyword matching evaluates regex rules with
must,exclude, andmustAllconditions per route - Scoring counts total matching rules; highest score becomes primary candidate
- Priority array deterministically breaks ties by selecting the earliest‑listed route
- Fallback routing to
R0occurs when no keywords match - Coherence verification ensures documentation and configuration remain synchronized
Frequently Asked Questions
What happens when two routes have identical keyword scores?
The engine consults the priority array in routing.json. The route appearing earlier in this ordered list receives precedence. This design allows maintainers to prioritize more specialized skills over general ones without modifying keyword complexity.
How does the exclude pattern prevent false positives?
The exclude field contains a regex that must not match for the rule to succeed. For example, an Android route can exclude \bios\b to prevent iOS‑related requests from incorrectly matching Android patterns when both platforms share terminology.
Can I test routing behavior without executing actual skills?
Yes. The repository includes skills/scripts/test-routing.sh and test-routing.ps1 for automated regression testing. These scripts feed known hints through the router and assert expected skill selections, validating that priority order and keyword logic remain correct after configuration changes.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →