# NousResearch/hermes-agent · Discord deferred "thinking..." indicator lingering after slash commands

## Open now

- Nothing open on GitHub.

The three members all concern the Discord deferred "thinking..." indicator remaining after a slash command's final message, with one bug report and two pull requests proposing fixes. Their titles do not show whether the problem is confirmed fixed or what the final outcome is.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #3674. Verify it addresses your case.
- **Recommended:** read PR #3674 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-3674`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #3595: \[Bug\]: Discord gateway: "thinking..." deferred response indicator persists after final message is sent

## Prior & competing PRs

- **#3674: fix(discord): clean up deferred "thinking..." after slash commands complete**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `gateway/platforms/discord.py`
  - fix hunks:
  - `gateway/platforms/discord.py`

    ```diff
    @@ -1429,15 +1429,23 @@ async def _run_simple_slash(
             command_text: str,
             followup_msg: str | None = None,
         ) -> None:
    -        """Common handler for simple slash commands that dispatch a command string."""
    +        """Common handler for simple slash commands that dispatch a command string.
    +
    +        Defers the interaction (shows "thinking..."), dispatches the command,
    +        then cleans up the deferred response.  If *followup_msg* is provided
    +        the "thinking..." indicator is replaced with that text; otherwise it
    +        is deleted so the channel isn't cluttered.
    +        """
             await interaction.response.defer(ephemeral=True)
             event = self._build_slash_event(interaction, command_text)
             await self.handle_message(event)
    -        if followup_msg:
    -            try:
    -                await interaction.followup.send(followup_msg, ephemeral=True)
    -            except Exception as e:
    -                logger.debug("Discord followup failed: %s", e)
    +        try:
    +            if followup_msg:
    +                await interaction.edit_original_response(content=followup_msg)
    +            else:
    +                await interaction.delete_original_response()
    +        except Exception as e:
    +            logger.debug("Discord interaction cleanup failed: %s", e)
     
         def _register_slash_commands(self) -> None:
             """Register Discord slash commands on the command tree."""
    ```

    ```diff
    @@ -1462,9 +1470,7 @@ async def slash_model(interaction: discord.Interaction, name: str = ""):
             @tree.command(name="reasoning", description="Show or change reasoning effort")
             @discord.app_commands.describe(effort="Reasoning effort: xhigh, high, medium, low, minimal, or none.")
             async def slash_reasoning(interaction: discord.Interaction, effort: str = ""):
    -            await interaction.response.defer(ephemeral=True)
    -            event = self._build_slash_event(interaction, f"/reasoning {effort}".strip())
    -            await self.handle_message(event)
    +            await self._run_simple_slash(interaction, f"/reasoning {effort}".strip())
     
             @tree.command(name="personality", description="Set a personality")
             @discord.app_commands.describe(name="Personality name. Leave empty to list available.")
    ```

    ```diff
    @@ -1537,9 +1543,7 @@ async def slash_reload_mcp(interaction: discord.Interaction):
                 discord.app_commands.Choice(name="status — show current mode", value="status"),
             ])
             async def slash_voice(interaction: discord.Interaction, mode: str = ""):
    -            await interaction.response.defer(ephemeral=True)
    -            event = self._build_slash_event(interaction, f"/voice {mode}".strip())
    -            await self.handle_message(event)
    +            await self._run_simple_slash(interaction, f"/voice {mode}".strip())
     
             @tree.command(name="update", description="Update Hermes Agent to the latest version")
             async def slash_update(interaction: discord.Interaction):
    ```
- **#3615: fix(discord): resolve deferred "thinking..." indicator after slash commands**. closed without merge
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `#3674`

## Fix status

- Merged to main in PR #3674 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-03-29`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
- Subsystem: `gateway`
