Delegate independent tasks to specialized agents working concurrently with isolated context.
Hook-Intercept-Block Pattern
hook-intercept-block
This skill should be used when implementing slash commands that execute without Claude API calls. Use when: adding a new /bumper-* command, understanding why commands return "block" responses, debugging UserPromptSubmit hooks, or learning the pattern for instant command execution. Keywords: UserP...
SKILL.md
Full skill instructions
Hook-Intercept-Block Pattern
Pattern for implementing slash commands that execute entirely in the hook handler, bypassing the Claude API call entirely.
Why Use This Pattern
- No API cost: Commands execute in Go, no Claude API call
- Faster: Direct execution vs markdown parsing + API round trip
- Deterministic: No model variance - same input, same output
How It Works
User types: /bumper-reset
↓
UserPromptSubmit hook fires
↓
prompt_handler.go matches regex: ^/(?:claude-bumper-lanes:)?bumper-reset\s*$
↓
handleReset() executes Go logic
↓
Returns JSON to stdout: {"decision":"block","reason":"Baseline reset. Score: 0/400"}
↓
Claude Code shows "reason" to user, skips API call
The Confusing Naming
Claude Code's hook response API uses counterintuitive terminology:
| Response | What It Actually Means |
|---|---|
decision: "block" | "I handled this, don't call Claude API" (NOT "blocked/rejected") |
decision: "continue" | "Let it through to Claude API" |
reason: "..." | Message shown to user (only with "block") |
Key insight: block = "handled and done", not "rejected". The command succeeded.
Implementation Components
- Hook config (
hooks.json): Routes UserPromptSubmit to handler binary - Handler (
internal/hooks/prompt_handler.go): Regex matching + dispatch - Command stubs (
commands/*.md): MUST exist for/helpdiscovery (body ignored)
Adding a New Command
Step 1: Add Regex Pattern
In prompt_handler.go:
var newCmdPattern = regexp.MustCompile(`^/(?:claude-bumper-lanes:)?bumper-foo\s*(.*)$`)
The (?:claude-bumper-lanes:)? makes the plugin namespace optional.
Step 2: Add Dispatch
In HandlePrompt():
if m := newCmdPattern.FindStringSubmatch(prompt); m != nil {
return handleFoo(sessionID, strings.TrimSpace(m[1]))
}
Step 3: Implement Handler
Use the helper functions for DRY session management:
func handleFoo(sessionID, args string) int {
sess := loadSessionOrBlock(sessionID)
if sess == nil {
return 0
}
// ... your logic here ...
if !saveOrBlock(sess) {
return 0
}
blockPrompt("Success message")
return 0
}
Step 4: Create Command Stub
Create commands/bumper-foo.md:
---
description: Does the foo thing
argument-hint: <optional-args>
---
This command is handled by the hook system.
The markdown body is ignored - the hook handles everything. The file MUST exist
for the command to appear in /help.
Step 5: Rebuild
just build-bumper-lanes
Helper Functions
Two helpers reduce boilerplate:
loadSessionOrBlock
func loadSessionOrBlock(sessionID string) *state.SessionState
Returns session state or nil. If nil, error already shown to user via blockPrompt().
saveOrBlock
func saveOrBlock(sess *state.SessionState) bool
Returns true on success. If false, error already shown to user via blockPrompt().
JSON Response Format
The UserPromptResponse struct:
type UserPromptResponse struct {
Decision string `json:"decision,omitempty"`
Reason string `json:"reason,omitempty"`
}
Output via blockPrompt():
func blockPrompt(reason string) {
resp := UserPromptResponse{
Decision: "block",
Reason: reason,
}
out, _ := json.Marshal(resp)
fmt.Println(string(out))
}
Existing Commands Using This Pattern
All bumper-lanes slash commands use hook-intercept-block:
| Command | Handler | Purpose |
|---|---|---|
/bumper-reset | handleReset() | Capture new baseline, reset score |
/bumper-pause | handlePause() | Disable enforcement |
/bumper-resume | handleResume() | Re-enable enforcement |
/bumper-view | handleView() | Set/show visualization mode |
/bumper-config | handleConfig() | Show/set threshold |
Debugging Tips
- Command not recognized: Check regex pattern matches user input exactly
- No output shown: Ensure
blockPrompt()is called and JSON printed to stdout - Command not in /help: Verify
commands/*.mdstub file exists - Binary not updated: Run
just build-bumper-lanesafter changes
More Other skills
brand-guidelines
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
theme-factory
Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.
internal-comms
A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).
Fundamental design principles for writing maintainable, testable Python code.
responsive-design
Modern responsive layouts using container queries, fluid typography, CSS Grid, and mobile-first strategies.
Generate Playwright tests from scenarios using interactive browser exploration and validation.
Automated website exploration and test case generation using Playwright.
Modern React state management with Redux Toolkit, Zustand, Jotai, and React Query for every state category.
gdpr-data-handling
GDPR-compliant data handling with consent management, data subject rights, and privacy controls.
Python error handling patterns including input validation, exception hierarchies, and partial failure handling. Use when implementing validation logic, designing exception strategies, handling batch processing failures, or building robust APIs.
refactor-plan
Detailed multi-file refactor planning with safety checks and rollback guidance.
