{"record":{"id":"4d5a56ce8d71fb31","repo":"deepseek-ai/deepseek-harness","slug":"hooks-claude-code-skipping-unsupported-s-type","errorCode":null,"errorMessage":"hooks-claude-code: skipping unsupported \"${s.type}\" hook on ${s.event} (only command hooks run)","messagePattern":"hooks-claude-code: skipping unsupported \"(.+?)\" hook on (.+?) \\(only command hooks run\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/hooks/hooks-claude-code/src/index.ts","lineNumber":111,"sourceCode":"  }\n}\n\nexport function apply(ctx: Context, config: Config): void {\n  // Validate before config parsing so a bad value cannot be hidden by its early return.\n  const stderrSummaryMaxChars = config.stderrSummaryMaxChars ?? DEFAULT_STDERR_SUMMARY_MAX_CHARS\n  assertPositiveInteger('stderrSummaryMaxChars', stderrSummaryMaxChars)\n  const defaultTimeoutMs = config.defaultTimeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS\n  // Parse once at load. A read or parse failure logs and registers nothing.\n  let parsed: ClaudeCodeHookConfig = {}\n  try {\n    const raw: unknown = JSON.parse(readFileSync(config.configPath, 'utf8'))\n    const result = parseClaudeCodeConfig(raw, {\n      ...config.pluginRoot !== undefined ? { pluginRoot: config.pluginRoot } : {},\n      ...config.projectDir !== undefined ? { projectDir: config.projectDir } : {},\n    })\n    parsed = result.config\n    for (const s of result.skipped) {\n      ctx.logger.warn(`hooks-claude-code: skipping unsupported \"${s.type}\" hook on ${s.event} (only command hooks run)`)\n    }\n  } catch (error: unknown) {\n    ctx.logger.warn(`hooks-claude-code: could not load hook config \"${config.configPath}\": ${String(error)} — no hooks registered`)\n    return\n  }\n\n  // Emit-shaped points run detached, so track their chains; disposal aborts\n  // active hooks and drains continuations before resolving.\n  const detached = createDetachedRuns()\n  // Only the start edge guarantees registry access. Retain each local child\n  // through its paired end so stop hooks keep the session workspace after the\n  // handle unregisters the agent. Every retained entry relies on that paired\n  // end; a producer that can omit it must provide another release edge.\n  const subagentChildren = new Map<SubagentRunId, Agent>()\n  ctx.effect(() => () => detached.drain(), 'hooks-claude-code: drain detached hook runs')\n\n  /**\n   * Run every command hook configured for `point` whose matcher selects","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/hooks/hooks-claude-code/src/index.ts#L93-L129","documentation":"Error \"hooks-claude-code: skipping unsupported \"${s.type}\" hook on ${s.event} (only command hooks run)\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/hooks/hooks-claude-code/src/index.ts:111 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Change the hook to a command hook; only command hooks run for the Claude Code bridge."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}