Skip to main content
Kestrel workflows let you chain AI-powered actions across 15+ integrations into automated pipelines. Workflows are triggered by events — Kubernetes incidents, cloud alerts, Slack messages, PagerDuty alerts, and more — and execute a sequence of steps that investigate, fix, and notify.

Creation Methods

You can create workflows five ways:

Workflow Agent

Describe the workflow you want in plain English. The Workflow Agent interprets your intent, selects the right triggers and actions, wires up template variables, and generates a complete workflow on the canvas.
1

Open the workflow builder

Navigate to Workflows → All Workflows in the Kestrel dashboard and click Create Workflow.
2

Describe your workflow

Type a natural language description of what you want automated. Be specific about the trigger, the actions, and where results should go.
3

Review and adjust

The Workflow Agent generates the workflow on the canvas. Review each step and iterate the prompt to adjust configuration, add, or remove steps as needed.
4

Save and enable

Click Save to activate the workflow. It will begin responding to its configured trigger immediately.
Example prompts:
  • “When a K8s incident is detected, run root cause analysis, send the RCA to #incidents in Slack, and create a Jira ticket with the details.”
  • “When someone requests a new service in Slack, generate the K8s manifests, open a GitOps PR in GitHub, and sync with ArgoCD.”
  • “When a Vercel deployment fails, pull the build logs, run an AI investigation, and notify the team in Slack.”
  • “When a Railway service crashes, fetch the logs, investigate the root cause, roll back to the previous deployment, and alert #platform in Slack.”
  • “When AWS costs spike, run a cost anomaly analysis and post a report to #finops in Slack.”
The more specific your description, the better the generated workflow. Include the trigger source, desired actions, and output destinations.

Drag-and-Drop Canvas

The visual canvas gives you full control over workflow construction. Add triggers and actions from the sidebar, connect them into a pipeline, and configure each step individually.

Adding a Trigger

Every workflow starts with a trigger. Drag a trigger block from the sidebar onto the canvas and configure it:
  1. Select the trigger type (e.g., Pod CrashLoopBackOff, IAM Security Event, Slack Request)
  2. Configure trigger-specific settings (clusters, namespaces, AWS accounts, severity thresholds)
  3. The trigger’s output variables become available to all downstream steps

Adding Actions

Drag action blocks onto the canvas and connect them to the trigger or to previous actions:
  1. Select the action type (e.g., Kestrel RCA, Slack Message, GitHub PR)
  2. Configure action parameters — use the variable picker to reference data from previous steps
  3. Connect the action’s output port to the next step’s input port

Connecting Steps

Click an output port and drag to an input port to create a connection. Data flows top-to-bottom through the connections you define.

Trigger Types

Kubernetes Signals

Triggered when Kestrel detects a K8s incident in a connected cluster. Configure filters by cluster, namespace, or incident type.

AWS Cloud Signals

Triggered when Kestrel detects a cloud infrastructure incident. Filter by AWS account, region, or incident type.

Schedule

Triggered on a recurring cadence rather than by an external event. Ideal for periodic cost reports, cleanup scans, and audits. Configure the interval (hourly, daily, weekly, or monthly), the time of day (UTC), and — for weekly/monthly schedules — the day of week or day of month. Scheduled triggers expose {{signal.schedule_interval}}, {{signal.fired_at}}, and {{signal.fired_date}} to downstream steps.

Slack Requests

Triggered when a user sends a /kestrel-workflow command in Slack. The user’s message is available as {{request.prompt}}.

PagerDuty

Triggered when a PagerDuty incident is created or updated. Filter by service, urgency, or severity.

PostHog

Triggered by PostHog product analytics events. Filter by event type and properties.

Vercel

Triggered by Vercel deployment and platform events. Filter by project and event type.

Railway

Triggered by Railway deployment and platform events. Filter by project, environment, and event type.

Fly.io

Triggered by Fly.io machine lifecycle changes. Fly.io has no outbound webhooks, so Kestrel detects these events by polling the Fly Machines API and diffing machine state on a configurable interval. Filter by app, region, and event type, and set the poll cadence (1m / 5m / 15m / 30m).

Nebius AI Cloud

Triggered by Nebius GPU/compute and Managed Kubernetes node changes. Nebius has no outbound webhooks, so Kestrel detects these events by polling the Nebius compute and Managed Kubernetes APIs and diffing instance state and node conditions on a configurable interval. Filter by project, cluster, and event type, and set the poll cadence (1m / 5m / 15m / 30m).

Jenkins

Triggered by Jenkins build lifecycle events, delivered by a webhook notification plugin (or a post-build curl step) authenticated with a per-tenant shared secret. Filter by job name (full path for folder-nested jobs) and build status.

CircleCI

Triggered by CircleCI’s native outbound webhooks (workflow-completed / job-completed), signed with HMAC-SHA256 and verified by Kestrel. Filter by project slug, branch, and status.

Terraform Cloud

Triggered by Terraform Cloud (HCP Terraform) run lifecycle and drift events, delivered by per-workspace notification configurations (webhooks) signed with HMAC-SHA512 and verified by Kestrel. Filter by workspace, event type, and run status.

Pulumi Cloud

Triggered by Pulumi Cloud stack, update, deployment, drift, and policy events, delivered by organization or stack webhooks signed with HMAC-SHA256 (Pulumi-Webhook-Signature) and verified by Kestrel. Filter by stack (project/stack reference), project, and event type.

Custom Webhook

Triggered by an HTTP POST to a unique webhook URL. Accepts any JSON payload with optional HMAC signature verification. See Custom Integrations for details.

Action Types

Actions are grouped by integration. Each action produces output variables that downstream steps can reference.
https://mintcdn.com/kestrelai/JbUAbfQFj7mgzc4Q/logo/icon.svg?fit=max&auto=format&n=JbUAbfQFj7mgzc4Q&q=85&s=df8db0a7b5b5d2773e58894bd595c389

Kestrel

Trigger K8s RCA & Generate Fix, Apply YAML Fix, Find Causal PRs/MRs, Trigger Cloud RCA & Generate Fix, Generate Runbook, Wait, Generate K8s Manifest, Apply K8s Manifest, Create GitOps PR, Generate Helm Values, Generate Cloud Resource, Execute Cloud CLI, Create IaC PR, Investigate Cloud, Investigate Kubernetes, AI Cost Analysis

GitHub

Create Pull Request, Create Issue, Trigger GitHub Action, Wait for GitHub Action Run, Get GitHub Action Status, Read File, Search Code, AI Code Investigation, AI Code Fix, Wait for PR Approval, Wait for PR Merge

GitLab

Create Merge Request, Create Issue, Trigger Pipeline, Wait for Pipeline, Get Pipeline Status, Wait for MR Approval, Wait for MR Merge

Slack

Send Message, Update Message, Request Justification

Confluence

Publish RCA, Publish Postmortem, Publish Runbook Entry, Update Page

Jira

Create Ticket, Add Comment, Transition Ticket

Linear

Create Issue, Add Comment, Update Issue, Search Issues

PagerDuty

Create Alert, Acknowledge Alert, Add Note to Alert, Resolve Alert, Escalate

ArgoCD

Trigger ArgoCD Sync, Wait for ArgoCD Sync, Get ArgoCD App Status

Jenkins

Trigger Build, Wait for Build, Get Build Status, Stop Build, Get Console Log, Investigate Jenkins

CircleCI

Trigger Pipeline, Wait for Pipeline, Get Workflow Status, Rerun Workflow, Cancel Workflow, Approve On-Hold Job, Get Job Test Results, Investigate CircleCI

Datadog

Query Metrics, Create Monitor, Send Event, Mute Monitor

Cloud Cost

Query Cost Explorer, Get Cost Anomalies, Get Cost Forecast, Get Budget Status, Get Rightsizing Recommendations, Get Savings Plans Recommendations, Get Reservation Recommendations, Get Commitment Utilization, Compare Cost Periods, Find Idle Resources, Get Compute Optimizer Recommendations, Get Trusted Advisor Cost Checks, Stop EC2 Instances, Delete Unattached EBS Volumes, Release Elastic IPs, Delete Old Snapshots

PostHog

Get Session Summary, Get Session Recording, Query Events, List Session Recordings, Get Error Issue

Vercel

Get Deployment, Get Build Logs, Rollback Production, Promote to Production, List Deployments, Investigate Vercel

Railway

Get Deployment, Get Deployment Logs, Rollback, Redeploy, Restart, List Deployments, Set Variables, Investigate Railway

Fly.io

Restart Machine, Start Machine, Stop Machine, Suspend Machine, Cordon Machine, Uncordon Machine, Get Machine, Get Machine Events, List Machines, Set Secrets, Investigate Fly

Nebius AI Cloud

Get Instance, Start Instance, Stop Instance, Restart Instance, List Instances, List Clusters, List Node Groups, Scale Node Group, Investigate Nebius

Terraform Cloud

List/Get Workspace, Lock/Unlock/Force-Unlock Workspace, List/Get Run, Create Run (Plan), Create Destroy Run, Apply Run, Discard Run, Cancel Run, Wait for Run, Get State Outputs, List Variables, Set Variable, Get Drift Assessment, Investigate Terraform

Pulumi Cloud

List/Get Stack, List/Get Update, Run Deployment, Get/Wait for/Cancel Deployment, Pause/Resume Deployments, Get Stack Outputs, Get Drift Status, Set/Delete Stack Tag, Investigate Pulumi

Approval Gates

Wait for Manual Approval, Wait for Slack Approval, Wait for PR/MR Approval, Refine RCA with Feedback

Custom HTTP & Webhooks

Create custom action blocks to call any API endpoint, and custom webhook triggers to start workflows from external systems. See Custom Integrations.
The Cloud Cost remediation blocks (Stop EC2 Instances, Delete Unattached EBS Volumes, Release Elastic IPs, Delete Old Snapshots) mutate real infrastructure. Always place them behind an Approval Gate. Resources tagged kestrel:protected are always skipped, every remediation block is pinned to an explicit region, and safety caps limit how many resources a single run can touch.

Template Variables

Template variables let you pass data between workflow steps. Use double curly braces to reference outputs from triggers and previous actions.

Variable Syntax

Common Variables

Variable Picker

When configuring an action step, click the Variables button on any text field to open the variable picker. It shows all available variables from the trigger and preceding steps, grouped by source. The picker is DAG-aware — it only shows variables that will be available at runtime based on the step’s position in the workflow.
The variable picker only shows variables that are available at the current step’s position in the workflow. Move a step earlier or later to change which variables it can access.

Cooldown Configuration

Cooldowns prevent a workflow from firing repeatedly for the same event. Configure the cooldown period per workflow.
Cooldowns are scoped to the specific trigger event. For K8s incidents, the cooldown applies per workload. For Slack requests, it applies per request.

Approval Gates

Insert approval gates between steps to require human sign-off before the workflow continues. Three approval methods are available:

Wait for Manual Approval

The workflow pauses and shows a pending approval in the Kestrel dashboard. An authorized user clicks Approve or Reject.

Wait for Slack Approval

The workflow posts an approval request to a configured Slack channel with Approve and Reject buttons. Any member of the channel can respond.

Wait for PR/MR Approval

The workflow waits for the associated pull request or merge request to be approved or merged (webhook-driven). Merging the PR approves the step; closing it rejects it.

Refine RCA with Feedback (human-in-the-loop)

A self-looping review gate for incident-response workflows. Place it after a Trigger K8s RCA or Trigger Cloud RCA step. It presents the root cause and proposed fix for review with three outcomes:
  • Approve — continues on the approved branch (e.g. apply the fix, publish the runbook).
  • Reject — continues on the rejected branch.
  • Request changes — you provide free-text guidance (“the real cause is the readiness probe timeout, not the image tag”), and the RCA agent re-runs with your feedback and comes back for review again. Feedback accumulates across rounds, so each pass builds on the last.
The loop repeats until you approve or reject, capped by Max Refine Rounds (default 5). When the cap is hit, the workflow advances on the approved branch. Choose Kestrel UI or Slack as the review channel in the block config.

Poll Until (Loops)

The Poll Until block (Flow Control) repeatedly runs a single catalog action at a fixed interval and evaluates an exit condition against each iteration’s output. It’s the building block for “wait for X to reach state Y” automation — waiting for a sandbox to stop, a deployment to become healthy, a pipeline to finish, or a cloud resource to reach a target state. Drag Poll Until from the sidebar (next to Conditions) onto the canvas, then configure:
  • Action to Poll — any catalog action (searchable dropdown). Its config fields appear below and behave exactly like the standalone action block, including dynamic dropdowns (e.g. Cluster → Namespace scoping) and template variables.
  • Output Field Path — which output field of the polled action to test, chosen from the action’s known outputs.
  • Operator + Valueequals, not_equals, contains, not_contains, exists, not_exists. Where the output has known discrete values (states, statuses) or refers to live resources (cluster IDs), the Value field is a dropdown. You can select multiple values: equals/contains are met when the output matches ANY selected value; not_equals/not_contains are met only when it matches NONE.
  • Poll Interval — how often to re-run the action (default 60s, minimum 30s).
  • Timeout — how long to keep polling (default 60 minutes).
The block has two outgoing branches:
  • met — the exit condition held on some iteration; downstream steps see the final iteration’s output.
  • timeout — the timeout elapsed before the condition was met.
Polling is durable. The loop’s schedule is persisted server-side, so a server restart mid-interval resumes the countdown where it left off instead of restarting the interval — and in-flight loops survive redeployments.

For Each (Fan-Out)

The For Each block (Flow Control) resolves a list from an upstream step’s output at runtime and runs a single catalog action once per element, in order. It’s the building block for “do X for every Y” automation — creating a Jira ticket for each new audit finding, sending a message per failed service, or opening an issue for every flagged resource — without knowing the number of items in advance. Drag For Each from the sidebar (Flow Control) onto the canvas, then configure:
  • Items to Iterate Over — a template that resolves to a list, e.g. {{step_outputs.action-1.outputs.new_findings}} from an Execute Script step that wrote an array to its outputs. JSON-encoded array strings and comma-separated strings also work.
  • Action per Item — any catalog action (searchable dropdown). Its config fields appear below and behave exactly like the standalone action block. Inside these fields, three extra template variables are available:
    • {{item}} — the current element (rendered as JSON when it’s an object)
    • {{item.<field>}} — a field of the current element, e.g. {{item.title}}
    • {{item_index}} — the zero-based index of the current element
  • Max Items — caps the fan-out (default 25, hard cap 100). Extra items are skipped and the aggregated output is marked truncated.
  • Continue on Error — when enabled, a failed item doesn’t fail the whole block; remaining items still run.
The block emits one aggregated output: items_total, items_processed, succeeded, failed, per-item results, and a flat summary string usable in downstream templates. Its outgoing edges fire after all items have been processed.
For Each runs items once each, immediately and sequentially. To repeatedly re-run an action until a condition holds, use Poll Until instead.

Generating Runbooks

The Generate Runbook action (Kestrel) distills a completed RCA and its fixes into a reusable, generalized runbook for that class of incident — symptom, diagnosis steps, remediation steps, verification, and rollback. It requires an upstream RCA step. The generated runbook is available to downstream steps as {{runbook_html}} / {{runbook_markdown}}, and Publish Runbook Entry (Confluence) consumes runbook_html automatically.

Testing Workflows

Before relying on a workflow in production, test it with a simulated trigger:
  1. Open the workflow on the canvas
  2. Click Test Workflow
  3. Kestrel generates a sample trigger payload based on the trigger type
  4. Click Run Test to execute the workflow with the sample data
  5. Inspect the output of each step in the execution detail view
Test executions are marked as test runs in the Observability dashboard and do not count toward cooldowns.

Example Workflows

K8s Incident → RCA → Slack → Jira

Workflow Agent prompt: “When a Kubernetes incident is detected in any cluster, run root cause analysis, send the root cause and recommended fix to #incidents in Slack, and create a Jira ticket in the INFRA project with the full investigation summary.”

K8s Incident → RCA → Refine with Feedback → Apply → Publish Runbook

A full human-in-the-loop loop: detect the incident, run RCA, draft a reusable runbook, let an engineer iteratively refine the analysis, then apply the fix and publish the runbook. Workflow Agent prompt: “When a Kubernetes pod crashes, run root cause analysis, generate a runbook, then let me review and refine the analysis before applying — when I approve, apply the YAML fix and publish the runbook to Confluence; if I reject, notify #incidents.” On Request changes, the reviewer’s free-text guidance re-runs the RCA agent and the gate re-opens — repeating until approve/reject or the round cap.

Slack Request → K8s Manifest → GitOps PR → ArgoCD Sync

Workflow Agent prompt: “When someone requests a new Kubernetes resource via /kestrel-workflow in Slack, generate the K8s manifests based on their request, create a pull request in acme/k8s-manifests on GitHub, wait for the PR to be merged, then trigger an ArgoCD sync.”

Vercel Deployment Failure → Build Logs → Investigation → Slack

Workflow Agent prompt: “When a Vercel deployment fails, fetch the build logs, run an AI investigation to identify the root cause of the build failure, and send the findings to #deploys in Slack.”

Railway Deployment Crash → Logs → Investigation → Rollback → Slack

Workflow Agent prompt: “When a Railway service crashes, fetch the deployment logs, run an AI investigation to find the root cause, roll the service back to its previous deployment, and post a summary to #platform in Slack.”

Fly.io Machine Crash → Events → Investigation → Restart → Slack

Workflow Agent prompt: “When a Fly.io machine crashes, pull its recent events, run an AI investigation to find the root cause, restart the machine, and post a summary to #platform in Slack.”

Nebius GPU Error → Investigation → Scale Node Group → Slack

Workflow Agent prompt: “When a Nebius GPU node reports an error, run an AI investigation to find the root cause, add a node to the affected node group, and post a summary to #ml-infra in Slack.”

Jenkins Build Failure → Console Log → Investigation → Slack + Jira

Workflow Agent prompt: “When a Jenkins build fails, fetch the console log, run an AI investigation to identify the root cause of the failure, post the findings to #ci in Slack, and create a Jira ticket in the INFRA project.”

CircleCI Workflow Failure → Rerun From Failed → Wait → PagerDuty

Workflow Agent prompt: “When a CircleCI workflow fails on main, rerun only the failed jobs, wait for the pipeline to finish, and page on-call via PagerDuty with an AI investigation summary if the rerun also fails.”

PostHog Exception → Investigation → Slack

Workflow Agent prompt: “When PostHog captures a frontend exception, generate an AI summary of the user’s session including what they were doing before the error, and send the summary with the replay URL to #product-alerts in Slack.”

Terraform Run Needs Attention → Plan Summary → Slack Approval → Apply

Workflow Agent prompt: “When a Terraform Cloud run on a production workspace finishes planning and needs confirmation, fetch the planned changes, ask for approval in #infra-approvals, and apply the run if approved or discard it if rejected.”

Pulumi Update Failure → Investigation → Slack Approval → Retry

Workflow Agent prompt: “When a Pulumi Cloud update fails on a production stack, investigate the failure, post the findings to #infra-approvals in Slack and ask for approval, then retry the update if approved.”

Cloud Cost Anomaly → AI Analysis → Slack Report

Workflow Agent prompt: “When an AWS cost anomaly is detected, query the cost breakdown for the affected account over the last 7 days, run an AI cost analysis to identify the root cause and recommend optimizations, and post the analysis to #finops in Slack.”

Weekly Schedule → Cost Report → Savings Recommendations → Slack

Workflow Agent prompt: “Every Monday at 9am UTC, query last week’s AWS costs grouped by service, get savings plans recommendations, run an AI cost analysis, and post an executive summary to #finops in Slack.”

Idle Resource Scan → Approval → Cleanup → Slack

Workflow Agent prompt: “Every day at 8am UTC, scan for idle resources (unattached EBS volumes and unassociated Elastic IPs), ask for approval in #finops, and if approved delete the unattached volumes (snapshot first) and release the idle Elastic IPs.”

Forecast Overrun → Compare Periods → Rightsizing → Slack

Workflow Agent prompt: “When the AWS cost forecast projects a budget overrun, compare this month’s spend to last month to find the biggest movers, get rightsizing recommendations, and post the analysis to #finops in Slack.”

Next Steps