Skip to content

Scheduled task tool approvals cannot be approved by any user #741

@Aaronontheweb

Description

@Aaronontheweb

Summary

When a scheduled task (reminder/routine) triggers a tool call that requires approval, no user can approve it. The approval prompt appears but clicking the button or typing approval text results in:

⚠️ Only the requesting user can approve this tool action.

Root Cause

Scheduled tasks set SenderId = "reminder-system" as a hardcoded value in ReminderExecutionActor.cs:

var source = new MessageSource
{
    SenderId = "reminder-system",  // Lines 161, 211
    // ...
};

When the tool execution pipeline creates an approval request, it copies this sender ID:

// SessionToolExecutionPipeline.cs:227
RequesterSenderId = source?.SenderId,  // Gets "reminder-system"

The approval handlers in SlackThreadBindingActor.cs then reject any approval attempt because no human user has the Slack ID "reminder-system":

// Lines 1124-1132, 1176-1181
if (!string.Equals(pending.Request.RequesterSenderId, message.SenderId, ...))
{
    await SafePostAsync(":warning: Only the requesting user can approve this tool action.");
}

Proposed Fix

Remove the RequesterSenderId matching requirement entirely. Anyone with access to the channel should be able to approve any tool call in that channel.

Rationale:

  • Channel membership is already the trust boundary
  • Scheduled tasks have no meaningful human requester
  • Reduces friction when the original requester is AFK
  • The approval response already logs who approved (audit trail preserved)

Files to Change

  • src/Netclaw.Channels.Slack/SlackThreadBindingActor.cs - Remove sender ID checks in TryHandleApprovalResponseAsync and HandleApprovalResponseAsync
  • Apply same pattern to Discord integration when merged

Reproduction

  1. Create a scheduled task that will invoke a tool requiring approval
  2. Wait for the task to execute
  3. Attempt to approve the tool call
  4. Observe the warning message blocking approval

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingremindersReminder scheduling, execution, and historysessionsLLM session actor, turn lifecycle, pipelines

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions