Follow Discord
Sweep 27 Oct 2026 · 19:04Z Build v2.1.312 531 read Stable v2.1.308 Latest v2.1.312 Next v2.1.312 Feeds RSS JSON llms.txt llms-full.txt Unofficial
One change · claude-code

Manage mods for your organization changedplugins/mods/admin

Nearest release: v2.1.311, published 3 hours after upstream edited the page. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.

Upstream edited this page at 26 Oct 2026 16:46 UTC, give or take a minute or two: the time comes from Anthropic’s own sitemap rather than from a commit. This site recorded the change at 26 Oct 2026 17:07 UTC.

Upstream edited
Recorded here
Lines+38added
Lines−1removed
From line 91 where the diff opens
First seen 1 Oct 2026 this site's first read of the page
Recorded edits16to this page, all time

### Know which hooks of a user's mod don't run

The whole hunk

from line 91, old and new numbered
/
lines
from line 91
9191 
9292None of these controls sandboxes a mod. A mod you allow runs as the user, with the user's access to files, processes, and the network.
9393 
94### Know which hooks of a user's mod don't run
95 
96Where the [built-in guard](#know-what-happens-by-default) loads, a hook that a user's mod registers on one of these events never runs, and `/plugin` tells that user so in a note. In the [`session.append`](https://code.claude.com/docs/en/plugins/mods/reference#session) rows, `door` is the kind of stored row the hook is filtered to.
97 
98| Hook on | What the event is |
99| :- | :- |
100| [`classic.<Event>`](https://code.claude.com/docs/en/plugins/mods/events#hook-the-settings-hook-events), such as `classic.Stop` | A [settings hook event](https://code.claude.com/docs/en/hooks.md#hook-events) |
101| [`prompt.compose`](https://code.claude.com/docs/en/plugins/mods/reference#prompts-and-what-claude-reads) | The system prompt's list of sections |
102| `prompt.section` | One section of the system prompt |
103| `prompt.context` | The context sent with a conversation's first message |
104| `prompt.attachment` | A message Claude Code adds for Claude, such as a reminder |
105| `skill.prompt` | A skill's text as it's expanded for Claude |
106| `attribution.text` | Commit or pull request attribution text |
107| [`session.compact`](https://code.claude.com/docs/en/plugins/mods/reference#session) | A compaction of the conversation |
108| `settings.read` | A read of settings, such as a mod's `$.settings.read` call |
109| `session.append{door=attachment}` | The stored row for a message Claude Code adds for Claude |
110| `session.append{door=hook-context}` | The stored row for context from a settings hook |
111| `session.append{door=compaction}` | The stored rows for a compaction's summary and boundary |
112 
113The guard also passes over a user's hooks in some other cases, such as the descriptions of your organization's tools, on [`tool.describe`](https://code.claude.com/docs/en/plugins/mods/reference#tools), and the stored row for a skill's text. `/plugin` shows no note for those. If a hook on another event does nothing, see [Find out why a mod does nothing](https://code.claude.com/docs/en/plugins/mods/troubleshoot.md#find-out-why-a-mod-does-nothing).
114 
115The note appears in the plugin's details and in the **Errors** tab of `/plugin`. It requires Claude Code v2.1.299 or later. It names each hook from the table as the mod registered it, as in this example:
116 
117```text theme={null}
118Its hooks on classic.Stop, prompt.section do not run here: where an organization manages Claude Code, these events pass over the plugins you install
119Only a plugin that counts as your organization's own runs hooks on these events. An administrator sets that up in managed settings
120```
121 
122To let these hooks run, change managed settings in one of two ways:
123 
124* **Run the mod as your organization's**: [install the mod so that it counts as yours](#install-your-organizations-mods). Its hooks on these events then run, and the guard stays loaded for every other mod. The mod turns on for everyone who receives these settings, and it has to sit in a directory you place on each machine. If you list it in `prependPlugins`, keep `sec-default@builtin` in the list.
125* **Remove the guard**: leave `sec-default@builtin` out of `prependPlugins`. An empty list, `"prependPlugins": []`, is enough. You lose the whole guard, not only these events. A user's mod can then do what [the guard otherwise stops it from doing](#know-what-happens-by-default), and [the guard's options](#set-options-on-the-built-in-guard) don't apply.
126 
127If you deliver a list without the guard through [server-managed settings](https://code.claude.com/docs/en/server-managed-settings.md#fetch-and-caching-behavior), the guard stays loaded until the server confirms the settings for the session. To confirm either change on a machine that runs v2.1.299 or later, open `/plugin` in a session there and check that the note is gone.
128 
129A `session.append` hook with no `door` filter still runs and gets no note, but the stored rows in the table don't reach it.
130 
94131## Decide whether to leave mods on
95132 
96133A mod can do more than the other parts of a plugin because it runs inside Claude Code. It sees every prompt and tool call, can change them, and can allow or deny a tool call before a permission prompt appears.
from line 175
138175| `$.prompt.submit` | Submits a prompt, and can send it as the user's own words |
139176| `$.session.send` | Sends a message that another session's, subagent's, or [teammate's](https://code.claude.com/docs/en/agent-teams.md) Claude reads |
140177 
141In the `hooks:` line, [`tool.call`](https://code.claude.com/docs/en/plugins/mods/reference#tools) and [`prompt.submit`](https://code.claude.com/docs/en/plugins/mods/reference#prompts-and-what-claude-reads) mean the mod sees every tool call and every prompt, and can change them. [`session.append`](https://code.claude.com/docs/en/plugins/mods/reference#session) means the mod can rewrite each row of the conversation before it's stored. [`ui.render{component=AskUserQuestion}`](https://code.claude.com/docs/en/plugins/mods/interface#change-what-claude-code-already-draws) means the mod can redraw the dialog Claude uses to ask the user a question. `tool.check` means the mod can approve or deny a tool call before a permission prompt appears. [Know what happens by default](#know-what-happens-by-default) lists which of your rules and hooks take precedence over its answer.
178In the `hooks:` line, [`tool.call`](https://code.claude.com/docs/en/plugins/mods/reference#tools) and [`prompt.submit`](https://code.claude.com/docs/en/plugins/mods/reference#prompts-and-what-claude-reads) mean the mod sees every tool call and every prompt, and can change them. [`session.append`](https://code.claude.com/docs/en/plugins/mods/reference#session) means the mod can rewrite each row of the conversation before it's stored, apart from [the rows the guard passes over](#hooks-the-guard-passes-over). [`ui.render{component=AskUserQuestion}`](https://code.claude.com/docs/en/plugins/mods/interface#change-what-claude-code-already-draws) means the mod can redraw the dialog Claude uses to ask the user a question. `tool.check` means the mod can approve or deny a tool call before a permission prompt appears. [Know what happens by default](#know-what-happens-by-default) lists which of your rules and hooks take precedence over its answer.
142179 
143180## Choose how much to allow
144181 
Feedback