rabadon

overview / hooks

the six hooks, and what rabadon does at each

rabadon init merges these into .claude/settings.json. Each is a subprocess Claude Code invokes at a defined moment.

Claude Code hooks are one binding, not the product. rabadon's gate is a generic subprocess contract; any runtime that can run a subprocess before or after an action can implement it.

Upgrading an install that already exists

A hook subscription is written once, at install time. That makes "the binary is new, the subscription is old" a silent and permanent state, and on 2026-08-29 it was one: rabadon had learned PostToolUseFailure that morning, this machine's ~/.claude/settings.json had been written three days earlier, rabadon doctor reported "all green", and every command that exited non-zero was invisible. Shipped is not installed.

So the gate carries the upgrade. At SessionStart — the one event every install that has ever existed subscribes to — it compares what is registered against what the installer would write today, and re-registers the difference by calling the same installer rabadon init calls. Specifically:

commands

rabadon init · rabadon doctor