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
- Create a scheduled task that will invoke a tool requiring approval
- Wait for the task to execute
- Attempt to approve the tool call
- Observe the warning message blocking approval
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:
Root Cause
Scheduled tasks set
SenderId = "reminder-system"as a hardcoded value inReminderExecutionActor.cs:When the tool execution pipeline creates an approval request, it copies this sender ID:
The approval handlers in
SlackThreadBindingActor.csthen reject any approval attempt because no human user has the Slack ID"reminder-system":Proposed Fix
Remove the
RequesterSenderIdmatching requirement entirely. Anyone with access to the channel should be able to approve any tool call in that channel.Rationale:
Files to Change
src/Netclaw.Channels.Slack/SlackThreadBindingActor.cs- Remove sender ID checks inTryHandleApprovalResponseAsyncandHandleApprovalResponseAsyncReproduction