Skillens
A Hermes plugin that checks whether the agent actually does what a loaded skill says.
Skills tell the agent what to do. Nothing checks that it did it. The agent reads a
SKILL.md, answers you fluently, and quietly skips the numbered steps: doesn't run the
test suite, doesn't read the reference file, takes shortcuts you only catch later.
Skillens watches every tool call, matches it against the steps of every skill loaded
in the session, and shows you the result live.
What it does

- Listens to every tool call and every skill load (two hooks:
post_tool_calland
pre_llm_call). It observes only. It never blocks or changes a tool call. - When a skill loads, it pulls the numbered steps out of that SKILL.md.
- Each step is matched against the session's recorded tool calls. Did the command it
names actually run? Was the file it names actually read? - The result shows up in a desktop pane: one checklist per skill, green for a step
with evidence, red for a step without. - If a required step has no evidence by the agent's next turn, Skillens appends one
short correction to the turn's context naming the step. The agent then does it, or
tells you why it doesn't apply. Each step gets nudged at most once per session. - A status bar chip shows the fidelity number at a glance:
◎ 85%. - A second view counts repeated tool calls in the session, so you can see rework.


Steps with no evidence turn red. That is the whole product.
Install
hermes plugins install skillens
Then open Settings → Plugins and toggle it on. Desktop halves of agent packages ship
opt-in by design.
Requirements
- Hermes Desktop (the pane and the chip live there)
- Skills you load through
skill_view— that is the only feed it reads
Privacy and disclosures
- Reads: tool call names, arguments, and truncated results from your own sessions.
Stored in<hermes home>/plugin-data/skillens/data.dbon your machine. Nothing
leaves this machine. The plugin makes no network requests. - The pane polls
/api/plugins/skillens/stateon localhost only. - Sidebar entry and a full-page view at
/skillens, same data as the pane. - Disable it any time from Settings → Plugins; the hooks stop on toggle.
Files
plugin.yaml manifest (2 hooks)
__init__.py hook registration, errors swallowed by design
core.py trace store (SQLite), step parser, evidence matcher, snapshot
dashboard/ one read-only API route backed by the trace store
desktop/plugin.js the pane, the status chip, the route page, the sidebar entry
desktop/live_viewer.py optional: view the same store in a browser (localhost:8791)
How it checks
Matching is deterministic token overlap against the session's recorded tool calls.
No LLM judge, no API cost, no extra model calls. A step it cannot read never
triggers a false alarm; the matcher fails quiet.
License
MIT
README from the reviewed commit b788910; it updates when the author re-pins.
PhucNguyen-Dev