<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ryan Merlin</title>
    <description>The latest articles on DEV Community by Ryan Merlin (@ryanmerlin).</description>
    <link>https://dev.to/ryanmerlin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3957147%2F1811ef37-a30a-4c3c-9ba0-12af7191e48a.jpg</url>
      <title>DEV Community: Ryan Merlin</title>
      <link>https://dev.to/ryanmerlin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryanmerlin"/>
    <language>en</language>
    <item>
      <title>Own the Operation</title>
      <dc:creator>Ryan Merlin</dc:creator>
      <pubDate>Fri, 05 Jun 2026 13:00:04 +0000</pubDate>
      <link>https://dev.to/ryanmerlin/own-the-operation-54i7</link>
      <guid>https://dev.to/ryanmerlin/own-the-operation-54i7</guid>
      <description>&lt;p&gt;MCP connects agents to tools.  Workflows coordinate tools.  Skills teach models how to use tools.&lt;/p&gt;

&lt;p&gt;None of those automatically owns the operation.&lt;/p&gt;

&lt;p&gt;An operation is the durable unit of work: resolve this secret, explain this failed deploy, audit this cloud account, prepare this release, reconcile these receipts, summarize this incident.  It includes the auth path, retries, local conventions, failure taxonomy, output contract, safety policy, and receipt.  If that knowledge lives in a prompt, a notebook cell, a workflow node, or a thin MCP wrapper, the agent has to rediscover it every time.&lt;/p&gt;

&lt;p&gt;Lately this is the part of the stack people call the action layer, the place where an agent does things instead of merely reaching them.  That name is right about the location and quiet about the substance, because what gives an action layer any leverage is where the operation behind each action actually lives.&lt;/p&gt;

&lt;p&gt;The useful question is not whether agents should use MCP or the command line.  The answer is obviously both.&lt;/p&gt;

&lt;p&gt;The useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where does the operation live?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My claim: for repeated, composition-heavy, personally shaped work, the operation should often live behind an owned command surface.  MCP can expose it.  A workflow can schedule it.  A skill can explain it.  But the operation itself should compile into something deterministic, inspectable, reusable, and honest about failure.&lt;/p&gt;

&lt;p&gt;That is what a good CLI gives you.  Not a pile of scripts.  Not an MCP server for every API.  Not terminal nostalgia.  A stable, discoverable, JSON-speaking operations layer over the systems you actually touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer mistake
&lt;/h2&gt;

&lt;p&gt;MCP solved a real problem.  Before MCP, every agent integration was bespoke glue.  &lt;a href="https://www.anthropic.com/engineering/code-execution-with-mcp" rel="noopener noreferrer"&gt;Anthropic describes MCP&lt;/a&gt; as an open standard for connecting agents to external systems, replacing custom pairings between every agent and every tool.&lt;/p&gt;

&lt;p&gt;That win is real.  It is also easy to overextend, which is the argument I made last week in &lt;a href="https://ryanmerlin.com/posts/mcp-explosion-scaling-problem" rel="noopener noreferrer"&gt;The MCP Explosion Has a Scaling Problem&lt;/a&gt;: MCP won the tool layer, but a protocol boundary is not an operational boundary.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Owns&lt;/th&gt;
&lt;th&gt;Should not own&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Skills and docs&lt;/td&gt;
&lt;td&gt;Instructions, examples, policies, procedural context&lt;/td&gt;
&lt;td&gt;The only copy of critical behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI verbs&lt;/td&gt;
&lt;td&gt;Executable operations, contracts, local conventions, error taxonomy&lt;/td&gt;
&lt;td&gt;Remote distribution, OAuth consent, multi-tenant governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflows&lt;/td&gt;
&lt;td&gt;Scheduling, orchestration, state, retries across steps, approvals&lt;/td&gt;
&lt;td&gt;The only definition of an operation other callers need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;Protocol, auth, discovery, consent, hosted distribution&lt;/td&gt;
&lt;td&gt;Your private operating knowledge by default&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MCP answers: how does the agent reach a capability, what schema describes the call, who is allowed to invoke it, and how does the result come back?&lt;/p&gt;

&lt;p&gt;An operation answers: what should actually happen, which local rule applies, what failure class is this, is it retryable, what should be redacted, what receipt proves it ran, and what output can every caller depend on?&lt;/p&gt;

&lt;p&gt;Those are different questions.  When they collapse into the same artifact, agent systems get brittle.  Tool catalogs grow.  Error modes blur.  Prompts accumulate folklore.  This is the same separation-of-layers point behind &lt;a href="https://ryanmerlin.com/posts/agent-protocol-stack-runtime-gap" rel="noopener noreferrer"&gt;The Agent Protocol Stack Has a Runtime Gap&lt;/a&gt;, applied one level down, to your own operations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The operation should live at the lowest layer that can execute it deterministically and be reused by every caller.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For personal agents, that layer is often a CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive discovery won
&lt;/h2&gt;

&lt;p&gt;The first scaling failure in agent tooling was not model quality.  It was context pressure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.cloudflare.com/code-mode-mcp/" rel="noopener noreferrer"&gt;Cloudflare's Code Mode&lt;/a&gt; is the cleanest production example.  The Cloudflare API has more than 2,500 endpoints.  Exposing every endpoint as a separate MCP tool would consume 1.17 million tokens.  Code Mode exposes two tools, &lt;code&gt;search()&lt;/code&gt; and &lt;code&gt;execute()&lt;/code&gt;, keeps the footprint around 1,000 tokens, and still reaches the full API surface.  The important part is not the token reduction.  It is the shape: search first, inspect only what matters, then execute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/engineering/code-execution-with-mcp" rel="noopener noreferrer"&gt;Anthropic reached the same conclusion&lt;/a&gt; from the client side.  Loading every MCP tool definition up front and routing large intermediate results through the model makes agents slower and more expensive.  Presenting MCP servers as code APIs lets the agent inspect only the tool files it needs and process intermediate data inside the execution environment.  Their example workflow dropped from 150,000 tokens to 2,000, a 98.7 percent reduction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool" rel="noopener noreferrer"&gt;Claude's Tool Search&lt;/a&gt; makes the pattern explicit: defer loading, search the catalog, and expand only the few tools needed for the request.  Anthropic's docs say a typical multi-server setup can spend roughly 55,000 tokens on tool definitions before useful work starts, and tool search usually cuts that by more than 85 percent.&lt;/p&gt;

&lt;p&gt;The honest conclusion is not "MCP failed." It is sharper:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Progressive discovery won.  Do not load the world.  Find the next handle.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A good CLI already works that way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mycli discover                                          &lt;span class="c"&gt;# top-level domains&lt;/span&gt;
mycli discover secrets                                  &lt;span class="c"&gt;# one domain&lt;/span&gt;
mycli secrets resolve &lt;span class="nt"&gt;--help&lt;/span&gt;                            &lt;span class="c"&gt;# one verb&lt;/span&gt;
mycli secrets resolve providers/openai/api-key &lt;span class="nt"&gt;--json&lt;/span&gt;   &lt;span class="c"&gt;# one operation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent does not need the whole surface.  It needs a catalog, a drill-down path, and the schema for the verb it is about to run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54616zcgfupgpv19qt1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54616zcgfupgpv19qt1h.png" alt="Rolling discovery: the agent lists the catalog, drills into one domain, then loads the full schema for only the verb it is about to run" width="800" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is also why the CLI keeps showing up in evaluations.  &lt;a href="https://arize.com/blog/mcp-vs-cli-skills-for-agents-what-our-eval-found-and-which-you-should-use/" rel="noopener noreferrer"&gt;Arize ran 500 GitHub-task evaluations&lt;/a&gt; across MCP, CLI skills, and bare shell.  Correctness landed in a tight band: MCP at &lt;em&gt;0.83&lt;/em&gt;, the shorter CLI skill at &lt;em&gt;0.83&lt;/em&gt;, and bare shell at &lt;em&gt;0.84&lt;/em&gt;.  But on the hardest tasks, &lt;strong&gt;MCP cost more than 6X what the skills cost, took five times longer, and averaged more tool calls&lt;/strong&gt;.  Tool fidelity fell to 0.33 because the MCP agent escaped into bash when the API surface could not express the composition it needed.&lt;/p&gt;

&lt;p&gt;The same eval also shows where MCP wins.  Creating a branch and opening a pull request went better through MCP because &lt;code&gt;create_branch&lt;/code&gt; and &lt;code&gt;create_pull_request&lt;/code&gt; existed as direct endpoint-shaped tools.  That gives us the rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Endpoint-shaped tasks favor endpoint-shaped tools.  Composition-shaped tasks favor executable surfaces.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Use the protocol when the task is a clean remote capability.  Use an executable surface when the task requires filtering, joining, computing, redacting, retrying, or applying local judgment across messy intermediate state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seam is where systems fail
&lt;/h2&gt;

&lt;p&gt;An expired token comes back as a 404.  A missing secret also comes back as a 404.&lt;/p&gt;

&lt;p&gt;So when your agent's credential fetch fails, it spends ten minutes debugging the wrong layer, because the five-line auth dance copied into nine scripts cannot tell the two apart.&lt;/p&gt;

&lt;p&gt;Before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .env
&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$AUTH_BODY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .access_token&lt;span class="si"&gt;)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VAULT_URL&lt;/span&gt;&lt;span class="s2"&gt;/secret/&lt;/span&gt;&lt;span class="nv"&gt;$SECRET_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; .data.value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not an operation.  It is ceremony.  Maybe it retries.  Maybe it refreshes.  Maybe it distinguishes auth failure from missing data.  Maybe the next script copied the fixed version.  Probably not.&lt;/p&gt;

&lt;p&gt;After:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mycli secrets resolve providers/openai/api-key &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the operation exists.  It owns the auth flow, token refresh, retry policy, error taxonomy, output shape, and receipt.  The agent does not need to infer the difference between an expired credential and a missing path.  The command tells it.  (That secrets layer is its own small build, which I wrote up in &lt;a href="https://ryanmerlin.com/posts/building-first-class-secrets-management-into-an-ai-agent" rel="noopener noreferrer"&gt;Building first-class secrets management into an AI agent&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;A useful command should not just return bytes.  It should return a contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AUTH_TOKEN_EXPIRED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"retryable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Credential expired before vault lookup."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"remediation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Run `mycli auth refresh` or allow automatic refresh."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"receipt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sec_20260602_184211"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"secrets.resolve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"providers/openai/api-key"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the difference between a model guessing and a system reporting.&lt;/p&gt;

&lt;p&gt;The win is not that the command is shorter.  The win is that the operation is executable, inspectable, reusable, and honest about failure.  A human can call it.  An agent can call it.  A cron job can call it.  A service can call it.  An MCP wrapper can call it later.  The operation is no longer trapped in a prompt, workflow node, notebook cell, shell history, or vendor connector.  It is part of your surface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4j80ir8l7jgb8l3hfmz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4j80ir8l7jgb8l3hfmz.png" alt="One command surface, every caller: a human at a terminal, an agent through its shell, a cron job, and a background service all invoke the same JSON-speaking verb" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What about workflows?
&lt;/h2&gt;

&lt;p&gt;Workflow is one of the load-bearing ideas in modern software.  Whole categories of company are built on the workflow principle: define a process once as a sequence of steps, then let an engine schedule it, run it, retry it, and prove it ran.  But the word does not mean one thing.  It spans tools that live at very different layers.&lt;/p&gt;

&lt;p&gt;At its core it is orchestration.  &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; runs workflows inside a repository, triggered by a push or a schedule.  &lt;a href="https://airflow.apache.org/" rel="noopener noreferrer"&gt;Airflow&lt;/a&gt;, &lt;a href="https://dagster.io/" rel="noopener noreferrer"&gt;Dagster&lt;/a&gt;, and &lt;a href="https://www.prefect.io/" rel="noopener noreferrer"&gt;Prefect&lt;/a&gt; orchestrate data pipelines as graphs of tasks with dependencies, retries, and backfills.  &lt;a href="https://www.alteryx.com/" rel="noopener noreferrer"&gt;Alteryx&lt;/a&gt; puts the same idea on a visual canvas for analysts who join and shape data without writing code.  &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;n8n&lt;/a&gt; does it for moving data between SaaS apps.  Different audiences, one shape: a controlled, repeatable path through steps that are known in advance.&lt;/p&gt;

&lt;p&gt;In 2026 that idea reached into agent harnesses.  &lt;a href="https://www.anthropic.com/research/building-effective-agents" rel="noopener noreferrer"&gt;Anthropic draws the line cleanly&lt;/a&gt;: a workflow orchestrates models and tools along predefined code paths, while an agent lets the model direct its own process.  Claude Code now ships a literal &lt;a href="https://code.claude.com/docs/en/workflows" rel="noopener noreferrer"&gt;workflow primitive&lt;/a&gt;.  A dynamic workflow, in research preview since May 2026, is a JavaScript script Claude writes for your task; a runtime executes it in the background and fans the work across as many as 1,000 subagents, returning only the verified result instead of the exhaust of every step.  Even there the pattern holds: the script is the orchestrator that decides what runs and in what order, and the subagents do the work.&lt;/p&gt;

&lt;p&gt;So "workflow" already spans a YAML CI file, a data graph, a visual analytics canvas, and a generated multi-agent script.  Across all of them it answers the same question.  A workflow decides &lt;strong&gt;when&lt;/strong&gt; and &lt;strong&gt;in what order&lt;/strong&gt; work happens, and what coordinates the steps.  A command decides &lt;strong&gt;what the work is&lt;/strong&gt;.  Use these tools when the process is known in advance.  Just do not confuse the engine with the work it runs.&lt;/p&gt;

&lt;p&gt;Bad layering puts the substance inside the orchestrator:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the workflow node contains the auth logic&lt;/li&gt;
&lt;li&gt;it contains the provider-specific retries&lt;/li&gt;
&lt;li&gt;it contains the jq filters and the local naming conventions&lt;/li&gt;
&lt;li&gt;it contains the only error handling anyone trusts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good layering keeps the workflow thin and the operations owned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;workflow trigger
  -&amp;gt; mycli cloud drift &lt;span class="nt"&gt;--stack&lt;/span&gt; payments-prod &lt;span class="nt"&gt;--json&lt;/span&gt;
  -&amp;gt; mycli deploy explain &lt;span class="nt"&gt;--service&lt;/span&gt; api &lt;span class="nt"&gt;--env&lt;/span&gt; prod &lt;span class="nt"&gt;--since&lt;/span&gt; 30m &lt;span class="nt"&gt;--json&lt;/span&gt;
  -&amp;gt; mycli incident snapshot &lt;span class="nt"&gt;--service&lt;/span&gt; checkout &lt;span class="nt"&gt;--include&lt;/span&gt; logs,metrics,traces &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow owns scheduling, approvals, fan-out, retries between steps, and escalation.  The CLI owns the operation contract.  If an agent needs the same capability interactively, it calls the same command.  If a service needs it, it calls the same command.  If you later expose it through MCP, the wrapper calls the same command.  That is the reuse workflows do not give you by themselves.&lt;/p&gt;

&lt;p&gt;The honest exception: if the work is inherently a long-running process with durable state across restarts, approvals, and retries, use a workflow engine as the source of truth. But if a workflow node becomes the only place that knows how to interpret a failed deploy, classify an IAM error, or join logs with metrics and traces, promote that logic into an operation and let the workflow call it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Workflows are control planes.  Commands are operational primitives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Skills and plugins are maps.  Commands are machines.
&lt;/h2&gt;

&lt;p&gt;This is the other meaning of "workflow," and it is where the argument gets sharpest.  The ecosystem is converging on packaged agent capability: &lt;a href="https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; became an open standard in December 2025, and a &lt;a href="https://code.claude.com/docs/en/plugins-reference" rel="noopener noreferrer"&gt;Claude Code plugin&lt;/a&gt; bundles skills, subagents, and hooks into one installable folder.&lt;/p&gt;

&lt;p&gt;That packaging is good.  But a skill is not the operation itself.  A skill can tell the agent to check the provider, refresh credentials, distinguish expired tokens from missing paths, emit structured JSON, and leave a receipt.  That helps the model behave.  It does not guarantee the behavior, because a &lt;code&gt;SKILL.md&lt;/code&gt; is &lt;em&gt;interpreted&lt;/em&gt; by the model, not executed.&lt;/p&gt;

&lt;p&gt;So if the procedure lives only in prose, the agent reconstructs it every time.  Sometimes correctly.  Sometimes it skips a check, pastes stale shell, or reads the same 404 in the wrong layer.  A command turns the procedure into an executable affordance: a deterministic engine runs the same code every time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The skill or plugin tells the agent when and why.  The CLI does the work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Build by osmosis
&lt;/h2&gt;

&lt;p&gt;You do not have to start from a blank file.&lt;/p&gt;

&lt;p&gt;One thing MCP gives us, beyond runtime connectivity, is a corpus of tool-design prior art.  An MCP server is a compact expression of how a domain exposes itself to agents: tool names, descriptions, schemas, auth assumptions, pagination, failure modes, and handler logic.  The &lt;a href="https://modelcontextprotocol.io/specification/2025-11-25/server/tools" rel="noopener noreferrer"&gt;MCP tools spec&lt;/a&gt; makes this explicit: each tool carries a name plus metadata describing its schema.  When the server is open source, the agent can read the implementation.  When it is not, it can still inspect the exposed contract.&lt;/p&gt;

&lt;p&gt;So MCP is useful even when MCP is not the final interface.  The move is toolchain osmosis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;study the generic MCP surface&lt;/li&gt;
&lt;li&gt;extract the operational primitives&lt;/li&gt;
&lt;li&gt;preserve useful auth, pagination, retry, and rate-limit behavior&lt;/li&gt;
&lt;li&gt;collapse repeated work into personal verbs, and discard what you do not use&lt;/li&gt;
&lt;li&gt;harden the result as CLI commands&lt;/li&gt;
&lt;li&gt;expose those commands back through MCP only if distribution requires it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The anti-pattern is a direct port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mycli github list-issues &lt;span class="nt"&gt;--json&lt;/span&gt;
mycli github get-issue &lt;span class="nt"&gt;--id&lt;/span&gt; 123 &lt;span class="nt"&gt;--json&lt;/span&gt;
mycli github list-pull-requests &lt;span class="nt"&gt;--json&lt;/span&gt;
mycli github create-branch &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is endpoint sprawl wearing a terminal costume.  The target is compression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mycli work triage &lt;span class="nt"&gt;--project&lt;/span&gt; aria &lt;span class="nt"&gt;--since&lt;/span&gt; 7d &lt;span class="nt"&gt;--json&lt;/span&gt;
mycli ci explain-failure &lt;span class="nt"&gt;--repo&lt;/span&gt; aria &lt;span class="nt"&gt;--run&lt;/span&gt; latest &lt;span class="nt"&gt;--json&lt;/span&gt;
mycli release prepare &lt;span class="nt"&gt;--repo&lt;/span&gt; aria &lt;span class="nt"&gt;--base&lt;/span&gt; main &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those commands know which accounts matter, which regions are production, which labels identify a release, which alarms are noisy, and what "rollback candidate" means.  A good agent can help with that transformation, not by inventing tools from vibes, but by reading the existing implementation and proposing a smaller, sharper surface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Study the MCP server in ./vendor/mcp-servers/github and its tools/list schemas.
Do not port tools one-for-one. Extract reusable operational primitives and propose
CLI verbs for my actual workflow. Constraints: collapse repeated multi-step
workflows; keep generic CRUD out unless called by more than one actor; every
command returns a stable JSON envelope, defines exit codes and error classes,
supports --dry-run for writes, and leaves a receipt for destructive actions;
keep secrets out of prompts and logs; note which MCP tools informed each verb.
Output: candidate verbs, rejected tools and why, JSON schemas, error taxonomy,
implementation plan, open questions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output you want is not a bigger catalog.  It is a smaller one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MCP can be the scaffolding.  The CLI is what remains after the scaffolding comes down.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What earns a command
&lt;/h2&gt;

&lt;p&gt;This is where the argument needs discipline.  "Build your own toolchain" can decay into aesthetic DIY.  That is not the claim.  A command earns its place when at least one of these is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it is called by more than one actor: human, agent, workflow, service&lt;/li&gt;
&lt;li&gt;it encodes a local convention a vendor cannot know&lt;/li&gt;
&lt;li&gt;it joins multiple systems behind one stable contract&lt;/li&gt;
&lt;li&gt;it has ambiguous failure modes that need honest errors&lt;/li&gt;
&lt;li&gt;it handles sensitive data that should not pass through model context&lt;/li&gt;
&lt;li&gt;it is repeated often enough that prompt reconstruction is waste&lt;/li&gt;
&lt;li&gt;it is dangerous enough to require dry-run, receipts, or guardrails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If none of those are true, do not wrap it.  Use MCP, the vendor connector, the workflow tool, or the API directly.  Use the shell once and move on.&lt;/p&gt;

&lt;p&gt;The test is not whether a command feels elegant.  It is whether it reduces repeated reasoning, repeated glue, repeated tokens, repeated ambiguity, or repeated risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The chassis is the investment
&lt;/h2&gt;

&lt;p&gt;The upfront work is real.  You need the chassis before the leverage shows up: argument parsing, config loading, secret resolution, structured JSON output, stable exit codes, stable error classes, audit receipts, dry-run support, idempotency for writes, a useful &lt;code&gt;--help&lt;/code&gt;, and machine-readable discovery.&lt;/p&gt;

&lt;p&gt;That is not free.  The first useful command costs more than it feels like it should.  But the chassis changes the economics of every command after it.  Adding a capability stops being "build an integration" and becomes "describe a verb." A thin wrapper over an API you already use is minutes.  A real integration is quick and starts to pay off immediately.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The hundredth command is not free.  It is prepaid.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You paid for it with the first ninety-nine decisions: one output envelope, one error taxonomy, one discovery model, one auth strategy, one audit trail, one binary every caller knows how to invoke.  The compounding is not that commands become magically cheap.  &lt;strong&gt;The compounding is that the surface becomes coherent&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put MCP behind it when distribution matters
&lt;/h2&gt;

&lt;p&gt;None of this requires being anti-MCP.  In many systems the cleanest architecture is to put the owned operation behind MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent
  -&amp;gt; MCP server          # remote access, OAuth, consent, governance
      -&amp;gt; owned CLI verb  # executes the operation, returns the contract
          -&amp;gt; operation   # auth, retries, policy, redaction, receipts, taxonomy
              -&amp;gt; APIs, files, secrets, infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives you the protocol benefits without making the wrapper the source of operational truth.  MCP handles remote access, OAuth, consent, governance, and hosted distribution.  The CLI owns the operation.  The skill explains when to use it.  The workflow schedules it.&lt;/p&gt;

&lt;p&gt;This split is also safer.  &lt;a href="https://blog.cloudflare.com/code-mode-mcp/" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt; notes that a shell introduces a much broader attack surface than a sandboxed isolate, and Code Mode keeps progressive discovery while executing inside that sandbox.  Do not hand every hosted agent an unrestricted shell.  Do not pretend &lt;code&gt;bash&lt;/code&gt; is a permissions system.  But also do not bury your operating knowledge in a remote schema wrapper when what you need is a deterministic operation with a contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vendors can't design your daily driver
&lt;/h2&gt;

&lt;p&gt;A vendor can connect GitHub, Jira, Slack, Drive, Salesforce, Kubernetes, AWS, GCP, and Azure, and expose the generic verbs: list, search, create, update, delete, summarize.  That is useful.  It is not enough.&lt;/p&gt;

&lt;p&gt;The leverage in a personal agent lives in the local verbs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explain the deploy that failed after the autoscaling event&lt;/li&gt;
&lt;li&gt;audit the production account, but include IAM drift and recent security-group changes&lt;/li&gt;
&lt;li&gt;resolve the secret using the local fallback rule, not the cloud default&lt;/li&gt;
&lt;li&gt;summarize only the receipts attached to this client project&lt;/li&gt;
&lt;li&gt;prepare the weekly report in the format I actually use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not marketplace integrations.  They are operating habits.  A vendor cannot know them because they are not product features.  They are the accumulated shape of your work.&lt;/p&gt;

&lt;p&gt;That is why the personal toolchain matters.  Not because command lines are noble, not because protocols are bad, and not because every developer should LARP as a platform team of one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Because repeated friction is operational knowledge, and operational knowledge should compile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What owning the operation does not solve
&lt;/h2&gt;

&lt;p&gt;A command surface gives you determinism.  It does not give you safety by default.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A CLI is not a permission model.  It is a sharper knife.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Owning the operation does not make shell access safe, replace sandboxing, or settle multi-tenant authorization on its own.  That still comes from capability scoping, secret isolation, policy gates, dry-runs, and receipts.  Left undisciplined, the same surface decays into a private platform tax, or into endpoint sprawl if you port APIs one-for-one.  And it is not free to keep: commands need tests, schemas, and versioning like any other code.&lt;/p&gt;

&lt;p&gt;Where the logic lives is also a security question.  A 2026 study of agentic GitHub Actions workflows, &lt;a href="https://arxiv.org/abs/2605.07135" rel="noopener noreferrer"&gt;Demystifying and Detecting Agentic Workflow Injection&lt;/a&gt;, analyzed 13,392 agentic workflows across 10,792 repositories and confirmed 496 exploitable injections, 343 of them previously unknown, where untrusted issue or pull-request text flows into an agent's prompt and back out as exfiltrated secrets.  When the auth path, the redaction rule, and the receipt live as prose inside a workflow node or a skill file, there is no hardened layer to hold a guardrail.  An owned operation with secret isolation and an audit receipt at least gives you one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The operation is the asset
&lt;/h2&gt;

&lt;p&gt;Strip away the protocol wars and the tooling fashion, and one thing is left standing: the operation.  Not the model, not the connector, not the orchestration graph.  The durable unit of work, with its auth, its retries, its failure taxonomy, its receipt, and the local judgment no vendor can see.&lt;/p&gt;

&lt;p&gt;Everything else is delivery.  MCP carries capabilities to where they are needed, workflows schedule them, skills tell the agent when to reach for them.  All of it rests on one question: where does the operation live?  Leave it in a prompt, a workflow node, or a wrapper, and the agent rediscovers it every morning.  Put it in something you own that runs the same way for every caller, and it compounds: &lt;strong&gt;the world the agent can act on becomes your world, encoded in tools you made from the work itself&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The strongest personal agent will not be the one with the biggest catalog of connectors.  It will be the one with the clearest operations layer.&lt;/p&gt;

&lt;p&gt;Own that layer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://ryanmerlin.com/posts/own-the-operation" rel="noopener noreferrer"&gt;ryanmerlin.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>cli</category>
    </item>
    <item>
      <title>The AI Productivity Dip Is Longer, Deeper, and Diverging</title>
      <dc:creator>Ryan Merlin</dc:creator>
      <pubDate>Thu, 28 May 2026 18:24:42 +0000</pubDate>
      <link>https://dev.to/ryanmerlin/the-ai-productivity-dip-is-longer-deeper-and-diverging-1g6b</link>
      <guid>https://dev.to/ryanmerlin/the-ai-productivity-dip-is-longer-deeper-and-diverging-1g6b</guid>
      <description>&lt;p&gt;One variable in DORA's AI ROI calculator changes the story from a first-year win to a first-year loss.&lt;/p&gt;

&lt;p&gt;Not model cost.  Not salary.  Not adoption rate.&lt;/p&gt;

&lt;p&gt;Duration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dora.dev" rel="noopener noreferrer"&gt;DORA&lt;/a&gt;'s sample model for AI-assisted software development assumes a three-month productivity dip.  On that assumption, a 500-person engineering organization produces a first-year benefit of roughly $3.3 million, a 39% ROI, and a payback period under a year.  When &lt;a href="https://www.faros.ai/blog/dora-ai-roi-calculator-telemetry-inputs" rel="noopener noreferrer"&gt;Faros AI&lt;/a&gt; stress-tested the same calculator with a twelve-month dip instead of a three-month dip, the result inverted: the same organization went from a $3.3 million first-year gain to a $6.6 million loss.  A $9.9 million swing from one input.&lt;/p&gt;

&lt;p&gt;That input is not a detail.  It is the model.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DORA&lt;/em&gt; is Google Cloud's &lt;em&gt;DevOps Research and Assessment&lt;/em&gt; program, the research group behind the software delivery metrics many engineering organizations use to benchmark performance.  The original DORA "four keys" have now evolved into a five-metric model: change lead time, deployment frequency, failed deployment recovery time, change fail rate, and deployment rework rate.  &lt;a href="https://dora.dev/guides/dora-metrics/" rel="noopener noreferrer"&gt;DORA's own guidance&lt;/a&gt; says these metrics measure a team's ability to deliver software safely, quickly, and efficiently, and that they predict better organizational performance and team well-being.&lt;/p&gt;

&lt;p&gt;The 2026 DORA report on AI-assisted software development is not a hype memo.  It is a serious attempt to answer a hard management question: how should engineering leaders reason about the return on AI when the first-order effects are tangled with learning costs, verification costs, platform maturity, quality risk, and organizational redesign?  The &lt;a href="https://dora.dev/ai/roi/report/" rel="noopener noreferrer"&gt;DORA ROI report&lt;/a&gt; proposes an ROI framework and calculator that map AI adoption through capabilities, DORA delivery metrics, and ultimately financial outcomes.  It also names the pattern many practitioners already feel: AI adoption follows a &lt;em&gt;J-curve&lt;/em&gt;.  Productivity drops before it rises.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51ipq6y7sf3xr21p12qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51ipq6y7sf3xr21p12qo.png" alt="DORA's J-Curve of AI value realization — productivity dips before it rises, driven by learning costs, verification tax, and pipeline adaptation" width="799" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DORA's explanation for the dip is right.  Teams spend time learning new workflows.  Developers must review AI-generated code because trustworthiness is not free.  Downstream systems, review, test, security, CI/CD, and incident response, must absorb more output.  The &lt;a href="https://dora.dev/ai/roi/report/" rel="noopener noreferrer"&gt;DORA ROI report&lt;/a&gt; calls this "the tuition cost of transformation."&lt;/p&gt;

&lt;p&gt;The framing is useful.&lt;/p&gt;

&lt;p&gt;The default timeline is the dangerous part.&lt;/p&gt;

&lt;p&gt;The question is not whether AI creates a productivity dip.  The question is whether the dip lasts three months, twelve months, or long enough that leadership cuts funding, reduces headcount, or declares failure before the organization has made the complementary investments required for the upside.&lt;/p&gt;

&lt;p&gt;DORA frames this around software development because that is the domain they study.  But the same dynamic plays out everywhere AI enters production work: business process automation, analytics pipelines, customer operations, content generation, financial modeling.  The mechanism is the same.  AI increases the volume of output before the organization has upgraded the verification, integration, and governance systems that must absorb it.  Code is the most instrumented version of this story.  It is not the only version.&lt;/p&gt;

&lt;p&gt;That is where the J-curve becomes a fork.&lt;/p&gt;

&lt;h2&gt;
  
  
  DORA is right about the mechanism
&lt;/h2&gt;

&lt;p&gt;DORA's strongest idea is not the calculator.  It is the amplifier thesis.&lt;/p&gt;

&lt;p&gt;In its &lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;2025 State of AI-Assisted Software Development&lt;/a&gt; report, DORA argued that AI amplifies existing organizational conditions.  Strong engineering systems get stronger.  Weak systems get faster at producing dysfunction.  AI does not replace delivery maturity; it magnifies the presence or absence of it.&lt;/p&gt;

&lt;p&gt;That is the right lens.&lt;/p&gt;

&lt;p&gt;An organization with strong automated tests, fast CI, disciplined review culture, observable production systems, small-batch delivery, clean internal documentation, and a mature developer platform can absorb AI-generated output.  It has the verification surface area to handle increased volume.&lt;/p&gt;

&lt;p&gt;An organization without those foundations gets something else: more code, larger pull requests, more review pressure, more rework, more hidden security exposure, and more incidents that appear downstream from the dashboard celebrating "AI adoption."&lt;/p&gt;

&lt;p&gt;DORA's calculator includes this idea, but the sample assumptions understate how asymmetric the results become.  The calculator's default case shows positive ROI.  &lt;a href="https://www.faros.ai/blog/dora-ai-roi-calculator-telemetry-inputs" rel="noopener noreferrer"&gt;Faros AI's stress test&lt;/a&gt; shows that changing the dip from three months to twelve months flips the result negative.  Faros's telemetry-informed scenario, combining longer adaptation time and quality degradation, also produces a negative first-year ROI.&lt;/p&gt;

&lt;p&gt;That does not prove Faros is universally right.  Faros is a vendor analyzing telemetry from its own customer base, which is not the same thing as a population-representative causal study.&lt;/p&gt;

&lt;p&gt;But it proves the management point: the ROI is highly sensitive to the duration and depth of the trough.&lt;/p&gt;

&lt;p&gt;If leadership treats DORA's default as an expectation rather than a scenario, they will under-budget the hard part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evidence does not tell one story
&lt;/h2&gt;

&lt;p&gt;The empirical record on AI coding productivity is not contradictory because the researchers are incompetent.  It is contradictory because they are measuring different work under different conditions.&lt;/p&gt;

&lt;p&gt;DORA's own 2024 data showed the tension early.  A 25% increase in AI adoption was associated with higher perceived documentation quality, code quality, and code review speed.  It was also associated with a 1.5% decrease in delivery throughput and a 7.2% decrease in delivery stability.  In other words: developers felt some things getting better while system-level delivery outcomes worsened.  See &lt;a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2024-dora-report" rel="noopener noreferrer"&gt;the 2024 DORA Report&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://metr.org" rel="noopener noreferrer"&gt;METR&lt;/a&gt;'s &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;controlled experiment&lt;/a&gt; made that perception gap explicit.  Sixteen experienced developers completed 246 tasks in their own open-source repositories, randomly assigned to use or not use AI tools.  With AI tools, they took 19% longer.  Before the study, they expected AI to save 24% of their time.  Afterward, they still believed AI had sped them up by about 20%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is the most important finding in the METR paper: not merely that AI slowed these developers down, but that the developers misread their own productivity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The caveat matters.  METR's sample was small, the developers were experienced, the work was complex, and the tasks were in familiar real-world codebases.  METR has also since published a &lt;a href="https://metr.org/blog/2026-02-24-uplift-update/" rel="noopener noreferrer"&gt;follow-up noting that a later experiment produced an unreliable estimate&lt;/a&gt; because of study design and selection issues.  The slowdown result should not be treated as a universal law.&lt;/p&gt;

&lt;p&gt;A larger field experiment by &lt;a href="https://www.microsoft.com/en-us/research/publication/the-effects-of-generative-ai-on-high-skilled-work-evidence-from-three-field-experiments-with-software-developers/" rel="noopener noreferrer"&gt;Cui et al.&lt;/a&gt;, run across Microsoft, Accenture, and an anonymous Fortune 100 company, found a very different result: a 26% increase in completed tasks among 4,867 developers using an AI coding assistant.  The effects were stronger for newer and more junior employees.&lt;/p&gt;

&lt;p&gt;Both findings can be true.&lt;/p&gt;

&lt;p&gt;AI helps more when the task is bounded, the context is legible, the codebase is easier to navigate, and the developer has less accumulated domain-specific advantage.  AI helps less, and can hurt, when the work requires deep local context, architectural judgment, production intuition, and careful integration into a complex codebase.&lt;/p&gt;

&lt;p&gt;That distinction matters because most enterprise engineering is not greenfield demo work.  It is legacy systems, migrations, dependencies, security constraints, test gaps, half-documented business rules, and code nobody wants to touch.&lt;/p&gt;

&lt;p&gt;AI is very good at producing plausible code.&lt;/p&gt;

&lt;p&gt;The enterprise problem is verified, maintainable, production-safe change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The telemetry is flashing yellow
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.faros.ai/blog/dora-ai-roi-calculator-telemetry-inputs" rel="noopener noreferrer"&gt;Faros AI&lt;/a&gt;'s telemetry captures the shape of the tradeoff.  In its analysis of 22,000 developers across 4,000 teams, output rose sharply: task throughput per developer increased 33.7%, epics per developer increased 66.2%, and tasks associated with pull requests per team increased 210%.  But the quality and stability signals moved the other way: incidents per pull request increased 242.7%, monthly incidents increased 57.9%, and bugs per developer increased 54%.&lt;/p&gt;

&lt;p&gt;Again, this is not causal proof that AI created every downstream issue.  It is vendor telemetry, not an RCT.&lt;/p&gt;

&lt;p&gt;But it is directionally consistent with what engineers are reporting elsewhere: AI increases output before organizations have upgraded the verification system that must absorb that output.&lt;/p&gt;

&lt;p&gt;The vendor telemetry that follows carries the same caveat as Faros: these companies sell code quality, security, and review tools.  They have commercial incentives to surface problems in the code their customers produce.  That does not make the data wrong, but it means the findings should be read as signal, not proof.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sonarsource.com" rel="noopener noreferrer"&gt;Sonar&lt;/a&gt;'s &lt;a href="https://www.sonarsource.com/resources/developer-survey-report/" rel="noopener noreferrer"&gt;2026 developer survey&lt;/a&gt; found that 96% of developers do not fully trust AI-generated code, yet only 48% say they always verify AI-generated code before committing it.  Sonar also found that 53% of developers agree AI often produces code that looks correct but is not reliable.&lt;/p&gt;

&lt;p&gt;That is the verification tax in compressed form: developers know the output is untrustworthy, but delivery pressure pushes them toward partial verification.&lt;/p&gt;

&lt;p&gt;Security evidence points in the same direction.  &lt;a href="https://www.veracode.com" rel="noopener noreferrer"&gt;Veracode&lt;/a&gt;'s &lt;a href="https://www.veracode.com/blog/genai-code-security-report/" rel="noopener noreferrer"&gt;GenAI Code Security Report&lt;/a&gt; tested more than 100 large language models across common programming languages and found that 45% of generated code samples failed security tests, including OWASP Top 10 classes of weakness.  Larger and newer models did not consistently produce more secure code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coderabbit.ai" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt;'s &lt;a href="https://www.coderabbit.ai/blog/state-of-ai-vs-human-code-generation-report" rel="noopener noreferrer"&gt;analysis of 470 open-source pull requests&lt;/a&gt; found that AI-coauthored PRs contained about 1.7 times as many issues per PR as human-authored PRs, with security vulnerabilities up to 2.74 times higher.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apiiro.com" rel="noopener noreferrer"&gt;Apiiro&lt;/a&gt; reported that AI-assisted developers were writing three to four times more code and that AI-generated code was producing a tenfold increase in security findings, reaching 10,000 new findings per month by June 2025 across its observed repositories.  See &lt;a href="https://apiiro.com/blog/4x-velocity-10x-vulnerabilities-ai-coding-assistants-are-shipping-more-risks/" rel="noopener noreferrer"&gt;Apiiro's velocity and vulnerability analysis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The pattern is not "AI code is bad."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pattern is "AI changes the denominator."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When code volume rises faster than review capacity, test coverage, security scanning, architectural scrutiny, and production feedback loops, the system becomes less stable even if individual developers feel faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verification tax is not temporary
&lt;/h2&gt;

&lt;p&gt;A common mistake is treating verification as an early adoption friction that will disappear once developers get used to the tools.&lt;/p&gt;

&lt;p&gt;Some of it will.  Prompting improves.  Tooling improves.  Developers learn where AI is useful and where it is dangerous.&lt;/p&gt;

&lt;p&gt;But the core verification tax is structural.&lt;/p&gt;

&lt;p&gt;AI-generated code has no human intent behind it in the way a teammate's code does.  It may be syntactically clean and idiomatic while being semantically wrong.  It can pass local tests while violating an invariant that lives in a different service, a customer workflow, or an undocumented operational constraint.&lt;/p&gt;

&lt;p&gt;That makes review harder, not easier.&lt;/p&gt;

&lt;p&gt;The open-source world is already reacting.  &lt;em&gt;Curl&lt;/em&gt; &lt;a href="https://daniel.haxx.se/blog/2026/01/26/the-end-of-the-curl-bug-bounty/" rel="noopener noreferrer"&gt;ended its HackerOne bug bounty program&lt;/a&gt; after a flood of low-quality, AI-generated vulnerability reports overwhelmed maintainers.  &lt;em&gt;NetBSD&lt;/em&gt; now &lt;a href="https://www.netbsd.org/developers/commit-guidelines.html" rel="noopener noreferrer"&gt;treats LLM-generated code as "tainted"&lt;/a&gt; unless approved by core developers.  &lt;em&gt;Gentoo&lt;/em&gt; &lt;a href="https://www.theregister.com/2024/04/16/gentoo_linux_bans_code_contributions_written_with_ai/" rel="noopener noreferrer"&gt;banned AI-generated contributions&lt;/a&gt;, citing quality, copyright, and ethical concerns.  The Linux kernel &lt;a href="https://docs.kernel.org/process/coding-assistants.html" rel="noopener noreferrer"&gt;permits AI-assisted work&lt;/a&gt;, but places full responsibility on the human submitter and requires proper disclosure and review discipline.&lt;/p&gt;

&lt;p&gt;Those are not Luddite reactions.  They are maintenance systems defending scarce review capacity.&lt;/p&gt;

&lt;p&gt;Enterprise engineering has the same problem, just inside the firewall.&lt;/p&gt;

&lt;p&gt;If AI increases generation capacity by 2x but verification capacity by only 1.1x, the bottleneck moves.  The organization does not become twice as productive.  It becomes review-bound, test-bound, security-bound, and incident-bound.&lt;/p&gt;

&lt;p&gt;That is why code volume is a dangerous success metric.&lt;/p&gt;

&lt;h2&gt;
  
  
  This has happened before
&lt;/h2&gt;

&lt;p&gt;The productivity dip is not unique to AI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paul David&lt;/em&gt;'s classic 1990 paper, &lt;a href="https://www.jstor.org/stable/2006600" rel="noopener noreferrer"&gt;"The Dynamo and the Computer,"&lt;/a&gt; explained why electrification took decades to show up in factory productivity.  Early factories overlaid electric motors onto steam-era layouts.  They replaced the power source but kept the old organization of work.  The payoff came later, when factories were redesigned around electricity: single-story layouts, unit drives, and production flows organized around materials rather than shafts and belts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Brynjolfsson&lt;/em&gt;, &lt;em&gt;Rock&lt;/em&gt;, and &lt;em&gt;Syverson&lt;/em&gt; formalized the same mechanism as the &lt;a href="https://www.aeaweb.org/articles?id=10.1257/mac.20180386" rel="noopener noreferrer"&gt;"Productivity J-Curve."&lt;/a&gt;  General-purpose technologies such as AI require complementary investments: process redesign, new business models, human capital, organizational restructuring, and other intangible assets that are poorly measured during the investment phase.  Productivity can look flat or negative while those investments are being made, then overshoot once the new system starts compounding.&lt;/p&gt;

&lt;p&gt;That is the economic mechanism behind DORA's J-curve.&lt;/p&gt;

&lt;p&gt;But software leaders need to add one more observation: the J-curve does not resolve uniformly.&lt;/p&gt;

&lt;p&gt;Some organizations invest through the trough and emerge with higher throughput, better developer experience, stronger platforms, and faster learning loops.&lt;/p&gt;

&lt;p&gt;Others treat the trough as evidence that AI failed, or worse, use AI output as justification to cut the very people needed to verify and integrate it.&lt;/p&gt;

&lt;p&gt;That is how the J becomes a K.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwbc2spe9cgoi1avb7e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwbc2spe9cgoi1avb7e9.png" alt="The J-Curve becomes a K — disciplined adoption rises above baseline while unmanaged adoption continues to decline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The upper branch is not just "more AI"
&lt;/h2&gt;

&lt;p&gt;The companies moving up the curve are not merely buying more licenses.  They are redesigning the delivery system around AI.&lt;/p&gt;

&lt;p&gt;Google is the clearest high-scale example.  In Q3 2024, &lt;em&gt;Sundar Pichai&lt;/em&gt; &lt;a href="https://arstechnica.com/ai/2024/10/google-ceo-says-over-25-of-new-google-code-is-generated-by-ai/" rel="noopener noreferrer"&gt;said more than 25% of new code at Google was generated by AI&lt;/a&gt; and then reviewed by engineers.  By Cloud Next 2026, &lt;a href="https://blog.google/innovation-and-ai/infrastructure-and-cloud/google-cloud/cloud-next-2026-sundar-pichai/" rel="noopener noreferrer"&gt;Google said 75% of new code was AI-generated&lt;/a&gt; and approved by engineers.  That is not evidence of ROI by itself, but it is evidence of a company pushing AI into the engineering workflow while preserving human review as a control point.&lt;/p&gt;

&lt;p&gt;AWS offers a better measurement lesson.  &lt;a href="https://aws.amazon.com/blogs/enterprise-strategy/business-value-of-developer-experience-improvements-amazons-15-9-breakthrough/" rel="noopener noreferrer"&gt;AWS reported a 15.9% year-over-year reduction in software development cost&lt;/a&gt; using its &lt;em&gt;Cost to Serve Software&lt;/em&gt; framework.  The important point is not "Amazon Q saved 15.9%."  That would be too clean.  The important point is that AWS measured the whole software delivery system: deployments per builder, human interventions, incidents per deployment, and cost-to-serve.  AI was part of a broader developer-experience and operational-efficiency program, not a standalone magic line item.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Duolingo&lt;/em&gt; shows both the upside and the organizational risk.  In 2025, the company &lt;a href="https://techcrunch.com/2025/04/30/duolingo-launches-148-courses-created-with-ai-after-sharing-plans-to-replace-contractors-with-ai/" rel="noopener noreferrer"&gt;launched 148 AI-created courses&lt;/a&gt;, roughly doubling its course catalog.  That is real leverage.  But Duolingo also faced backlash over its "AI-first" posture, and CEO &lt;em&gt;Luis von Ahn&lt;/em&gt; later said the company would reverse a policy tying AI usage to performance reviews after employees pushed back on using AI for its own sake.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shopify&lt;/em&gt; is a culture case, not an outcome case.  &lt;a href="https://techcrunch.com/2025/04/07/shopify-ceo-tells-teams-to-consider-using-ai-before-growing-headcount/" rel="noopener noreferrer"&gt;&lt;em&gt;Tobi Lütke&lt;/em&gt;'s 2025 memo&lt;/a&gt; made reflexive AI usage a baseline expectation and required teams asking for more headcount or resources to show why AI could not help first.  That is a strong operating philosophy.  It is not yet a measured productivity result.&lt;/p&gt;

&lt;p&gt;The upper branch is not "AI everywhere."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The upper branch is disciplined adoption: strong platforms, explicit verification, clear use-case boundaries, measurement beyond code volume, and leadership willing to fund the adaptation period.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The lower branch is not "no AI"
&lt;/h2&gt;

&lt;p&gt;The lower branch can have plenty of AI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Klarna&lt;/em&gt; is the canonical warning.  In February 2024, &lt;a href="https://www.klarna.com/international/press/klarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month/" rel="noopener noreferrer"&gt;Klarna announced that its AI assistant handled 2.3 million conversations&lt;/a&gt;, about two-thirds of customer-service chats, doing work equivalent to 700 full-time agents.  It also said the assistant matched human customer-satisfaction scores and was expected to drive $40 million in profit improvement.&lt;/p&gt;

&lt;p&gt;Then the narrative changed.  By 2025, &lt;a href="https://www.customerexperiencedive.com/news/klarna-reinvests-human-talent-customer-service-AI-chatbot/747586/" rel="noopener noreferrer"&gt;Klarna was bringing humans back into customer service&lt;/a&gt;, with CEO &lt;em&gt;Sebastian Siemiatkowski&lt;/em&gt; acknowledging that the company had over-indexed on cost and needed to course-correct on quality.&lt;/p&gt;

&lt;p&gt;The lesson is not that Klarna's AI did nothing.  It clearly did something.  The lesson is that volume metrics masked quality degradation in the interactions where quality mattered most.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Freshworks&lt;/em&gt; is a different warning.  In May 2026, &lt;a href="https://qz.com/freshworks-layoffs-500-jobs-ai-code-earnings-050626" rel="noopener noreferrer"&gt;Freshworks announced it would cut roughly 500 jobs&lt;/a&gt;, about 11% of its workforce, while CEO &lt;em&gt;Dennis Woodside&lt;/em&gt; said more than half of the company's code was written by AI and that automation had reduced rote work.  The company estimated restructuring charges of about $8 million.&lt;/p&gt;

&lt;p&gt;That may prove financially rational.  It may also prove to be the exact failure mode DORA warns against: reducing human capacity during the period when AI-generated output increases the need for verification, architectural judgment, and production accountability.&lt;/p&gt;

&lt;p&gt;The lower branch is not low adoption.&lt;/p&gt;

&lt;p&gt;It is unmanaged adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  The macro data shows concentration, not universality
&lt;/h2&gt;

&lt;p&gt;The broader enterprise data supports the divergence story.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bcg.com" rel="noopener noreferrer"&gt;BCG&lt;/a&gt;'s &lt;a href="https://www.bcg.com/press/30september2025-ai-leaders-outpace-laggards-revenue-growth-cost-savings" rel="noopener noreferrer"&gt;2025 research&lt;/a&gt; found that leading "future-built" companies are pulling away from laggards: 1.7 times the revenue growth, 3.6 times the three-year total shareholder return, and 1.6 times the EBIT margin.  BCG also found that agentic AI is accelerating the value gap, with agents accounting for 17% of total AI value in 2025 and projected to reach 29% by 2028.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mckinsey.com" rel="noopener noreferrer"&gt;McKinsey&lt;/a&gt;'s &lt;a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai" rel="noopener noreferrer"&gt;2025 State of AI survey&lt;/a&gt; found that 88% of organizations use AI in at least one business function, but only about one-third have begun to scale AI programs.  Only about 6% qualify as AI high performers, defined as organizations attributing 5% or more EBIT impact to AI and reporting significant value.  McKinsey also found that high performers are more likely to redesign workflows, define when model outputs require human validation, and have senior leaders actively engaged in adoption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.oecd.org" rel="noopener noreferrer"&gt;OECD&lt;/a&gt; research on &lt;a href="https://www.oecd.org/en/publications/emerging-divides-in-the-transition-to-artificial-intelligence_7376c776-en.html" rel="noopener noreferrer"&gt;emerging divides in the transition to AI&lt;/a&gt; similarly finds that AI adoption is accelerating unevenly across firms, sectors, and regions, reinforcing existing divides.  AI champions are concentrated among larger firms, innovative regions, and knowledge-intensive services, while skills shortages, cost, data protection concerns, and technology lock-in slow diffusion elsewhere.&lt;/p&gt;

&lt;p&gt;This is the K-curve at enterprise scale.&lt;/p&gt;

&lt;p&gt;Adoption is becoming common.&lt;/p&gt;

&lt;p&gt;Impact is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch-up window is open, but narrowing
&lt;/h2&gt;

&lt;p&gt;The strongest objection to the K-shaped thesis is the cloud precedent.&lt;/p&gt;

&lt;p&gt;Cloud adoption also looked divergent at first.  Late movers eventually learned from early movers, hired experienced consultants, adopted proven patterns, and caught up faster than expected.  The playbook became legible: DevOps, CI/CD, infrastructure-as-code, SRE, platform teams, FinOps.&lt;/p&gt;

&lt;p&gt;AI adoption may follow the same path.&lt;/p&gt;

&lt;p&gt;But there is a difference.&lt;/p&gt;

&lt;p&gt;Cloud was primarily an infrastructure and operating-model migration.  Difficult, but codifiable.&lt;/p&gt;

&lt;p&gt;AI-assisted software development requires a deeper form of organizational learning: trust calibration, review heuristics, task decomposition, context engineering, internal knowledge access, risk classification, human-in-the-loop design, and new quality gates.  Those capabilities can be taught, but they cannot simply be installed.&lt;/p&gt;

&lt;p&gt;The longer a high-performing organization uses AI productively, the more it accumulates process knowledge: which tasks are safe, which are dangerous, how to review, how to instrument, how to route work, how to train juniors, how to evaluate agents, and how to distinguish code generation from software delivery.&lt;/p&gt;

&lt;p&gt;That institutional learning compounds.&lt;/p&gt;

&lt;p&gt;The catch-up window is not closed.  But it is not passive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents create a second J-curve
&lt;/h2&gt;

&lt;p&gt;Most organizations have not finished adapting to copilots, and agents are already creating the next transition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai" rel="noopener noreferrer"&gt;McKinsey's 2025 survey&lt;/a&gt; found that 23% of organizations are scaling an agentic AI system somewhere in the enterprise, while another 39% are experimenting.  In any individual business function, no more than 10% are scaling agents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gartner.com" rel="noopener noreferrer"&gt;Gartner&lt;/a&gt; &lt;a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" rel="noopener noreferrer"&gt;predicts that more than 40% of agentic AI projects will be canceled by the end of 2027&lt;/a&gt; because of escalating costs, unclear business value, or inadequate risk controls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.spglobal.com/market-intelligence" rel="noopener noreferrer"&gt;S&amp;amp;P Global Market Intelligence&lt;/a&gt; &lt;a href="https://www.spglobal.com/market-intelligence/en/news-insights/research/ai-experiences-rapid-adoption-but-with-mixed-outcomes-highlights-from-vote-ai-machine-learning" rel="noopener noreferrer"&gt;found that the share of companies abandoning the majority of AI initiatives before production rose from 17% to 42% year over year&lt;/a&gt;, with organizations reporting that 46% of projects are scrapped between proof of concept and broad adoption.&lt;/p&gt;

&lt;p&gt;This is not surprising.  Agents require a different verification model than copilots.&lt;/p&gt;

&lt;p&gt;A copilot suggests.  An agent acts.&lt;/p&gt;

&lt;p&gt;That means the complementary investments change: permissions, audit logs, sandboxing, tool access, approval workflows, production guardrails, identity boundaries, rollback paths, and human escalation.  The verification tax does not disappear.  It moves from reviewing generated code to supervising generated action.&lt;/p&gt;

&lt;p&gt;Organizations that built strong verification discipline during the copilot phase will move faster through the agent phase.&lt;/p&gt;

&lt;p&gt;Organizations that skipped the discipline will start the second curve with unpaid debt from the first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The talent pipeline is the long fuse
&lt;/h2&gt;

&lt;p&gt;The hidden cost in most AI ROI calculators is not licensing.  It is apprenticeship.&lt;/p&gt;

&lt;p&gt;If AI handles the work junior engineers used to do, the short-term spreadsheet looks better.  Fewer entry-level hires.  Fewer simple tickets.  More senior engineers supervising generated output.&lt;/p&gt;

&lt;p&gt;But software engineering judgment is not created by watching AI write code.  It is created by making decisions, breaking things, debugging them, getting reviewed, discovering why the obvious solution was wrong, and slowly building taste.&lt;/p&gt;

&lt;p&gt;The labor-market evidence is early and contested, but it is concerning.  &lt;a href="https://digitaleconomy.stanford.edu" rel="noopener noreferrer"&gt;Stanford Digital Economy Lab&lt;/a&gt;'s &lt;a href="https://digitaleconomy.stanford.edu/publication/canaries-in-the-coal-mine-six-facts-about-the-recent-employment-effects-of-artificial-intelligence/" rel="noopener noreferrer"&gt;"Canaries in the Coal Mine?"&lt;/a&gt; study uses high-frequency administrative payroll data and finds that early-career workers aged 22 to 25 in the most AI-exposed occupations have experienced a significant relative employment decline, while more experienced workers in the same occupations have remained stable or continued to grow.  The Stanford publication reports a 16% relative decline in the latest version; SIEPR's summary of an earlier version reports 13%.&lt;/p&gt;

&lt;p&gt;There is counter-evidence too.  &lt;a href="https://www.strada.org" rel="noopener noreferrer"&gt;Strada&lt;/a&gt;'s &lt;a href="https://www.strada.org/news-insights/entry-level-hiring-in-the-ai-era-what-employers-are-thinking-and-doing" rel="noopener noreferrer"&gt;2026 employer survey&lt;/a&gt; found that many employers expect AI to reshape entry-level work rather than eliminate it, increasing analytical and judgment-based responsibilities while reducing routine tasks.  In tech, the bar is rising: more judgment, fewer rote assignments.&lt;/p&gt;

&lt;p&gt;That does not eliminate the pipeline risk.  It clarifies it.&lt;/p&gt;

&lt;p&gt;The risk is not simply "fewer junior developers."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The risk is fewer safe environments where junior developers can acquire the judgment senior developers need.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An organization that replaces junior work with AI output may save money now and discover in three to five years that it has fewer engineers capable of evaluating the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What engineering leaders should measure instead
&lt;/h2&gt;

&lt;p&gt;Do not measure "percentage of code written by AI" as a success metric.&lt;/p&gt;

&lt;p&gt;That is a volume metric.  It is not a delivery metric.  It can rise while quality, security, and stability fall.&lt;/p&gt;

&lt;p&gt;Measure these instead.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Change failure rate by code origin.&lt;/em&gt; Compare AI-assisted changes with human-authored changes.  If AI-assisted changes fail materially more often, the bottleneck is verification, not adoption.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Incident rate per pull request by code origin.&lt;/em&gt; &lt;a href="https://www.faros.ai/blog/dora-ai-roi-calculator-telemetry-inputs" rel="noopener noreferrer"&gt;Faros AI&lt;/a&gt; found incidents per PR rising sharply after AI adoption.  Your number matters more than Faros's number.  Instrument it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Review time and review depth by code origin.&lt;/em&gt; If AI-assisted PRs wait longer, require more review cycles, or get merged with less scrutiny, you have a control problem.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Security findings by code origin.&lt;/em&gt; Static analysis, dependency scanning, secrets detection, and application security testing should be broken out by AI-assisted versus human-authored change.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rework and churn.&lt;/em&gt; Track how often code is modified, reverted, or deleted within 30 days of merge.  &lt;a href="https://www.gitclear.com" rel="noopener noreferrer"&gt;GitClear&lt;/a&gt;'s &lt;a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research" rel="noopener noreferrer"&gt;work on AI-era code quality&lt;/a&gt; points toward higher churn, more duplicated code, and less refactoring-associated activity as AI coding assistants spread.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Accepted suggestion rate paired with downstream quality.&lt;/em&gt; Acceptance rate alone is a usage metric.  It becomes useful only when paired with review outcomes, rework, incidents, and security findings.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Developer trust calibration.&lt;/em&gt; Teams should be able to articulate where AI is safe, where it is useful but risky, and where it is prohibited.  "We use AI for X but not Y because..." is an artifact of maturity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to tell the board
&lt;/h2&gt;

&lt;p&gt;Do not present DORA's 39% sample ROI as the forecast.&lt;/p&gt;

&lt;p&gt;Present it as the optimistic case.&lt;/p&gt;

&lt;p&gt;Then present the sensitivity case.&lt;/p&gt;

&lt;p&gt;The board-level message should be this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI-assisted development has real upside, but the return depends on funding the adaptation period.  The productivity dip is not wasted time; it is the investment phase in new verification, delivery, and operating capabilities.  Organizations that underinvest during the dip are likely to see more code, more rework, and more incidents rather than durable productivity gains.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Based on the evidence above, my working estimate is twelve to eighteen months, not three.&lt;/p&gt;

&lt;p&gt;Months one through six are the calibration phase.  Developers learn where AI helps, where it lies, and how to review its output.  Productivity may look flat or negative if you measure verified delivery rather than code volume.&lt;/p&gt;

&lt;p&gt;Months six through twelve are the pipeline phase.  Review, testing, security, CI/CD, observability, and incident response adapt to increased generation capacity.  Leading indicators should improve even if aggregate ROI is still mixed.&lt;/p&gt;

&lt;p&gt;Months twelve through eighteen are the crossover phase.  If the leading indicators are improving, the organization should begin to see durable productivity gains: higher deployment frequency without higher change failure, lower lead time without more incidents, and better developer experience without quality erosion.&lt;/p&gt;

&lt;p&gt;That is the investment thesis.&lt;/p&gt;

&lt;p&gt;Not "AI writes code, therefore we need fewer engineers."&lt;/p&gt;

&lt;p&gt;"AI increases generation capacity, therefore we must upgrade the delivery system."&lt;/p&gt;

&lt;h2&gt;
  
  
  The first 90 days
&lt;/h2&gt;

&lt;p&gt;Instrument before expanding.&lt;/p&gt;

&lt;p&gt;Add code-origin metadata to pull requests.  Track whether changes are human-authored, AI-assisted, or agent-generated.  This does not need to be perfect on day one.  It needs to be good enough to correlate origin with review time, rework, security findings, and incidents.&lt;/p&gt;

&lt;p&gt;Create an explicit verification owner.&lt;/p&gt;

&lt;p&gt;Not a committee.  A person.  Their job is to watch the metrics, identify where AI-assisted work creates downstream risk, and feed that learning back into team practice.&lt;/p&gt;

&lt;p&gt;Start with task boundaries.&lt;/p&gt;

&lt;p&gt;AI is safer for tests, documentation, scaffolding, migrations with strong patterns, log analysis, small refactors, and local transformations.  It is riskier for authorization logic, cryptography, concurrency, financial calculations, distributed-systems behavior, data migrations, and architecture.  The list will differ by organization.  The point is to make the boundary explicit.&lt;/p&gt;

&lt;p&gt;Measure accepted output, not generated output.&lt;/p&gt;

&lt;p&gt;The unit of value is not a suggestion, a token, a line of code, or a generated pull request.  The unit of value is a verified change that improves the system without increasing risk.&lt;/p&gt;

&lt;p&gt;Protect the junior rung.&lt;/p&gt;

&lt;p&gt;Juniors should not become passive reviewers of AI output.  They need to write code, predict behavior, run experiments, debug failures, and compare their solution to the model's.  The training loop matters more than the short-term ticket velocity.&lt;/p&gt;

&lt;p&gt;Run one calibrated pilot.&lt;/p&gt;

&lt;p&gt;Pick one team with enough delivery maturity to produce meaningful data.  Give them tools, instrumentation, and freedom from code-volume targets.  After 90 days, compare AI-assisted and non-AI-assisted work across delivery, quality, security, and developer-experience metrics.&lt;/p&gt;

&lt;p&gt;Then scale the operating model, not just the licenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing: the second curve belongs to the disciplined
&lt;/h2&gt;

&lt;p&gt;DORA's core insight is right: AI amplifies the system it enters.&lt;/p&gt;

&lt;p&gt;That is why the productivity dip matters.  The dip is not just a temporary inconvenience before the inevitable payoff.  It is the period when organizations reveal whether they are capable of making the complementary investments AI requires.&lt;/p&gt;

&lt;p&gt;Some will use AI to build stronger delivery systems.&lt;/p&gt;

&lt;p&gt;Some will use it to ship more code into weak systems.&lt;/p&gt;

&lt;p&gt;Some will cut people before they have upgraded verification.&lt;/p&gt;

&lt;p&gt;Some will mistake adoption for transformation.&lt;/p&gt;

&lt;p&gt;The tuition is real.  But tuition is not the same as graduation.&lt;/p&gt;

&lt;p&gt;The organizations that finish the course will not be the ones that generated the most code.&lt;/p&gt;

&lt;p&gt;They will be the ones that learned how to verify, integrate, operate, and improve at AI speed without losing the human judgment that makes the output worth anything.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
