ReadonlyblockedTrue iff the hook denied the call (exit 2 / decision:block / permissionDecision:deny).
ReadonlyeventReadonlyexitThe hook process exit code (1 ≠ block — the classic false-confidence bug).
ReadonlyranWhether the hook was RUN for this event at all — false when its declared condition (VerifyGuardrailOptions.condition) does not match, so the harness would never spawn it here.
🔴 A NOT-RUN EVENT IS A MISS, and separating it out is the point. Before this
existed the battery could only ask "did it block?", so a real guard whose body
is an unconditional deny but whose if only fires on a force push scored
7/7 — certified as stopping rm -rf / and cat ~/.ssh/id_rsa. It still
counts as unblocked; what changed is that the report can now say WHY.
ReadonlyreasonWhy the hook ran or did not — the condition verdict, always present.
The result of feeding one disaster event to a hook.