Skip to content

Slack: show immediate thinking acknowledgement for accepted inbound messages #1

Description

@taariq

Problem

When a user mentions a managed employee such as Prime in Slack, the channel can remain visually silent until the whole model/tool run finishes. Users cannot distinguish a healthy, accepted request from a dead Socket Mode receiver.

This is distinct from serenorg/seren-core#260: #260 makes a failed ingress worker observable and recoverable; this issue exposes accepted/running state to the Slack user.

Proposed behavior

Add an immediate :eyes: reaction to each valid, non-self-authored, allowlisted inbound Slack message before the event is handed to the managed runtime. Treat reaction failure as a fail-open UX error: log it, but never drop or fail the inbound event.

State contract for v1:

  • no :eyes: within about two seconds: ingress is unavailable or the event was rejected
  • :eyes: present, no reply yet: the Slack plugin received and queued the request; downstream work may be running or waiting
  • reply present: the channel turn completed

A later lifecycle enhancement may remove :eyes: on reply or replace it with a warning on terminal failure, but that is not required for the first shippable acknowledgement.

Implementation notes

  • Add Slack Web API reactions.add support in channels/slack/src/slack_api.rs.
  • Trigger it only after inbound event type, self-author, team, and sender-policy checks pass.
  • Use Slack event.ts, not client_msg_id; the reactions API requires the message timestamp. Preserve that timestamp in event metadata for future lifecycle updates.
  • Keep the call fail-open and redact token/content from all errors.
  • The existing Equi Prime manifest already requests reactions:write; deployment should still verify the installed token scope.

Acceptance criteria

  • A valid human app_mention gets exactly one :eyes: reaction before model completion.
  • Reaction uses event.ts even when client_msg_id is present.
  • Self-authored, hidden, unsupported, disallowed-team, and disallowed-sender events never receive a reaction.
  • Slack API failure does not suppress the inbound event and produces a content-free diagnostic.
  • Slack retries do not create duplicate visible reactions or fail event processing.
  • Two mentions received while an earlier run is busy can each be acknowledged immediately.
  • Unit/integration tests cover success, rejection, timestamp selection, and fail-open behavior.
  • Live acceptance is performed only in Equi #test-agent-prime (C0BJSQDLURY); never in the production team channel.

Metadata

Metadata

Assignees

Labels

area: slackSlack channel pluginaudited code-pathsRelevant implementation and history have been auditedbugSomething isn't workingenhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions