Skip to content

postToolUse hook deadlocks after write-permission request, process spins at 99% CPU and ignores SIGTERM #3084

Description

@CianH

Describe the bug

A resumed Copilot CLI session entered a permanent deadlock after dispatching the postToolUse hook for an edit tool call that triggered a PermissionService write request. The process burned a full CPU core at 99% for 10 days before I noticed. It accepted no further input, produced no further log output, and ignored SIGTERM. Only kill -9 terminated it.

Affected version

1.0.35.2 (per the debug log header: github_copilotcli_cliversion=1.0.35.2)

Steps to reproduce the behavior

I cannot construct a deterministic reproduction. The deadlock happened spontaneously inside a long-running --resume session. The freeze coincides exactly with the dispatch of a postToolUse hook following a PermissionService write request:

  1. Run copilot --resume=<session-id> against any session
  2. Use the session normally for ~2 hours
  3. At some point the agent issues an edit tool call against a local file
  4. The tool call routes through PermissionService (kind=write)
  5. postToolUse hook dispatch begins — no further log lines are ever written
  6. The process continues running at 99% CPU and ignores SIGTERM

Expected behavior

  • The postToolUse hook should complete (or fail with a logged error) and return control to the event loop.
  • The process should remain responsive to SIGTERM.

Additional context

Sanitised log around the freeze point (last 14 lines before logging stops; process kept running for 10 days after this):

01:16:02.773Z [DEBUG] Forwarding event for session <id>: assistant.message
01:16:02.773Z [DEBUG] Forwarding event for session <id>: tool.execution_start
01:16:02.773Z [DEBUG] Forwarding event for session <id>: hook.start
01:16:02.773Z [DEBUG] Dispatching preToolUse hook for session <id>
01:16:02.791Z [DEBUG] Forwarding event for session <id>: hook.end
01:16:02.791Z [DEBUG] Tool calls count: 1
01:16:02.791Z [DEBUG] Running tool calls in parallel
01:16:02.791Z [DEBUG] Adding operation to queue. Current queue length: 0
01:16:02.791Z [DEBUG] Processing operation. Remaining queue length: 0
01:16:02.791Z [DEBUG] edit: <local-file>
01:16:02.792Z [DEBUG] Permission request (kind=write): routing via PermissionService
01:16:02.793Z [DEBUG] Operation completed. Remaining queue length: 0
01:16:02.793Z [DEBUG] Forwarding event for session <id>: hook.start
01:16:02.794Z [DEBUG] Dispatching postToolUse hook for session <id>
[no further log output for 10 days while process spins at 99% CPU]

The edit tool call's Operation completed reaches the queue cleanup BEFORE the postToolUse hook is dispatched — but the postToolUse line is the last log entry. Looks like the hook dispatch entered a state from which control never returned.

Coincident factor (may or may not be related): safari-mcp MCP child process had been logging WebKit memory warnings in the hour leading up to the freeze:

00:19:35Z [ERROR] [mcp server safari-mcp stderr] WebKit memory warning: 2126MB (threshold 2100MB, limit 3000MB) — 0 MCP tabs open
00:39:35Z ... 2689MB ...
00:45:05Z ... 2195MB ...
01:03:26Z ... 2242MB ...
01:08:26Z ... 2750MB ... (8 minutes before main process freeze)

The 2750MB warning at 01:08:26 was 8 minutes before the freeze. Could be a stuck IPC between the main copilot process and an OOM-distressed safari-mcp child — but this is speculation; the freeze pattern in the log is consistent with a pure permission-prompt deadlock too.

SIGTERM behaviour: kill <pid> had no effect on the deadlocked process. Only kill -9 terminated it. The main event loop should remain responsive to SIGTERM even during hook dispatch.

Environment:

  • macOS, Apple Silicon
  • Node v24.11.1
  • Copilot plan: enterprise
  • Process accumulated ~49 hours of single-core CPU time over 10 calendar days before being killed

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:permissionsTool approval, security boundaries, sandbox mode, and directory restrictionsarea:pluginsPlugin system, marketplace, hooks, skills, extensions, and custom agents

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions