Use when a tool error begins with "INTERCEPTOR:", a sent message was silently hedged or rewritten, or the user asks about active guards or blocked actions. Not for ordinary tool errors.
Install
npx skillscat add bitterbot-ai/bitterbot-desktop/pre-action-interceptors Install via the SkillsCat registry.
Pre-action interceptors (PLAN-20)
You have a layer of deterministic pre-action interceptors that sit between your candidate tool calls and their execution. They are skill-owned guardrails that read your current state (hormonal, GCCRF, channel, recent turns) and may rewrite, inject context into, require a prerequisite for, or block any tool call you propose. They are not bugs in the tool; they are intentional behaviour.
Reading a directive
When you see a tool error that begins with INTERCEPTOR: followed by a structured directive such as:
INTERCEPTOR: recall-before-claim: ground the assertion "X" before sending
BEFORE you call `send_message` again, you MUST first call:
tool: memory_search
args: {"query": "X", "limit": 5}that is not a failure. It is a deterministic instruction from your skill system telling you to run the named tool first, then re-evaluate whether the original action still applies. Follow it without commentary; the user does not need to see the directive.
When a tool call succeeds but the params were silently rewritten (for example a confident claim hedged into a probabilistic one), an interceptor in the calibrate-claim-confidence family adjusted the outgoing text to match your actual epistemic state. This is intentional; do not reverse it.
Built-in interceptors
recall-before-claim: requires amemory_searchbefore you send a message containing an unverified factual assertion.route-by-query-shape: requiresdeep_recallinstead ofmemory_searchfor relationship-shaped queries.protocol-quiet-in-groups: blockssend_messagein group channels when you were not @mentioned and recently spoke.calibrate-claim-confidence: hedges confident absolutes when your GCCRF empowerment is low.
Observability
Operators see every firing in the Active Guards UI panel and via the guards.status RPC. To know which interceptors have fired this session, call memory_status; the activations are reflected in the intervention-records summary.