Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Creates behavioral rules in markdown to block dangerous commands or restrict AI behavior. Use when adding safety guardrails or preventing specific commands.
.claude/skills/athola-writing-rules/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 174% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 60% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 46% | 0% |
Hookify rules are markdown files with YAML frontmatter that define patterns to watch for and messages to show when those patterns match. Rules are stored in .claude/hookify.{rule-name}.local.md files.
Create .claude/hookify.dangerous-rm.local.md:
yaml--- name: dangerous-rm enabled: true event: bash pattern: rm\s+-rf action: block --- 🛑 **Dangerous rm command detected!** This command could delete important files.
Verification: Run the command with --help flag to verify availability.
The rule activates immediately - no restart needed!
name (required): Unique identifier (kebab-case) enabled (required): true or false event (required): bash, file, stop, prompt, or all action (optional): warn (default) or block pattern (simple): Regex pattern to match
For multiple field checks:
yaml--- name: warn-env-edits enabled: true event: file action: warn conditions: - field: file_path operator: regex_match pattern: \.env$ - field: new_text operator: contains pattern: API_KEY --- 🔐 **API key in .env file!** Ensure file is in .gitignore.
regex_match: Pattern matchingcontains: Substring checkequals: Exact matchnot_contains: Must NOT containstarts_with: Prefix checkends_with: Suffix checkbash events: command file events: file_path, new_text, old_text, content prompt events: user_prompt stop events: transcript
\s - whitespace\d - digit\w - word character. - any character (use \. for literal dot)+ - one or more* - zero or more| - ORrm\s+-rf → rm -rf
console\.log\( → console.log(
chmod\s+777 → chmod 777bashpython3 -c "import re; print(re.search(r'pattern', 'text'))"
yaml--- name: block-destructive enabled: true event: bash pattern: rm\s+-rf|dd\s+if=|mkfs action: block --- 🛑 **Destructive operation blocked!** Can cause data loss.
yaml--- name: warn-debug enabled: true event: file pattern: console\.log\(|debugger; action: warn --- 🐛 **Debug code detected!** Remove before committing.
yaml--- name: require-tests enabled: true event: stop action: warn conditions: - field: transcript operator: not_contains pattern: pytest|npm test --- ⚠️ **Tests not run!** Please verify changes.
yaml--- name: protect-prod enabled: true event: file action: block conditions: - field: file_path operator: regex_match pattern: /production/|\.prod\. --- 🚨 **Production file!** Requires review.
Enable/Disable: Edit .local.md file: enabled: false
Delete:
bashrm .claude/hookify.my-rule.local.md
List:
bash/hookify:list
If a rule doesn't trigger, verify that the event type matches the tool being used (e.g., use bash for command line tools). Check that the regex pattern is valid and matches the target text by testing it with a short Python script. If you encounter permission errors when creating rule files in .claude/, ensure that the directory is writable by your user.
.claude/hookify.<rule-name>.local.mdwith all required frontmatter fields present: name (kebab-case), enabled, event, and either pattern or conditions
python3 -c "import re; print(re.search(r'<pattern>', '<test>'))" before the rule is saved; no untested patterns shipped
warn actionshows the message body, block action prevents the operation
tested with at least one known-safe example
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | pass→pass | 6,579 | 2,369 | -64% | 1 | 1 | 0% | 1,208 | 1,938 | +60% | 0 | 0 | — |
case-01 | fail→pass | 24,099 | 7,165 | -70% | 1 | 1 | 0% | 1,051 | 2,884 | +174% | 0 | 0 | — |
case-02 | fail→fail | 22,236 | 6,003 | -73% | 1 | 1 | 0% | 948 | 2,744 | +189% | 0 | 0 | — |
case-03 | fail→pass | 8,905 | 5,213 | -41% | 1 | 1 | 0% | 1,563 | 2,496 | +60% | 0 | 0 | — |
case-04 | fail→pass | 11,579 | 7,988 | -31% | 1 | 1 | 0% | 2,200 | 2,897 | +32% | 0 | 0 | — |
case-05 | fail→pass | 7,947 | 4,883 | -39% | 1 | 1 | 0% | 1,222 | 2,338 | +91% | 0 | 0 | — |
case-06 | pass→pass | 18,405 | 11,617 | -37% | 1 | 1 | 0% | 3,816 | 3,154 | -17% | 0 | 0 | — |
case-07 | fail→pass | 12,323 | 7,149 | -42% | 1 | 1 | 0% | 2,018 | 2,954 | +46% | 0 | 0 | — |
case-08 | fail→pass | 12,831 | 4,195 | -67% | 1 | 1 | 0% | 2,133 | 2,373 | +11% | 0 | 0 | — |
case-09 | fail→pass | 4,856 | 1,630 | -66% | 1 | 1 | 0% | 819 | 1,865 | +128% | 0 | 0 | — |
case-10 | pass→pass | 7,001 | 2,527 | -64% | 1 | 1 | 0% | 1,266 | 1,996 | +58% | 0 | 0 | — |
case-11 | fail→fail | 14,935 | 4,861 | -67% | 1 | 1 | 0% | 2,578 | 2,405 | -7% | 0 | 0 | — |
case-12 | pass→pass | 12,935 | 1,971 | -85% | 1 | 1 | 0% | 2,318 | 1,875 | -19% | 0 | 0 | — |
case-13 | fail→pass | 7,926 | 1,542 | -81% | 1 | 1 | 0% | 1,252 | 1,794 | +43% | 0 | 0 | — |
case-14 | fail→pass | 5,166 | 1,625 | -69% | 1 | 1 | 0% | 799 | 1,813 | +127% | 0 | 0 | — |
case-15 | fail→pass | 12,122 | 2,052 | -83% | 1 | 1 | 0% | 2,272 | 1,847 | -19% | 0 | 0 | — |
case-16 | pass→pass | 7,732 | 1,892 | -76% | 1 | 1 | 0% | 1,389 | 1,889 | +36% | 0 | 0 | — |
case-18 | pass→pass | 7,704 | 1,330 | -83% | 1 | 1 | 0% | 1,224 | 1,772 | +45% | 0 | 0 | — |
case-19 | fail→pass | 11,547 | 1,588 | -86% | 1 | 1 | 0% | 1,924 | 1,849 | -4% | 0 | 0 | — |
case-20 | pass→pass | 17,003 | 2,651 | -84% | 1 | 1 | 0% | 3,009 | 1,863 | -38% | 0 | 0 | — |
case-21 | fail→pass | 14,041 | 2,131 | -85% | 1 | 1 | 0% | 2,225 | 1,939 | -13% | 0 | 0 | — |
case-22 | fail→pass | 6,640 | 3,073 | -54% | 1 | 1 | 0% | 1,252 | 2,196 | +75% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.