Agent Guardrails Test
Verify that the installed stop-guardrails.sh hook catches all nine rules by sending test phrases through it.
Workflow
Step 1: Check Hook Installation
Verify the hook is installed and executable:
if [ ! -x .claude/hooks/stop-guardrails.sh ]; then
echo "FAIL: .claude/hooks/stop-guardrails.sh not found or not executable"
exit 1
fi
if ! cat .claude/settings.local.json 2>/dev/null | jq -e '.hooks.Stop' > /dev/null 2>&1; then
echo "FAIL: No Stop hook configured in .claude/settings.local.json"
exit 1
fi
If either check fails, tell the user to run /agent-guardrails:install first. Do not proceed.
Step 2: Run Tests
For each rule, send two test phrases through the hook individually. Each test is a separate bash command:
result=$(echo '{"last_assistant_message": "TEST_PHRASE"}' | bash .claude/hooks/stop-guardrails.sh)
if echo "$result" | grep -q '"decision"'; then
echo "PASS: TEST_PHRASE"
else
echo "FAIL: TEST_PHRASE — expected block, got: $result"
fi
Stop on first failure. Do not continue after a FAIL.
Test phrases (2 per rule)
no-guessing:
I think the issue is in the parser.This should fix the problem.
no-stalling:
Before I proceed, there are a few things to consider.Let me take a step back and think about this.
no-preference-asking:
Would you like me to refactor this?Should I proceed with the fix?
no-false-completion:
Everything is working now.The implementation is complete.
no-skipping:
The rest looks fine.For brevity, I'll skip the details.
no-dismissing:
It's just a warning.Safe to ignore.
no-cosmetic:
This is a cosmetic issue.The change is cosmetically identical.
no-caveats:
One caveat: the parser only handles UTF-8.There are a few caveats worth mentioning.
no-flagging:
Just to flag, the config file has a duplicate key.I have flagged the version mismatch.
Negative tests (must NOT be blocked)
After all positive tests pass, run these. Each must return {}:
result=$(echo '{"last_assistant_message": "TEST_PHRASE"}' | bash .claude/hooks/stop-guardrails.sh)
if echo "$result" | grep -q '"decision"'; then
echo "FAIL (false positive): TEST_PHRASE — got: $result"
else
echo "PASS (clean): TEST_PHRASE"
fi
Fixed the null pointer and pushed.The function returns the expected value.Updated the retry logic to handle timeouts.The test suite runs in 4.2 seconds.Added the --json flag to the command.The feature flag is disabled in production.
Tests 5 and 6 guard no-flagging against matching flag as a noun.
Step 3: Report Results
Agent Guardrails Test Results
| Rule | Test 1 | Test 2 |
|------|--------|--------|
| no-guessing | PASS | PASS |
| no-stalling | PASS | PASS |
| no-preference-asking | PASS | PASS |
| no-false-completion | PASS | PASS |
| no-skipping | PASS | PASS |
| no-dismissing | PASS | PASS |
| no-cosmetic | PASS | PASS |
| no-caveats | PASS | PASS |
| no-flagging | PASS | PASS |
| Negative tests | 6/6 clean |
All N tests passed.
If any test failed, show which phrase and rule failed and stop there.