Overview
WorkflowFramework ships IApprovalService and approval step support, but production channel implementations for sending approval requests and awaiting responses are missing (or not yet shipped as separate packages).
Context
JD.AI (src/JD.AI.Workflows) uses WorkflowFramework for deterministic agent orchestration and needs to wire human approval gates into PolicyDecision.RequireApproval decisions. Rather than implementing approval channels inside JD.AI, these should live upstream in WorkflowFramework as WorkflowFramework.Extensions.Approvals.* packages.
Goal
Ship production-ready IApprovalService implementations as separate, installable packages:
| Package |
Channel |
WorkflowFramework.Extensions.Approvals.Slack |
Slack interactive messages with Approve/Reject buttons |
WorkflowFramework.Extensions.Approvals.Teams |
Microsoft Teams adaptive cards |
WorkflowFramework.Extensions.Approvals.Email |
SMTP email with secure approval link |
WorkflowFramework.Extensions.Approvals.Cli |
Async CLI poller — wf approvals list/approve/reject |
Common Interface Requirements
public interface IApprovalChannel
{
Task<ApprovalResponse> RequestApprovalAsync(
ApprovalRequest request,
CancellationToken cancellationToken = default);
}
public record ApprovalRequest(
string Title,
string? Description,
IReadOnlyDictionary<string, object?> Context,
int RequiredApprovers, // Quorum
TimeSpan Timeout,
IReadOnlyList<string>? AllowedRoles
);
public record ApprovalResponse(
bool Approved,
string? Reason,
IReadOnlyList<ApprovalRecord> Approvals
);
Quorum Support
Currently unclear if IApprovalService supports N-of-M approvers. If not, add:
// In ApprovalRequest
int RequiredApprovers = 1; // How many distinct approvers needed
Approval completes when RequiredApprovers distinct approvers have responded, or when any approver rejects (configurable).
Timeout + Escalation
- Configurable timeout per request
- On timeout: configurable action (auto-reject, auto-approve, escalate to next channel)
- Escalation chain:
primary: slack → escalate_after: 4h → secondary: email
Acceptance Criteria
Overview
WorkflowFramework ships
IApprovalServiceand approval step support, but production channel implementations for sending approval requests and awaiting responses are missing (or not yet shipped as separate packages).Context
JD.AI (
src/JD.AI.Workflows) uses WorkflowFramework for deterministic agent orchestration and needs to wire human approval gates intoPolicyDecision.RequireApprovaldecisions. Rather than implementing approval channels inside JD.AI, these should live upstream in WorkflowFramework asWorkflowFramework.Extensions.Approvals.*packages.Goal
Ship production-ready
IApprovalServiceimplementations as separate, installable packages:WorkflowFramework.Extensions.Approvals.SlackWorkflowFramework.Extensions.Approvals.TeamsWorkflowFramework.Extensions.Approvals.EmailWorkflowFramework.Extensions.Approvals.Cliwf approvals list/approve/rejectCommon Interface Requirements
Quorum Support
Currently unclear if
IApprovalServicesupports N-of-M approvers. If not, add:Approval completes when
RequiredApproversdistinct approvers have responded, or when any approver rejects (configurable).Timeout + Escalation
primary: slack→escalate_after: 4h→secondary: emailAcceptance Criteria
IApprovalChannelabstraction (if not already in core package)IApprovalServiceWorkflowFramework.Extensions.Approvals.Slack— interactive message, button response, webhook receiverWorkflowFramework.Extensions.Approvals.Email— SMTP send, secure token link, response pollingWorkflowFramework.Extensions.Approvals.Cli— CLI approval poller for local/CI contextsApprovalResponseICheckpointStore)