Skill and hook bugs that fail quietly
None of the skill and hook bugs below threw an error. A rule was skipped, a check passed when it should have failed, or a hook looked like it blocked something and didn't. These are the ones I found, in other people's skills and in my own skill loader, with what to test for.
Three bugs in my own skill loader
I run a small hook that suggests a skill when a prompt contains one of its trigger phrases. Measuring it in September 2026 turned up three bugs.
It read only the first line of a folded description. Many skills write their description as a folded YAML block:
description: >
first line of the description
second line, often where the trigger phrases are
My parser kept the first line and dropped the rest. Fifteen skills had every trigger phrase they declared silently thrown away. Fixing the parser moved phrase coverage from 51% to 57% without touching a single skill file. If you have any tool that reads skill descriptions, test it on a folded block.
It treated a mention as a request. A sentence that only named a skill in passing ("…applied to every workflow, like caveman or rtk") fired that skill.
A size cap skipped the skill without saying so. For one experiment the hook pasted a skill's whole body into the prompt, up to 8,000 bytes. When that skill grew from 5,049 to 8,678 bytes, the hook got an empty body back and quietly fell back to printing the name. Six of the 29 days of the experiment are void because nothing logged the skip. The fix was a higher cap and a log row for every skip.
Hooks that look finished and aren't
Wrong exit code. In disler/claude-code-hooks-mastery, the Stop check that should stop a session when a plan file is missing printed {"result": "block", …} and exited 1. Claude Code treats exit 1 as a non-blocking error. It only blocks on "decision": "block" with exit 0, or on exit 2. So the check never stopped anything.
An approver that trusts the first word. The same repo's permission auto-approver, with its --auto-allow flag, approved ls && rm -rf ~ and git status; git reset --hard HEAD~3 because each started with a safe command.
Bad input is an error, not a block. In emaarco/agento-patronum, non-JSON input made jq fail and the hook exited 5. Claude Code reads that as a hook error and lets the call through. The repo now lives in emaarco/hogwarts, where the hook is part of Protego Totalum. When I re-read it in November, the README had been corrected to say only printenv is blocked, so that mismatch is fixed (env and set still pass). On 14 November 2026 I ran the current hook against fake calls in a macOS sandbox (no network, writes only to scratch folders, throwaway HOME). Plain text, a truncated event, a bare array and a bare string all exit 5, and an empty input exits 0, so none of them is blocked. Its log writes six lines per block because jq runs without -c: all 21 blocks in that run wrote six, so wc -l on the log gives the wrong count.
Skills that contradict themselves
The create-plan command in ParadevAI/Paradev says "Do not implement until approved" and also "do not prompt the user… Resolve ambiguities autonomously". It also says the YYYYMMDD-HHmm naming "sorts most recent to oldest", which is backwards: that format sorts oldest first. A model following both halves has to guess.
Scripts that fail with exit code 0
xbtlin/ai-berkshire ships Python checks for its research skills. A market cap 11% off printed a red warning and exited 0, so an agent only notices if it reads the text. The written rule flags sources that differ by more than 1%, and the tool's default is 2%, so a 1.5% gap printed "all consistent". The report auditor approved a number checked against a single source that said 200 when the report said 100.
Skills wired to someone else's folders
The cleanup skills in devdotfast/whiteboard name one folder of the author's app and kit components that only exist there. Run anywhere else, the diff they review is empty and they report nothing. The idea transfers, which is to search the codebase for an existing version before writing a new one. The files don't.
What to test
- Feed every hook a blocked case, an allowed case and a malformed input, and check the exit code, not the printed text.
- Run each check script on input that should fail, and check that it exits non-zero.
- Read a skill's rules for pairs that can't both hold.
- If something injects or loads a skill, log every skip with its reason.
Tiếng Việt