Agentic workflows: who picks the next step
What an agentic workflow is, how it differs from an agent, what GitHub, Elastic and Pyrefly learned, and why a 30-second keepalive wastes money.

May 2026. Fabrizio Ferri-Benedetti, a tech writer at Elastic, wires three boring tools into the docs CI: Vale for style, Lychee for broken links, Codespell for typos. On top of them he adds an LLM step. It pulls the right product facts from the docs MCP server and checks only what the dumb tools can’t. All of this runs on GitHub Agentic Workflows, a GitHub Next project that wasn’t GA yet. His verdict: “mostly works, with caveats”.
On October 28, GitHub made it GA. The announcement quotes Accenture: down from about 11,000 production errors a day to under 1,000, with AI writing 91% of the team’s commits. Their numbers, on their team, with no word on how they measured. But they do explain why everyone brings up the term at every standup.
Where it came from, and what it isn’t
Andrew Ng pushed the term in March 2024, in a talk at Sequoia and a series of letters in The Batch. He proposed four patterns: reflection, tool use, planning, multi-agent. And the number that made people listen: GPT-3.5 inside a loop hit 95.1% on HumanEval, versus 67% for GPT-4 in a single attempt.
In December 2024, Anthropic sharpened it in the post Building effective agents. A workflow is an LLM and tools orchestrated by code along predefined paths. An agent is a system where the model decides the path and the tools on its own.
The question is who picks the next step. In a script, the code does. In an agent, the model does. In an agentic workflow, the code holds the path, and the model gets judgment only at specific nodes: classify an issue, figure out why CI failed, decide whether an API change breaks something in the docs.
What it isn’t: it’s not “AI that works without humans”. IBM and Salesforce write about “minimal human intervention”. In practice, what GitHub shipped as GA is built the other way: the agent runs with read permissions, and every write to the repo goes through predefined safe outputs. One more thing: if you can write the path as if/else, it’s not an agentic workflow. It’s a script, and that’s better.

What it looks like on GitHub: Markdown that compiles to YAML
You write the workflow in natural language in a Markdown file, with frontmatter for the trigger, permissions and tools. gh aw compile turns it into regular Actions YAML, so it runs on the runners and policies your org already has. The engine is Copilot, or another coding agent you bring.
---on: pull_request: paths: ["docs/**"]permissions: contents: read pull-requests: readengine: claudetools: bash: ["vale", "lychee", "codespell"]safe-outputs: add-comment: max: 1---
# Docs review
1. Run vale, lychee and codespell on the changed files. Treat their output as ground truth.2. Review only the changed files for what those tools cannot catch: wrong product facts, broken steps, missing prerequisites.3. Do not repeat findings the tools already reported.4. Post one comment with at most 5 findings, each with file and line. If nothing is real, say so in one line.Then:
gh extension install github/gh-awgh aw compilegit add .github/workflows/docs-review.md .github/workflows/docs-review.lock.ymlTwo things in this file do most of the work. max: 1 limits the agent to one comment, not fifteen. And line 3 of the prompt tells it not to repeat what the linters already found. Without it, you get a PR flooded with comments about commas.

Elastic’s example: dumb robots first
Ferri-Benedetti explains why he mixes the two kinds:
Mixing dumb robots with smart ones […] helps reduce false positives while ensuring complete scan coverage at the same time.
— Fabrizio Ferri-Benedetti, passo.uno, May 2026
The deterministic tools give full coverage: every file, every link. The LLM filters noise and catches what has no rule. Each side closes the other’s gap.
So just hook every checker you have into the agent? Not quite. Conner Nilsen from the Pyrefly team presented an experiment at PyCon US 2026: agents solving tasks with and without a type checker. In a codebase with high type coverage, the success rate rose from about 80% to 84%, with fewer steps and less time. In a codebase with low coverage, no improvement. The agent started fixing imports and type signatures in neighboring code instead of solving the task.
My take: This is the most useful finding I read this year on agentic workflows. A noisy deterministic tool isn’t more context. It’s an alternative task the agent will happily do instead of yours. Before you hook a linter into a workflow, clean it until it outputs zero on main.
The pause that eats the cache
Another problem you don’t see in the demo. The workflow sends a request, then waits: for a build, for tests, for a human to approve. Ten minutes. The prompt cache is already dead, and the next request pays full price on a huge prefix. A cache hit costs roughly a tenth of the input price, so the difference shows.
The usual fix is a keepalive: resend the same prefix every 30 seconds to refresh the TTL. mempko actually measured this, on Anthropic, OpenAI, Gemini and DeepSeek, three runs with a timestamp on every call. The result: 30 seconds is 8x too often. The right interval is about 4 minutes, which fits Anthropic’s default 5-minute TTL. And on a ten-minute pause, only one provider out of four saved money with a keepalive: Anthropic. On DeepSeek it buys latency, not money. On OpenAI and Gemini it buys nothing.
In short, keepalive is a per-provider decision. Workflow on Claude, waiting on a long CI? Ping every 4 minutes. On OpenAI or Gemini, skip it.

What to try this week
- Pick one task that repeats on every PR and that a human does by eye today: issue triage, CI failure analysis, docs review. Just one.
- Write the deterministic part first. Anything a linter, schema or test can check, they check. The LLM gets only the remainder.
- Make sure those tools output zero on main before the agent sees them. Otherwise it will work on them instead of the PR.
- Permissions
contents: read, and every output throughsafe-outputswith amax. - Measure in the first week: how many comments were closed as false positives, how many review minutes were saved, what a run costs.
- Long wait in the middle and the model is Claude? Keepalive every 4 minutes. Not 30 seconds.
If you can’t point at the node where the model judges and say why it’s there, you don’t have an agentic workflow. You have an agent with YAML around it.
Sources
- What I've learned designing agentic workflows for docs · 2026-05-11
- GitHub Agentic Workflows are generally available · 2026-11-03
- Agentic Workflow's Cache Keepalive Costs 8x Too Much · 2026-07-22
- Type Checking in Agentic Workflows – Conner Nilsen – PyCon US 2026 Typing Summit · 2026-06-12
- What are Agentic Workflows? | IBM
- What Are Agentic Workflows? | Salesforce
How this was made: drafted by our agent from 6 sources, edited and approved by Koby Almog.


