From 808ff802385ec53c53a006d0291b1ea47bb47fb6 Mon Sep 17 00:00:00 2001 From: Aditya Garud Date: Fri, 24 Jul 2026 23:35:49 +0530 Subject: [PATCH] Skip user hooks during Claude capability probes The periodic capability probe loads user, project, and local setting sources for slash-command discovery, which also ran the user's SessionStart hooks every few minutes. Pass disableAllHooks through the flag settings layer so probes stay quiet while command discovery keeps working. Fixes #3050 --- .../src/provider/Layers/ClaudeCapabilitiesProbe.test.ts | 9 +++++++++ apps/server/src/provider/Layers/ClaudeProvider.ts | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts b/apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts index ab6e5992990..7e5fa2611f0 100644 --- a/apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts +++ b/apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts @@ -30,6 +30,7 @@ it("isolates Claude capability probes without dropping workspace setting sources assert.equal(options.strictMcpConfig, true); assert.equal(options.cwd, "/workspace/project"); assert.deepEqual(options.settingSources, [...CLAUDE_CAPABILITIES_PROBE_SETTING_SOURCES]); + assert.deepEqual(options.settings, { disableAllHooks: true }); assert.deepEqual(options.allowedTools, []); assert.equal(options.persistSession, false); assert.equal(options.pathToClaudeCodeExecutable, "/usr/bin/claude"); @@ -133,6 +134,14 @@ it.layer(NodeServices.layer)("Claude capability probe SDK boundary", (it) => { assert.equal(invocation.mcpConfig, undefined); assert.equal(invocation.args.includes("--setting-sources=user,project,local"), true); + + const settingsFlagIndex = invocation.args.indexOf("--settings"); + assert.notEqual(settingsFlagIndex, -1); + // @effect-diagnostics-next-line preferSchemaOverJson:off + const flagSettings = JSON.parse(invocation.args[settingsFlagIndex + 1] ?? "{}") as { + readonly disableAllHooks?: boolean; + }; + assert.equal(flagSettings.disableAllHooks, true); }).pipe(Effect.scoped), ); }); diff --git a/apps/server/src/provider/Layers/ClaudeProvider.ts b/apps/server/src/provider/Layers/ClaudeProvider.ts index 2ea8aa7b4e1..80bd9b78337 100644 --- a/apps/server/src/provider/Layers/ClaudeProvider.ts +++ b/apps/server/src/provider/Layers/ClaudeProvider.ts @@ -534,6 +534,10 @@ export function buildClaudeCapabilitiesProbeQueryOptions(input: { pathToClaudeCodeExecutable: input.executablePath, abortController: input.abortController, settingSources: [...CLAUDE_CAPABILITIES_PROBE_SETTING_SOURCES], + // The probe keeps filesystem setting sources for slash-command discovery, + // but must not run the user's hooks: it fires every few minutes, so + // SessionStart hooks would run on every health check. + settings: { disableAllHooks: true }, allowedTools: [], // Ignore MCP definitions from every filesystem setting source above. The // SDK combines this empty explicit map with --strict-mcp-config.