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.