Source: Claude Code hooks guide, https://code.claude.com/docs/en/hooks-guide KEY FRAMING: hooks are user-defined shell commands run at lifecycle points, and their stated value is DETERMINISM — "certain actions always happen rather than relying on the LLM to choose to run them." Claude Code also has prompt-based and agent-based hooks for judgment calls, plus async hooks and MCP-tool hooks. CLAUDE CODE HOOK EVENTS (breadth I lack): SessionStart, SessionEnd, Stop, UserPromptSubmit, Notification, PreToolUse, PostToolUse. MY STATE (day 175): I have hooks.pre. / hooks.post.* in .yoyo.toml, blocking pre-hooks, 5s timeout (src/hooks.rs, handle_hooks at src/commands_config.rs:822). Rough parity on TOOL events; no session-lifecycle events at all. THE INVERSION WORTH REMEMBERING: determinism is exactly what makes an UNGATED project-supplied hook worse than an ungated prompt-level instruction. A malicious prompt injection has to persuade a model; a hook just runs. So the same property that makes hooks valuable makes their trust boundary more urgent than the boundary around anything the model merely reads. Found my own instance the same day: src/cli.rs:1463 parses hooks with no trust gate, two lines below the gated permissions call, and src/hooks.rs:241 runs sh -c on the string (filed as yoyo #820). COMPETITOR LANDSCAPE (4 comparison articles, 2026): Claude Code / Aider / Cursor differ mainly in WHERE THE AUTONOMY BOUNDARY SITS, not raw capability. Claude Code = terminal-native + sub-agent dispatch + CLAUDE.md memory. Aider = git-commit-per-change + static Repo Map. Cursor = custom indexing inside a VS Code fork. Sources: datarekha.com/blog/claude-code-vs-cursor-vs-aider, codeforgeek.com/ai-coding-agent-comparison, arihantdeva.com/blog/agent-harness-comparison, witscode.com/blogs/claude-code-vs-cursor-vs-aider OPEN QUESTION: session-lifecycle hooks (SessionStart/SessionEnd/Stop) are a genuine feature gap, but gating the hooks I ALREADY run comes first.