--- type: reference title: "Claude Code hook lifecycle — which events can inject model-visible context" summary: "Which Claude Code hook events can emit additionalContext the model acts on (SessionStart, UserPromptSubmit, PreCompact) versus events that can only run deterministic scripts (SessionEnd) or fire per-turn (Stop), and why session-close rituals must be user-invoked skills rather than hook injections." tags: - type/reference - tool/claude-code - domain/context-engineering scope: global date: 2026-07-10 last_updated: 2026-07-10 related: - "[[claude-code-system-prompt-customization-surface]]" - "[[memsearch-sessionstart-injection-hardcoded]]" --- # Claude Code hook lifecycle — which events can inject model-visible context Not all hook events can put instructions in front of the model. Grouped by capability: ## Can inject `additionalContext` the model acts on - **SessionStart** — fires on `startup|resume|clear|compact` (matcher-selectable). Including `compact` in the matcher makes injected rules survive context compaction, not just the first turn. - **UserPromptSubmit** — per-prompt injection; the mid-session injection point. - **PreCompact** — can shape what survives compaction. ## Cannot instruct the model - **SessionEnd** — fires *after* the model's last turn. There are no more turns, so emitted content is never seen by the model. Only useful for deterministic scripts: sync, cleanup, journaling. - **Stop** — fires when Claude finishes *every* turn and can block/redirect, but it is per-turn (noisy) — wrong for once-per-session rituals. ## Consequence A "session-close ritual" (commit + update docs + write handoff) **cannot be a hook injection** — there is no injection point at session end. It must be a user-invoked skill/command (e.g. a `/wrap` skill) whose file holds the ritual instructions. Corollary design pattern: a SessionStart composer hook (script reads prompt files from a directory, concatenates, emits as `additionalContext`) is the right home for always-true session rules; session-*end* model behavior always routes through a command the user types.