Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add gtapps/claude-code-hermit/plugin install claude-code-hermitWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/gtapps/claude-code-hermit/channel-responder)<a href="https://agentmods.dev/skills/gtapps/claude-code-hermit/channel-responder"><img src="https://agentmods.dev/badge/skills/gtapps/claude-code-hermit/channel-responder.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00024 | $0.08116 |
| Opus 5 | $0.00012 | $0.04058 |
| Sonnet 5 | $0.00005 | $0.01623 |
| Haiku 4.5 | $0.00002 | $0.00812 |
Grade B, and why
channel-responder scanned grade B with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Subtle steeringmediumPrompt injection
Instructions that bias recommendations or shape behaviour without the user noticing.
- A harness command with **neither** line was not recorded: usually it arrived while a turn was in flight and was absorbed as steering text, so ask the operator to send it again now that you are idle. Never tell them to How it starts
The opening of the file, as written. The whole thing — 311 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Channel Responder
When a message arrives via a channel:
0. Reply via the channel
Every response to a message wrapped in <channel source="..." chat_id="..." ...>
goes through the channel's reply tool, not the terminal/transcript.
Terminal output is invisible to the operator: they read Discord, Telegram, or
the configured channel, never the raw transcript.
For each channel plugin, the reply tool is the reply action exposed by the
channel's MCP server, named mcp__plugin_<plugin-name>_<server-name>__reply —
the two segments are exactly the plugin name and server name the harness puts in
the plugin-qualified source on the wire (source="plugin:<plugin-name>:<server-name>").
For the built-in channels the two coincide (e.g. plugin:discord:discord →
mcp__plugin_discord_discord__reply), but a custom channel plugin whose names
differ fills each slot from its own wire segment (e.g. plugin:acme-crm:crm →
mcp__plugin_acme-crm_crm__reply) — build the tool name from the raw source,
not by doubling one segment. Every config.channels key below instead uses the
normalized bare server name (discord, not the qualified string — see
lib/channel-envelope.ts's normalizeChannelSource). Pass the
inbound chat_id back. Optionally pass reply_to (the inbound message_id)
to thread under the operator's message.
Terminal output is acceptable as a SECONDARY surface (tool-call narration, status visible only to a maintainer at the box). The substantive response, the one the operator needs to see, must go through the channel.
Exception, checked first. When this turn's context carries a
[harness-command] … requested line, stop: no tool call (§1–§1d included) and no
reply; the reason is in §2's Harness command bullet. A [harness-command] refused "…"
line is the opposite case: nothing was recorded and the operator is owed the reason,
so reply as usual.
1. Load Context
Read .claude-code-hermit/sessions/SHELL.md for current task context.
Read state/runtime.json for lifecycle state (session_state is the source of truth — never parse SHELL.md Status: for decisions).
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today Changed · +5 lines 1630eb6a5dc3
- yesterday Changed 0a812f7a40c6
- 3d ago Changed · -11 lines de24a00fb6b2
- 4d ago Changed · +10 lines scan A → B 92195e08b777
- 7d ago First seen · 307 lines · 24 tokens per session scan A 163d41b7fdde
channel-responder is a skill published in the GitHub repository gtapps/claude-code-hermit (74 stars, last pushed today), licensed MIT. It adds 24 tokens to every session and 8,116 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it B with 1 finding (subtle steering). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
symfony:doctrine-events
React to Doctrine entity lifecycle in Symfony with attribute listeners (#[AsDoctrineListener]/#[AsEntityListener], ORM 3) and lifecycle callbacks.
symfony:api-platform-dto-resources
Map entities to API DTOs in API Platform v4 with the Symfony Object Mapper (#[Map], stateOptions) for decoupled input/output contracts.
symfony:api-platform-filters
Implement API Platform filters - v4 Parameters API (QueryParameter) and legacy.
symfony:api-platform-versioning
Evolve API Platform APIs via deprecation (deprecationReason/sunset, RFC 8594/9745), the recommended alternative to versioning; plus path/header strategies.
symfony:config-env-parameters
Manage Symfony configuration with .env files, parameters, secrets vault, and environment-specific settings.
symfony:controller-cleanup
Refactor fat controllers into lean ones by extracting business logic to services, handlers, and invokable commands.