The two halves: events and decisions
Hook events are when the tripwire fires (Claude Agent SDK event union): pre-action (PreToolUse, UserPromptSubmit, PermissionRequest),
post-action (PostToolUse, PostToolUseFailure), lifecycle (SessionStart,
SessionEnd, Stop), subagent (SubagentStart, SubagentStop), plus
PreCompact and Notification.
Hook decisions are what the hook says back — the rows you see on the
Anthropic provider page:
What works today (honest status)
Hooks are currently runtime-level, not workflow-level. There are no hook
fields in
workflow.md frontmatter yet, and Cadence does not construct hook
callbacks at dispatch. That is why every hook row carries the
partial-compatible badge: the SDK surface is real and plumbed, the
deeda-authored policy path is not wired yet.- Native Claude Code harness mode — shell hooks defined in Claude
settings (
settingSources: [project, local], i.e. your project’s.claude/settings.json) fire normally when the harness drives Claude Code natively. This is where hooks are stored and persisted: in the project/local settings files, versioned with your repo — not in workflow markdown, not in a deeda database. - In-band hook steering — deeda’s autopilot workflows instruct agents to treat PreToolUse hook output and Cadence policy blocks as authoritative: stop the unsafe action, record the policy-block text in the workpad, correct, retry. The reaction policy lives in workflow markdown prose; the enforcement lives in the hook.
hooks: in workflow frontmatter and have
Cadence enforce it per-run across providers. When that lands it will appear
in the Workflow Schema — if the field is not
there, it is not real.
Example: a project hook (works today, native mode)
.claude/settings.json in your repo:
When to use hooks vs alternatives
See also
- Vendor reference: Claude Agent SDK hooks
- Anthropic capability rows — per-event status
- Workflow Schema — the authoritative field list