From armory
Outcome-weighted selector ranking armory packages for tasks by historical pass rates from eval history (dist/router_index.json). Memento-Skills read phase; triggers on 'route this task', 'best package for'. Falls back to static /route.
npx claudepluginhub mathews-tom/armory --plugin armoryhaikuGiven a task prompt, returns the ranked set of armory packages most likely to handle it successfully. Ranking is driven by observed outcomes from `evals/history.jsonl`, not by matching the task against package descriptions. This is the read half of the Memento-Skills reflective loop (arXiv 2603.18743) — the write half lives in the `skill-librarian` agent and `immune` skill. The router is a **ch...
Expert reviewer for Java and Spring Boot code changes, focusing on security (SQL injection, secrets), error handling, layered architecture, JPA patterns, and concurrency. Delegate for all Java diffs.
Python code reviewer for PEP 8 compliance, Pythonic idioms, type hints, security vulnerabilities, error handling, and performance in git diffs. Runs static tools like ruff, mypy, pylint, bandit.
Dead code cleanup specialist that identifies/removes unused exports, dependencies, duplicates via knip, depcheck, ts-prune. Verifies references, runs tests, refactors safely in batches.
Given a task prompt, returns the ranked set of armory packages most likely to
handle it successfully. Ranking is driven by observed outcomes from
evals/history.jsonl, not by matching the task against package descriptions.
This is the read half of the Memento-Skills reflective loop
(arXiv 2603.18743) — the write half lives in the skill-librarian agent and
immune skill.
The router is a cheap retrieval step, not a reasoning step. It is intentionally a Haiku agent: the decision is a lookup and rank, not an open inference problem.
/route with a task and wants outcome-weighted results rather
than the static decision treeteam-lead) needs to pre-filter candidate
packages before delegationdist/router_index.json) exists and is non-empty/route directly)skill-library skill)search_packages MCP tool)dist/router_index.json is missing or empty — in that case, defer to
/route and do not fabricate rankings| Input | Required | Description |
|---|---|---|
| Task prompt | Yes | The user's task description. Used to compute a task signature for index lookup. |
| Top K | No | Max packages to return (default 5). |
| Confidence min | No | Minimum signature-match confidence to trust the index (default 0.5). |
| Component | Type | Invoked In | Purpose |
|---|---|---|---|
| (none) | — | — | The router is leaf-level; it does not orchestrate other packages. |
The router reads dist/router_index.json directly. It does not invoke Python
scripts at runtime — the index is built by scripts/build_router_index.py on
a nightly schedule (see .github/workflows/router-index.yml).
scripts/task_signature.py. For reference, the rules are:
no_signature and defer to /route.dist/router_index.json. If the file is missing, exit with verdict
no_index and defer to /route.index. If a match exists, it is the
highest-confidence bucket — use it directly.low_confidence and
defer to /route.(signature_similarity × pass_rate × log(1 + sample_count)). Merge
entries across buckets by summing weighted scores per package, then sort
descending.top_k (default 5).Return a structured response:
verdict: exact_match | fuzzy_match | no_signature | no_index | low_confidence
task_signature: "<canonical signature>"
confidence: 0.0-1.0
packages:
- package_path: skills/foo
pass_rate: 0.83
sample_count: 42
rank_score: 0.76
- package_path: agents/bar
pass_rate: 0.72
sample_count: 18
rank_score: 0.61
fallback: true | false # true when verdict is no_signature/no_index/low_confidence
If fallback is true, also include a pointer to the /route command:
"Index-based routing unavailable — use /route <task> for the static
decision tree."
| Artifact | Format | Description |
|---|---|---|
| Router response | YAML | Structured rank list with verdict and confidence |
| Trace log | None | The router is stateless — it writes nothing to disk |
/route with the original
task./route and returns a
fallback verdict — not an invented list..github/workflows/router-index.yml for the nightly rebuild.package-evaluator) or downstream (in the caller that acts on the rank
list)./route command is the baseline,
not an error path. A router that returns verdict: no_index with a
pointer to /route is operating correctly, not failing.scripts/build_router_index.py. If the schema changes, both files must
be updated in the same commit.