<?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: Daniel Butler</title>
    <description>The latest articles on DEV Community by Daniel Butler (@danielbutlerirl).</description>
    <link>https://dev.to/danielbutlerirl</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3739856%2F48481941-e81c-42dc-8a13-adaa0c1a3ccc.jpeg</url>
      <title>DEV Community: Daniel Butler</title>
      <link>https://dev.to/danielbutlerirl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielbutlerirl"/>
    <language>en</language>
    <item>
      <title>Intent-Driven Development Changes the Shape of Risk</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Mon, 02 Mar 2026 11:52:39 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/intent-driven-development-changes-the-shape-of-risk-1jki</link>
      <guid>https://dev.to/danielbutlerirl/intent-driven-development-changes-the-shape-of-risk-1jki</guid>
      <description>&lt;p&gt;Agentic coding increases throughput in ways that are now observable in practice. Tasks that previously required sustained effort can be implemented quickly, boilerplate largely disappears, and refactors that were once deferred become cheap enough to attempt.&lt;/p&gt;

&lt;p&gt;By &lt;em&gt;intent-driven development&lt;/em&gt;, I mean working at the level of describing outcomes and constraints while an AI agent generates the implementation. It is what many people call agentic coding, but the emphasis shifts from typing code to specifying intent.&lt;/p&gt;

&lt;p&gt;The implementation phase compresses while verification does not compress at the same rate, and that shift changes the risk profile.&lt;/p&gt;




&lt;h2&gt;
  
  
  Abstraction Shifts Always Redistribute Risk
&lt;/h2&gt;

&lt;p&gt;Every abstraction shift in software increased leverage and redistributed responsibility.&lt;/p&gt;

&lt;p&gt;Managed runtimes reduced memory errors but made runtime behaviour and performance characteristics more important. Cloud infrastructure made distributed failure explicit and forced investment in reliability engineering. CI/CD replaced manual validation with automated gates that had to be trusted. Microservices fragmented systems and forced clarity around contracts and observability.&lt;/p&gt;

&lt;p&gt;Each shift created new roles and new process discipline because the abstraction changed where mistakes surfaced. Those adaptations happened over years. Tooling matured gradually. Organisational practices caught up.&lt;/p&gt;

&lt;p&gt;Intent-driven development follows the same structural pattern, but the rate of adoption is faster than the pace at which process usually evolves.&lt;/p&gt;




&lt;h2&gt;
  
  
  We Relied on Human Throughput More Than We Realised
&lt;/h2&gt;

&lt;p&gt;Most delivery pipelines were shaped around human output.&lt;/p&gt;

&lt;p&gt;Reviews are sometimes rushed, diffs stretch further than they should, architectural drift accumulates quietly, and technical debt builds because there is rarely time to address it systematically.&lt;/p&gt;

&lt;p&gt;Production systems mostly held.&lt;/p&gt;

&lt;p&gt;Part of the reason is that human implementation speed acted as a natural throttle. Writing code takes time, large cross-cutting refactors require coordination, and broad structural changes are effortful enough that they are usually deliberate.&lt;/p&gt;

&lt;p&gt;Change rate limited blast radius, even if no one explicitly designed it that way.&lt;/p&gt;

&lt;p&gt;Intent-driven development removes much of that friction. Wide refactors become cheap, cross-cutting changes are easy to attempt, and large diffs can be generated in minutes.&lt;/p&gt;

&lt;p&gt;AI does not remove legacy complexity; it interacts with the system as it exists.&lt;/p&gt;

&lt;p&gt;If a team is already carrying significant debt, increasing implementation velocity does not automatically create time to fix underlying issues. It increases the rate at which fragile areas are modified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pipelines Were Calibrated for Slower Change
&lt;/h2&gt;

&lt;p&gt;Most CI/CD pipelines validate what they were designed to validate: syntax, contracts, unit tests, integration tests, and static analysis thresholds.&lt;/p&gt;

&lt;p&gt;They were calibrated under assumptions about human effort. A large refactor required time and coordination. A pull request touching twenty files was noticeable and unusual.&lt;/p&gt;

&lt;p&gt;With intent-driven development, it is trivial to produce a pull request that modifies forty files across multiple subsystems in a single session.&lt;/p&gt;

&lt;p&gt;Consider a model asked to “standardise logging.” It replaces structured logging with string interpolation everywhere. Unit tests still pass because observable behaviour under test did not change. The logging contract degrades subtly, structured fields disappear, and observability suffers in production.&lt;/p&gt;

&lt;p&gt;Similar patterns appear in broader refactors, where large cross-cutting changes pass automated checks but introduce integration or concurrency issues that only surface under real load.&lt;/p&gt;

&lt;p&gt;The AI did not deploy those changes.&lt;/p&gt;

&lt;p&gt;The pipeline admitted them.&lt;/p&gt;

&lt;p&gt;When implementation happens at the level of intent, scope expands easily and execution is immediate. That raises the bar for architectural clarity and verification depth. If review capacity and verification discipline remain unchanged, the system is absorbing a different class of change than it was calibrated for.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Response at the Workstation Layer
&lt;/h2&gt;

&lt;p&gt;In my own work, I introduced a constrained agentic workflow to compensate for the current state of both the tooling and the surrounding process.&lt;/p&gt;

&lt;p&gt;Today’s coding agents are capable of producing wide diffs and cross-cutting changes with very little friction, while most delivery pipelines were not designed for that velocity.&lt;/p&gt;

&lt;p&gt;The workflow operates at the developer workstation, before code reaches a pull request. It deliberately constrains scope through bounded tasks, explicit gates, one change at a time, and cleanup before PR.&lt;/p&gt;

&lt;p&gt;It is a temporary constraint while the broader delivery system evolves. It does not replace architectural governance, security discipline, or structural debt reduction. It compensates for their current limits.&lt;/p&gt;

&lt;p&gt;As review triggers, coverage enforcement, architectural checkpoints, and AI evaluation frameworks mature, those constraints can relax. Velocity should increase because the system can safely absorb it, not because local safeguards were bypassed.&lt;/p&gt;

&lt;p&gt;That structure is documented here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/danielbutlerirl/agentic-workflow-design-index-and-reading-order-4443"&gt;https://dev.to/danielbutlerirl/agentic-workflow-design-index-and-reading-order-4443&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It outlines workstation-level guardrails designed to prevent wide, unreviewable changes from reaching PR in the first place.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Practical Question
&lt;/h2&gt;

&lt;p&gt;Intent-driven development is already happening.&lt;/p&gt;

&lt;p&gt;Every abstraction shift required process evolution. This one is moving faster than most, and treating it as just another tooling upgrade assumes the system was already prepared for significantly higher throughput.&lt;/p&gt;

&lt;p&gt;Increasing change velocity without recalibrating review and verification increases the likelihood that weaknesses in the pipeline become visible. Acceleration exposes whatever was previously tolerated.&lt;/p&gt;

&lt;p&gt;Process discipline needs to evolve alongside it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Did that actually help? Evaluating AI coding assistants with hard numbers</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Mon, 02 Mar 2026 08:58:29 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/did-that-actually-help-evaluating-ai-coding-assistants-with-hard-numbers-417k</link>
      <guid>https://dev.to/danielbutlerirl/did-that-actually-help-evaluating-ai-coding-assistants-with-hard-numbers-417k</guid>
      <description>&lt;p&gt;You are building a Skill, an MCP server, or a custom prompt strategy that is supposed to make an AI coding assistant better at a specific job. You make a change. The next session feels smoother. The agent seems to reach for the right context at the right time.&lt;/p&gt;

&lt;p&gt;But how do you know?&lt;/p&gt;

&lt;p&gt;That question came up in two parallel problems.&lt;/p&gt;

&lt;p&gt;I was building and iterating on MCP servers to support a coding agent. New tool, new tool definition, new prompting strategy. Each change felt like an improvement. Sessions seemed smoother. But I had no numbers. I had vibes.&lt;/p&gt;

&lt;p&gt;A colleague was working on the same problem from the other side: he was building and refining AI coding Skills -- structured prompt packs that teach the agent how to work in a specific context. Same issue. A lot of iteration, a lot of gut feel, no hard signal on whether the changes were actually moving the needle.&lt;/p&gt;

&lt;p&gt;We joined forces and built something to fix this. The result is Pitlane -- named after the place in motorsport where engineers swap parts, adjust the setup, check the telemetry, and find out if the next lap is faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with vibes
&lt;/h2&gt;

&lt;p&gt;When you change an MCP server or a Skill, you are changing something about the environment the agent operates in. The agent gets different tools, different context, different instructions.&lt;/p&gt;

&lt;p&gt;Those changes can have real effects: pass rates on tasks go up or down, the agent takes fewer wrong turns, token costs change, time to completion changes, output quality improves or degrades.&lt;/p&gt;

&lt;p&gt;Without measurement, you cannot tell which of those things happened. You cannot tell whether the last commit was an improvement or a regression. You cannot tell whether version 3 of your Skill is better than version 1.&lt;/p&gt;

&lt;p&gt;You end up making decisions based on a handful of memorable sessions, which is not a reliable signal. Good sessions feel good. Bad sessions get rationalised. The data you are implicitly collecting is not representative.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you actually need
&lt;/h2&gt;

&lt;p&gt;You need to be able to answer a specific, repeatable question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With my Skill or MCP present, does the agent complete this task better than without it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question has a structure: a defined task with explicit success criteria, two configurations (baseline without your changes and challenger with them), deterministic assertions that verify success independently of the agent's own judgement, and a way to compare results across runs.&lt;/p&gt;

&lt;p&gt;That structure is an eval. Not a generic language model benchmark. A benchmark for your specific Skill or MCP server, in your context, on tasks that actually matter to you.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Pitlane is
&lt;/h2&gt;

&lt;p&gt;Pitlane is an open source command-line tool for running those evals. You define tasks in YAML, configure a baseline and one or more challengers, and race them against each other. The results tell you -- with numbers rather than impressions -- whether your work is paying off.&lt;/p&gt;

&lt;p&gt;The loop is simple: tune, race, check the telemetry, repeat.&lt;/p&gt;

&lt;p&gt;The assertions are deterministic. File existence checks, command exit codes, pattern matching -- either the file is there and valid or it is not. No LLM-as-judge, no subjectivity baked into the measurement. When you need fuzzy matching for documentation or generated content, similarity metrics (ROUGE, BLEU, BERTScore, cosine similarity) are available with configurable thresholds. These are deterministic numeric metrics, not a second model grading your output.&lt;/p&gt;

&lt;p&gt;Because agent outputs are non-deterministic, Pitlane supports repeated runs with aggregated statistics -- average, minimum, maximum, and standard deviation across runs. A Skill that reliably pushes a hard task from 50% to 70% pass rate is a meaningful result. Especially when that task used to fail half the time in CI. A Skill that appears to do that in a single run might just be variance.&lt;/p&gt;

&lt;p&gt;The tool tracks pass rates alongside cost, time, and token usage. A Skill that improves pass rate by 5% while tripling cost is a different trade-off than one that hits the same improvement at the same cost. Both columns appear in the HTML report so you can see the full picture.&lt;/p&gt;

&lt;p&gt;Pitlane currently supports Claude Code, Mistral Vibe, OpenCode, and IBM Bob (at time of writing).&lt;/p&gt;




&lt;h2&gt;
  
  
  Why not use an existing eval tool?
&lt;/h2&gt;

&lt;p&gt;There are good, widely-used tools in this space. promptfoo, Braintrust, LangSmith, DeepEval, and others all solve real problems. The question is whether they solve this problem without requiring you to build the scaffolding yourself.&lt;/p&gt;

&lt;p&gt;Take promptfoo as a representative example -- it is mature, well-documented, and genuinely extensible. It runs real agent sessions via its Claude Agent SDK and Codex SDK providers. The agent actually executes. Files actually get written. So far, so good.&lt;/p&gt;

&lt;p&gt;The gap shows up in the assertion layer. Promptfoo's built-in assertions are primarily oriented around validating the agent's returned text. In their coding-agent guide, one of the example verification patterns is a JavaScript assertion that parses the agent's final text for keywords like "passed" or "success":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That assertion passes when the agent says the tests passed. It does not verify that the tests actually passed. A model that narrates success while producing broken code passes. A model that silently produces correct code with a terse "done" might not. That is fine for some workflows. It is not the same as asserting on the produced artifacts as first-class primitives.&lt;/p&gt;

&lt;p&gt;Promptfoo's JavaScript assertion API is powerful enough to do better -- you can call &lt;code&gt;require('fs')&lt;/code&gt; and &lt;code&gt;require('child_process')&lt;/code&gt; and wire up real filesystem checks yourself. But you are writing boilerplate from scratch for every benchmark, managing your own working directory scoping, and handling fixture isolation manually. Their documentation acknowledges the gap directly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The agent's output is its final text response describing what it did, not the file contents. For file-level verification, read the files after the eval or enable tracing."&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://www.promptfoo.dev/docs/guides/evaluate-coding-agents/" rel="noopener noreferrer"&gt;promptfoo docs: Evaluate Coding Agents&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Read the files after the eval" is a step outside the pipeline. That is what building Pitlane felt like when approached from that direction -- assembling scaffolding that should have been there already.&lt;/p&gt;

&lt;p&gt;In Pitlane, &lt;code&gt;command_succeeds: "terraform validate"&lt;/code&gt; or &lt;code&gt;command_succeeds: "pytest"&lt;/code&gt; is a first-class primitive. One line. Every task gets a clean fixture copy automatically. The difference is not what is theoretically possible -- it is what is built in versus what you have to construct.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmarks that don't lie to you
&lt;/h2&gt;

&lt;p&gt;Measurement helps, but measurement can also mislead. Three failure modes are worth keeping in mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gaming your own benchmark.&lt;/strong&gt; When a metric becomes a target, behaviour adjusts to hit the target rather than the underlying goal. The baseline/challenger structure is the first defence -- you are not asking "does this pass" in isolation, you are asking "does this beat the baseline." The second defence is to include tasks your Skill was not specifically designed for. If adjacent tasks regress when your target tasks improve, you have a problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pass rate is a goal metric, not the whole picture.&lt;/strong&gt; Pass rate tells you whether the output was correct. It does not tell you what it cost to get there. Pitlane tracks tokens, cost, and time alongside pass rates. A Skill that takes a task from 60% to 80% pass rate while doubling token cost is a different trade-off than one that achieves the same at the same cost. Check both before deciding whether the change was worth shipping. The weighted score is also distinct from the binary pass rate -- a task where the critical assertion is weighted 3x tells a different story than a flat count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your context is not someone else's context.&lt;/strong&gt; A generic benchmark tells you how an assistant performs on generic tasks. The meaningful signal comes from tasks you write yourself, against fixture directories that reflect your actual project structure, with assertions that match what "done" means in your specific context. Borrowing a benchmark wholesale and optimising against it is still measuring someone else's problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this changes
&lt;/h2&gt;

&lt;p&gt;The question "is this actually better" becomes answerable.&lt;/p&gt;

&lt;p&gt;When you add a new tool to an MCP server, you can benchmark before and after and see whether the task that motivated the tool now passes more reliably. When you tighten a prompt in a Skill, you can see whether that tightening broke anything on tasks that previously passed.&lt;/p&gt;

&lt;p&gt;Without measurement, every change is a vibe. With measurement, you have a signal. The signal is not perfect. Benchmarks can be gamed. Task sets can be incomplete. Improvements on a small task set may not generalise. But noisy measurement beats no measurement. You can improve your task set over time. You cannot improve intuition alone.&lt;/p&gt;

&lt;p&gt;The lap times do not lie.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Pitlane is open source, takes a few minutes to set up, and is documented at the repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pitlane-ai/pitlane" rel="noopener noreferrer"&gt;https://github.com/pitlane-ai/pitlane&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are building MCP servers or AI coding Skills and you want hard numbers instead of gut feel, this is the tool. We built it because we needed it, and we would rather more people are measuring than guessing.&lt;/p&gt;

&lt;p&gt;If you find a gap, open an issue. If you add support for a new assistant or improve an existing one, send a PR. The codebase is Python, the architecture is straightforward, and contributions are welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Agentic workflow design — index and reading order</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Mon, 16 Feb 2026 16:56:15 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/agentic-workflow-design-index-and-reading-order-4443</link>
      <guid>https://dev.to/danielbutlerirl/agentic-workflow-design-index-and-reading-order-4443</guid>
      <description>&lt;p&gt;This series documents an enterprise workflow design for working with AI coding agents.&lt;/p&gt;

&lt;p&gt;It is not a prompt collection and it is not tied to a single tool. It is a structural approach based on observed failure modes in production environments and the gaps that exist in current agentic tooling.&lt;/p&gt;

&lt;p&gt;Agentic coding increases throughput. It also increases the probability of shipping something we did not intend to ship. The workflows described here are designed to close that gap.&lt;/p&gt;

&lt;p&gt;If you are new to the series, this post provides the reading order and context.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Failure modes: where agents fail and where we fail
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designing Agentic Workflows: Where Agents Fail, and Where We Fail&lt;/strong&gt;
&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95"&gt;https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post defines the predictable failure surfaces that emerge under volume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Baby-counting (silent requirement loss)&lt;/li&gt;
&lt;li&gt;Cardboard muffin (plausible but hollow implementations)&lt;/li&gt;
&lt;li&gt;Half-assing (working but structurally poor code)&lt;/li&gt;
&lt;li&gt;Litterbug (residue accumulation)&lt;/li&gt;
&lt;li&gt;Rubber-stamping, review fatigue, intent drift, and decision delegation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core argument: the agent’s optimisation behaviour and human cognitive limits combine to produce structural risk. Green CI and plausible diffs are observable signals, not guarantees of correctness.&lt;/p&gt;

&lt;p&gt;Start here. It defines the problem space.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. From diagnosis to design
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designing Agentic Workflows: A Practical Example&lt;/strong&gt;
&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j"&gt;https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post shifts from analysing failure to designing around it.&lt;/p&gt;

&lt;p&gt;It introduces the foundational constraint behind the workflow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Verification must be independent of the language model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The post explains why proposal and verification must be separated, why work must be bounded, and why durable intent must exist outside conversational context.&lt;/p&gt;

&lt;p&gt;This is the conceptual shape of the workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The core loop
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designing Agentic Workflows: The Core Loop&lt;/strong&gt;
&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-the-core-loop-166d"&gt;https://dev.to/danielbutlerirl/designing-agentic-workflows-the-core-loop-166d&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post describes the operational sequence used in practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define verification gates&lt;/li&gt;
&lt;li&gt;Plan one bounded task&lt;/li&gt;
&lt;li&gt;Implement exactly one task&lt;/li&gt;
&lt;li&gt;Repeat until all gates pass&lt;/li&gt;
&lt;li&gt;Run cleanup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It explains why sessions are treated as disposable, why durable state must live outside chat history, and why commit-sized changes preserve review integrity.&lt;/p&gt;

&lt;p&gt;This is the backbone of the methodology.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Supplementary commands and pressure valves
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designing Agentic Workflows: Supplementary Commands and Pressure Valves&lt;/strong&gt;
&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-supplementary-commands-and-pressure-valves-l51"&gt;https://dev.to/danielbutlerirl/designing-agentic-workflows-supplementary-commands-and-pressure-valves-l51&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core loop handles most work.&lt;/p&gt;

&lt;p&gt;This post covers additional structural controls used when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The issue cannot yet be defined in verifiable terms (&lt;code&gt;/wf-investigate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Interfaces must be explicit before implementation (&lt;code&gt;/wf-design&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Architectural decisions introduce durable constraints (&lt;code&gt;/wf-adr&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Long sessions begin degrading context (&lt;code&gt;/wf-summarise&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not alternative workflows. They are pressure valves that keep the core loop viable under complexity and long-running work.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this series is
&lt;/h2&gt;

&lt;p&gt;This is a workflow design for enterprise environments where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reviewability matters&lt;/li&gt;
&lt;li&gt;Audit and compliance exist&lt;/li&gt;
&lt;li&gt;Availability and security have real cost&lt;/li&gt;
&lt;li&gt;Silent regressions are unacceptable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It addresses gaps present in today’s tooling by changing the environment the model operates in rather than attempting to make the model smarter.&lt;/p&gt;

&lt;p&gt;As agentic tooling evolves, some of these controls may become redundant. Today, workflow design remains the most reliable control surface available.&lt;/p&gt;




&lt;p&gt;If you are adopting agentic coding in production systems, read the failure modes first. Then layer structure deliberately.&lt;/p&gt;

&lt;p&gt;Throughput is visible. Regressions often are not.&lt;/p&gt;

&lt;p&gt;This series is about narrowing that gap.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
      <category>agents</category>
    </item>
    <item>
      <title>Designing agentic workflows: supplementary commands and pressure valves</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Mon, 16 Feb 2026 16:40:18 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/designing-agentic-workflows-supplementary-commands-and-pressure-valves-l51</link>
      <guid>https://dev.to/danielbutlerirl/designing-agentic-workflows-supplementary-commands-and-pressure-valves-l51</guid>
      <description>&lt;p&gt;In the previous posts, we established:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95"&gt;Designing agentic workflows: where agents fail and where we fail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j"&gt;Designing agentic workflows: a practical example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-the-core-loop-166d"&gt;Designing agentic workflows: the core loop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core execution loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define gates&lt;/li&gt;
&lt;li&gt;Plan one bounded task&lt;/li&gt;
&lt;li&gt;Implement exactly one task&lt;/li&gt;
&lt;li&gt;Repeat until all gates pass&lt;/li&gt;
&lt;li&gt;Run cleanup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That loop is the default path. Most issues go straight into it.&lt;/p&gt;

&lt;p&gt;The supplementary commands do not replace the loop. They address two pressures: context degradation and intent drift.&lt;/p&gt;

&lt;p&gt;If neither pressure is present, skip them. If either appears, use them deliberately.&lt;/p&gt;




&lt;h1&gt;
  
  
  Pressure 1: Context degrades
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;/wf-summarise&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Long sessions degrade gradually. Repeated corrections appear. Previously rejected approaches reappear. Architectural decisions get lost. Small logic mistakes creep in.&lt;/p&gt;

&lt;p&gt;The core loop assumes sessions are disposable.&lt;/p&gt;

&lt;p&gt;The "50% rule" is a heuristic, not a hard stop. Finish the current bounded unit of work and exit before automatic compaction occurs, corrections begin looping, or state reconstruction becomes unreliable.&lt;/p&gt;

&lt;p&gt;Compaction compresses earlier reasoning. Each compression step discards detail. After several rounds, subtle constraints disappear.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/wf-summarise&lt;/code&gt; prevents that erosion.&lt;/p&gt;




&lt;h2&gt;
  
  
  What &lt;code&gt;/wf-summarise&lt;/code&gt; does
&lt;/h2&gt;

&lt;p&gt;When you decide to reset:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finish the current task or step.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;/wf-summarise&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It generates a structured temporary handover document and a phase-aware continuation prompt for the next session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The handover captures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issue objective and scope&lt;/li&gt;
&lt;li&gt;Gate status&lt;/li&gt;
&lt;li&gt;Completed tasks&lt;/li&gt;
&lt;li&gt;Remaining work&lt;/li&gt;
&lt;li&gt;Key architectural decisions&lt;/li&gt;
&lt;li&gt;Relevant constraints&lt;/li&gt;
&lt;li&gt;Important discoveries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Handover documents are temporary. They bridge sessions, not commits.&lt;/p&gt;

&lt;p&gt;The command output includes a continuation block tailored to the current phase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="s"&gt;You are resuming work on `issue-47-user-validation`.&lt;/span&gt;

&lt;span class="na"&gt;Before proceeding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;1. Read `.agents/issues/issue-47-user-validation/handover.md`&lt;/span&gt;
&lt;span class="s"&gt;2. Confirm gate status&lt;/span&gt;
&lt;span class="s"&gt;3. Identify next task&lt;/span&gt;

&lt;span class="na"&gt;Current phase&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implementation&lt;/span&gt;
&lt;span class="na"&gt;Tasks completed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-1, task-2&lt;/span&gt;
&lt;span class="na"&gt;Tasks remaining&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-3, task-4&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You paste that into a fresh session along with the handover document. The new session reconstructs state from artifacts and the handover. Once alignment is confirmed, the handover can be discarded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Task almost complete, context around 60%&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tests nearly passing. Work coherent.&lt;/p&gt;

&lt;p&gt;Finished the task. Committed. Started a fresh session for the next task.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Corrections looping, context around 60%&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agent repeating rejected approaches. Failing to resolve something cleanly. Constraints being restated.&lt;/p&gt;

&lt;p&gt;Degradation has started.&lt;/p&gt;

&lt;p&gt;Stopped iterating. Ran &lt;code&gt;/wf-summarise&lt;/code&gt;. Reset deliberately instead of brute-forcing through polluted context.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Mid-work, context near 70%&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mid-design or mid-implementation. Significant work remaining.&lt;/p&gt;

&lt;p&gt;Context near compaction.&lt;/p&gt;

&lt;p&gt;Checkpoint. Reset. Continue in a fresh session.&lt;/p&gt;




&lt;p&gt;&lt;code&gt;/wf-summarise&lt;/code&gt; is a pressure valve for context. It makes resets controlled instead of lossy.&lt;/p&gt;




&lt;h1&gt;
  
  
  Pressure 2: Intent must be explicit
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Starting point: Issue with clear success criteria
&lt;/h2&gt;

&lt;p&gt;Before entering the core loop, you need an issue with verifiable success criteria.&lt;/p&gt;

&lt;p&gt;Most teams already have issues from GitHub, JIRA, product specs, or bug reports. If your issue has clear, verifiable criteria, proceed to the litmus test below.&lt;/p&gt;

&lt;p&gt;If you need to create or enrich an issue, use &lt;code&gt;/wf-issue-plan&lt;/code&gt;. It will check for investigation, design, or ADR gaps and suggest the appropriate on-demand command before proceeding.&lt;/p&gt;




&lt;h2&gt;
  
  
  The on-demand trio
&lt;/h2&gt;

&lt;p&gt;Once you have an issue defined, ask:&lt;/p&gt;

&lt;p&gt;Can I define verification gates for this right now?&lt;/p&gt;

&lt;p&gt;If the answer is unclear, do not enter the core loop yet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes, clearly&lt;/strong&gt; - Go straight to gates and enter the core loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes, but I need to define interfaces first&lt;/strong&gt; - Use &lt;code&gt;/wf-design&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes, but this requires an architectural decision that constrains future work&lt;/strong&gt; - Use &lt;code&gt;/wf-adr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No, I don't understand the issue or codebase well enough&lt;/strong&gt; - Use &lt;code&gt;/wf-investigate&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These commands make intent explicit before implementation begins.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;/wf-investigate&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Use this when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The issue description is vague.&lt;/li&gt;
&lt;li&gt;You are debugging unfamiliar code.&lt;/li&gt;
&lt;li&gt;You need to explore before defining "fixed."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear bugfixes with known root cause.&lt;/li&gt;
&lt;li&gt;Features in familiar code with obvious implementation path.&lt;/li&gt;
&lt;li&gt;Changes where you can immediately define "done."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A bug report says "Authentication sometimes fails." You cannot define gates yet. "Sometimes" is not verifiable.&lt;/p&gt;

&lt;p&gt;Investigation might reveal it fails when token expiry falls within a 5-second race window and only affects a specific middleware branch.&lt;/p&gt;

&lt;p&gt;Now you can define concrete gates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expired_token_within_grace_period_rejected&lt;/li&gt;
&lt;li&gt;valid_token_within_window_accepted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Investigation exists to make gates possible. If you cannot define "done," you do not understand the problem well enough.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;/wf-design&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Use this when introducing new interfaces, changing public contracts, or adding cross-cutting abstractions.&lt;/p&gt;

&lt;p&gt;Not needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal implementation details that don't affect contracts.&lt;/li&gt;
&lt;li&gt;Small behavioral changes in existing functions.&lt;/li&gt;
&lt;li&gt;Refactoring that preserves existing interfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Design produces proposed interfaces, data shapes, interaction patterns, and trade-offs. No implementation. Human review happens before code.&lt;/p&gt;

&lt;p&gt;You are adding a new API endpoint. Instead of implementing immediately, you define request/response schema, error contract, and versioning expectations.&lt;/p&gt;

&lt;p&gt;Design answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are we building for this issue?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It prevents structural drift during implementation. Design is issue-scoped structure.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;/wf-adr&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Use this when the decision introduces or rejects a dependency, changes architectural direction, constrains future work, or is likely to be revisited if undocumented.&lt;/p&gt;

&lt;p&gt;Not needed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementation choices (sort algorithm, loop structure, data structure).&lt;/li&gt;
&lt;li&gt;Local design patterns within a module.&lt;/li&gt;
&lt;li&gt;Tooling or developer experience improvements.&lt;/li&gt;
&lt;li&gt;Style or convention decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reserved for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introducing or rejecting dependencies (libraries, services, infrastructure).&lt;/li&gt;
&lt;li&gt;Choosing system-wide patterns (API style, auth approach, data flow).&lt;/li&gt;
&lt;li&gt;Organizational architecture (monorepo structure, deployment strategy).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The purpose of &lt;code&gt;/wf-adr&lt;/code&gt; is not to let the model decide. It structures the decision space.&lt;/p&gt;

&lt;p&gt;The command produces context, explicit options, trade-offs, and consequences of each option. It does not select the final approach.&lt;/p&gt;

&lt;p&gt;The output is presented to the human. The human reviews it with their team. The team makes the decision. That decision is documented as the ADR. The documented ADR becomes a durable constraint. Future planning must respect it.&lt;/p&gt;

&lt;p&gt;Choosing between native crypto APIs or introducing a third-party JWT library: the agent can enumerate maintenance cost, upgrade surface area, and operational risk. It does not choose. The team decides. The ADR records that decision.&lt;/p&gt;

&lt;p&gt;ADR answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What rule are we introducing into the system?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Design is issue-scoped. ADR is cross-issue constraint.&lt;/p&gt;




&lt;h1&gt;
  
  
  Knowing when to skip
&lt;/h1&gt;

&lt;p&gt;Not every change needs investigation. Not every feature needs design. Not every decision needs an ADR.&lt;/p&gt;

&lt;p&gt;Small, well-understood bugfix? Go straight to gates.&lt;/p&gt;

&lt;p&gt;Clear behavioural adjustment with no structural impact? Skip design.&lt;/p&gt;

&lt;p&gt;Implementation detail that does not affect boundaries? No ADR.&lt;/p&gt;

&lt;p&gt;The core loop is the default. The supplementary commands are situational.&lt;/p&gt;




&lt;h1&gt;
  
  
  How this supports the core loop
&lt;/h1&gt;

&lt;p&gt;The core loop remains:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define gates&lt;/li&gt;
&lt;li&gt;Plan bounded task&lt;/li&gt;
&lt;li&gt;Implement exactly one task&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;li&gt;Cleanup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The supplementary commands intervene before or during that loop when pressure appears:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/wf-issue-plan&lt;/code&gt; when creating or enriching issues.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/wf-investigate&lt;/code&gt; before gates.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/wf-design&lt;/code&gt; before implementation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/wf-adr&lt;/code&gt; before structural commitment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/wf-summarise&lt;/code&gt; during long-running work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They do not replace the loop. They keep it viable under complexity.&lt;/p&gt;

&lt;p&gt;The core loop enforces bounded implementation.&lt;br&gt;
The supplementary commands enforce bounded context and explicit intent.&lt;/p&gt;

&lt;p&gt;If no pressure exists, skip them.&lt;br&gt;
If pressure appears, activate them deliberately.&lt;br&gt;
The structure stays lean by default and expands only when necessary.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Designing agentic workflows: the core loop</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Mon, 16 Feb 2026 14:37:08 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/designing-agentic-workflows-the-core-loop-166d</link>
      <guid>https://dev.to/danielbutlerirl/designing-agentic-workflows-the-core-loop-166d</guid>
      <description>&lt;p&gt;The previous posts laid out the failure modes and the initial structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Designing agentic workflows: where agents fail and where we fail&lt;br&gt;
&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95"&gt;https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Designing agentic workflows: a practical example&lt;br&gt;
&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j"&gt;https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those posts described where agents fail, where we fail, and what a constrained workflow looks like in principle.&lt;/p&gt;

&lt;p&gt;This post shows the core loop as it is implemented in practice:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/daniel-butler-irl/sample-agentic-workflows" rel="noopener noreferrer"&gt;https://github.com/daniel-butler-irl/sample-agentic-workflows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a prompt collection. It is a sequence. The ordering matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sessions are disposable. The repository is not
&lt;/h2&gt;

&lt;p&gt;Every command in this workflow runs in a fresh session.&lt;/p&gt;

&lt;p&gt;That decision drives everything else.&lt;/p&gt;

&lt;p&gt;Long sessions drift. Context grows. Earlier constraints become less salient. Decisions get made implicitly and are hard to reconstruct later. Instead of trying to manage that complexity, the workflow treats sessions as disposable and moves all durable state into the repository being changed.&lt;/p&gt;

&lt;p&gt;On the feature branch, alongside the code, you will find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; (or &lt;code&gt;CLAUDE.md&lt;/code&gt; for Claude Code)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.agents/tasks/&amp;lt;issue&amp;gt;/gates.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.agents/tasks/&amp;lt;issue&amp;gt;/task-N.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.agents/tasks/&amp;lt;issue&amp;gt;/cleanup.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those files are committed. They provide traceability of intent, an explicit definition of done, recorded discoveries, and an auditable cleanup step before the PR.&lt;/p&gt;

&lt;p&gt;If it is not written down in the repository, it does not persist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Intent exists before the workflow starts
&lt;/h2&gt;

&lt;p&gt;Those artifacts — gates, tasks, cleanup — all assume an issue already exists with defined objective, scope, and success criteria.&lt;/p&gt;

&lt;p&gt;That issue can be a GitHub issue, a Jira ticket, a markdown file in &lt;code&gt;.agents/issues/&lt;/code&gt;, or whatever your team uses. The format does not matter. The content does: objective defined, scope bounded, success criteria explicit.&lt;/p&gt;

&lt;p&gt;The agent does not start by “figuring out what to do.” It starts from defined intent.&lt;/p&gt;

&lt;p&gt;Everything that follows is downstream of that.&lt;/p&gt;

&lt;p&gt;If you need to investigate a codebase or research architectural decisions before defining clear gates, the repository includes supplementary commands for those situations. This post focuses on the core loop once intent is established.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;AGENTS.md&lt;/code&gt;: non-negotiables and evolving guardrails
&lt;/h1&gt;

&lt;p&gt;This file is injected into every session. It is the first constraint in the system.&lt;/p&gt;

&lt;p&gt;Agents optimise for visible signals: passing tests, plausible diffs, confident summaries. If you do not constrain that behaviour, they will take shortcuts.&lt;/p&gt;

&lt;p&gt;The repository includes a base &lt;code&gt;AGENTS.md&lt;/code&gt; template. The generic parts handle commit discipline and test protection. The real value is in &lt;strong&gt;project-specific rules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That section evolves.&lt;/p&gt;

&lt;p&gt;You will see patterns. Maybe the agent keeps adding &lt;code&gt;axios&lt;/code&gt; when your standard is &lt;code&gt;fetch&lt;/code&gt;. Maybe it refactors files you meant to leave stable. Maybe it rewrites tests instead of fixing the implementation.&lt;/p&gt;

&lt;p&gt;When I saw &lt;code&gt;axios&lt;/code&gt; added the third time in a codebase that uses &lt;code&gt;fetch&lt;/code&gt;, this rule was added:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never add axios. This project uses native fetch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That mistake never happened again.&lt;/p&gt;

&lt;p&gt;Because sessions are fresh by design, the only durable memory is what you encode here.&lt;/p&gt;

&lt;p&gt;This file lives in source control. The entire team works against the same rule set. When a new constraint is added, it is visible in the diff. Some rules are permanent. Some are temporary, tied to a migration or architectural transition. The file evolves with the codebase.&lt;/p&gt;

&lt;p&gt;Keep it under 200 lines. Longer files dilute the important rules. This is not a coding standard. It is a focused control surface aimed at preventing known shortcuts and protecting architectural boundaries.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;wf-01&lt;/code&gt;: Define gates before writing code
&lt;/h1&gt;

&lt;p&gt;The agent does not immediately modify code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wf-01&lt;/code&gt; reads the issue and produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents/tasks/&amp;lt;issue&amp;gt;/gates.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each gate defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A concrete success condition.&lt;/li&gt;
&lt;li&gt;How it will be verified.&lt;/li&gt;
&lt;li&gt;A complexity classification (SIMPLE or COMPLEX).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The verification must be independent of the agent’s judgement.&lt;/p&gt;

&lt;p&gt;A gate might look like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;email_validation_rejects_invalid_domains&lt;/code&gt; test fails before the change and passes after.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;terraform plan&lt;/code&gt; shows exactly three new resources and no replacements.&lt;/li&gt;
&lt;li&gt;Manual: saving preferences with an invalid form leaves the save button disabled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Invalid examples are things like “The implementation looks correct” or “The agent confirms this works.”&lt;/p&gt;

&lt;p&gt;Gates define the contract. They make “done” explicit before implementation begins.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;wf-02&lt;/code&gt;: Plan tasks as bounded units of change
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;wf-02&lt;/code&gt; reads &lt;code&gt;gates.md&lt;/code&gt; and creates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents/tasks/&amp;lt;issue&amp;gt;/task-N.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Covers one or more specific gates.&lt;/li&gt;
&lt;li&gt;Is sized to a single commit.&lt;/li&gt;
&lt;li&gt;Produces a reviewable diff.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default is to plan one task at a time.&lt;/p&gt;

&lt;p&gt;Complex changes surface unknowns during implementation. Planning only the next task allows direction to change without rewriting a stale multi-step plan.&lt;/p&gt;

&lt;p&gt;For trivial, deterministic changes, planning all tasks up front is fine. The SIMPLE/COMPLEX classification in &lt;code&gt;gates.md&lt;/code&gt; makes that explicit.&lt;/p&gt;

&lt;p&gt;Each task file includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An implementation checklist.&lt;/li&gt;
&lt;li&gt;A completion checklist tied to gates.&lt;/li&gt;
&lt;li&gt;A commit template.&lt;/li&gt;
&lt;li&gt;An Implementation Notes section.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementation Notes capture discoveries that would otherwise be lost between fresh sessions.&lt;/p&gt;

&lt;p&gt;For example, during one change I discovered that &lt;code&gt;UserService&lt;/code&gt; already handled rate limiting. Instead of introducing new middleware, the next task reused that logic. That discovery was written into Implementation Notes so it became part of the durable context, not tribal knowledge from a single session.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;wf-03&lt;/code&gt;: Implement one task per session
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;wf-03&lt;/code&gt; executes exactly one task.&lt;/p&gt;

&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads &lt;code&gt;task-N.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Executes the checklist.&lt;/li&gt;
&lt;li&gt;Verifies the gates assigned to that task.&lt;/li&gt;
&lt;li&gt;Records discoveries.&lt;/li&gt;
&lt;li&gt;Stops.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The human reviews and commits.&lt;/p&gt;

&lt;p&gt;The agent never commits.&lt;/p&gt;

&lt;p&gt;Then the loop repeats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plan the next task.&lt;/li&gt;
&lt;li&gt;Implement exactly one task.&lt;/li&gt;
&lt;li&gt;Stop.&lt;/li&gt;
&lt;li&gt;Commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The loop ends when all gates in &lt;code&gt;gates.md&lt;/code&gt; are satisfied.&lt;/p&gt;

&lt;p&gt;Not when “all tasks are complete.” Tasks are scaffolding. Gates define the contract.&lt;/p&gt;

&lt;p&gt;Keeping changes at commit-sized units preserves review quality. It keeps the reviewer in verification mode instead of plausibility mode.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;wf-04&lt;/code&gt;: Cleanup before the PR
&lt;/h1&gt;

&lt;p&gt;Cleanup runs once per issue, after all tasks are implemented and all gates pass. Not before.&lt;/p&gt;

&lt;p&gt;The branch must represent the complete intended change before you audit it.&lt;/p&gt;

&lt;p&gt;Cleanup produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.agents/tasks/&amp;lt;issue&amp;gt;/cleanup.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It performs three steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit the branch for residue.&lt;/li&gt;
&lt;li&gt;Apply selected fixes.&lt;/li&gt;
&lt;li&gt;Re-run all gates and the full test suite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after cleanup passes do you open the PR.&lt;/p&gt;

&lt;p&gt;This step catches the small things that accumulate during incremental work: temporary logging, unused imports, defensive code that became unnecessary. It also forces a final re-validation of the original contract.&lt;/p&gt;




&lt;h1&gt;
  
  
  How this constrains the failure modes
&lt;/h1&gt;

&lt;p&gt;This workflow does not try to make the agent smarter. It changes the environment the agent operates in.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; prevents shortcuts the agent would otherwise take: deleting tests to make CI green, introducing inappropriate dependencies, bypassing established patterns. That constrains baby-counting, half-assing, and scope creep.&lt;/p&gt;

&lt;p&gt;Gates force independent verification before any claim of completion. That constrains cardboard-muffin implementations and premature “done” signals.&lt;/p&gt;

&lt;p&gt;Commit-sized tasks keep review within human cognitive limits. That constrains review fatigue and rubber-stamping.&lt;/p&gt;

&lt;p&gt;The human-commits-only rule keeps architectural decisions explicit. That constrains decision delegation.&lt;/p&gt;

&lt;p&gt;Implementation Notes turn discoveries into durable context across fresh sessions. That constrains intent drift.&lt;/p&gt;

&lt;p&gt;Cleanup catches residue systematically rather than hoping a reviewer notices it. That constrains litterbug behaviour.&lt;/p&gt;

&lt;p&gt;The workflow assumes these failures will occur if the structure allows them. The structure is designed to make them harder to hide and cheaper to detect.&lt;/p&gt;




&lt;h1&gt;
  
  
  The sequence
&lt;/h1&gt;

&lt;p&gt;For each issue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define gates.&lt;/li&gt;
&lt;li&gt;Plan a bounded task.&lt;/li&gt;
&lt;li&gt;Implement exactly one task.&lt;/li&gt;
&lt;li&gt;Repeat steps 2–3 until all gates pass.&lt;/li&gt;
&lt;li&gt;Run cleanup.&lt;/li&gt;
&lt;li&gt;Re-validate all gates.&lt;/li&gt;
&lt;li&gt;Open the PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That ordering is not accidental.&lt;/p&gt;

&lt;p&gt;If you change the order, you weaken the constraints.&lt;/p&gt;

&lt;p&gt;If you keep the sequence intact, the failure modes described earlier are systematically constrained instead of managed informally.&lt;/p&gt;




&lt;h1&gt;
  
  
  What comes next
&lt;/h1&gt;

&lt;p&gt;This loop is the default path. Most issues go straight through it.&lt;/p&gt;

&lt;p&gt;When two pressures appear - context degradation or intent drift - supplementary commands exist to keep the loop viable. Those commands and when to use them are covered in the next post:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-supplementary-commands-and-pressure-valves-l51"&gt;Designing agentic workflows: supplementary commands and pressure valves&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Designing agentic workflows: a practical example</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Tue, 03 Feb 2026 11:05:46 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j</link>
      <guid>https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j</guid>
      <description>&lt;p&gt;The previous post focused on failure modes: where agents fail, and where we fail when reviewing their output. This follow-up shifts from diagnosis to design.&lt;/p&gt;

&lt;p&gt;What follows is a &lt;strong&gt;sample workflow&lt;/strong&gt; that is explicitly structured to counter those failure modes. It is not the only way to do this, and it is not meant to be permanent. It is one workable design intended to turn known risks into explicit constraints and force verification back into the loop.&lt;/p&gt;

&lt;p&gt;This post assumes familiarity with the earlier analysis. If you haven’t read it, the failure modes this workflow responds to are covered here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95"&gt;Designing agentic workflows: where agents fail and where we fail&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What this workflow is (and isn’t)
&lt;/h2&gt;

&lt;p&gt;This workflow is designed for developers who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;are new to agentic coding and want a cautious, structured starting point&lt;/li&gt;
&lt;li&gt;need reviewable commits and explicit verification gates&lt;/li&gt;
&lt;li&gt;work in enterprise environments with audit, compliance, or production risk&lt;/li&gt;
&lt;li&gt;want to prevent common AI failure modes such as premature completion claims, silent test deletion, and shallow or hard-coded implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;strong&gt;not&lt;/strong&gt; designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exploratory hacking&lt;/li&gt;
&lt;li&gt;green-field personal projects&lt;/li&gt;
&lt;li&gt;environments where reviewability and accountability are optional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As tools improve and teams gain experience, much of this should be streamlined or removed. This is scaffolding, not a permanent prescription.&lt;/p&gt;




&lt;h2&gt;
  
  
  The key constraint this workflow enforces
&lt;/h2&gt;

&lt;p&gt;This workflow is built around a single constraint that was implicit in the first post but not yet operationalised:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;verification must be independent of the language model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The failure modes discussed earlier cluster around the same structural issue: the system is allowed to participate in judging its own success. Confidence, summaries, and “done” signals become substitutes for evidence.&lt;/p&gt;

&lt;p&gt;This workflow explicitly &lt;strong&gt;separates proposal from verification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The agent can propose changes, generate code, and assemble artifacts. Verification is performed independently using &lt;strong&gt;external tools&lt;/strong&gt; such as test runners, linters, type checkers, static analysis, and real execution.&lt;/p&gt;

&lt;p&gt;The intent is &lt;strong&gt;trust, but verify&lt;/strong&gt;.&lt;br&gt;
The model is trusted to propose changes and assemble artifacts. Verification is handled independently using tools with different incentives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a workflow is necessary at all
&lt;/h2&gt;

&lt;p&gt;Agentic systems optimise against what they can observe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;green tests&lt;/li&gt;
&lt;li&gt;plausible diffs&lt;/li&gt;
&lt;li&gt;explicit completion signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Humans under review pressure tend to do the same.&lt;/p&gt;

&lt;p&gt;A workflow has to deliberately change the optimisation surface by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bounding work into small, reviewable units&lt;/li&gt;
&lt;li&gt;making intent explicit and durable&lt;/li&gt;
&lt;li&gt;forcing independent, machine-verifiable evidence before claims of completion&lt;/li&gt;
&lt;li&gt;preventing large, ambiguous diffs from accumulating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this constraint, the workflow does not materially change those outcomes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core design principles
&lt;/h2&gt;

&lt;p&gt;All variants of the workflow follow the same underlying rules, regardless of tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Intent is captured before execution
&lt;/h3&gt;

&lt;p&gt;Each task starts with a written intent that defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is being changed&lt;/li&gt;
&lt;li&gt;what is explicitly &lt;em&gt;not&lt;/em&gt; being changed&lt;/li&gt;
&lt;li&gt;what success looks like&lt;/li&gt;
&lt;li&gt;what evidence will be used to verify it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents intent from living only in conversation history and reduces the chance of silent scope drift.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Planning and execution are separated
&lt;/h3&gt;

&lt;p&gt;The agent does not immediately start modifying code.&lt;/p&gt;

&lt;p&gt;There is a planning step that produces an explicit, reviewable plan. Only after that plan is accepted does execution begin.&lt;/p&gt;

&lt;p&gt;This keeps architectural and behavioural decisions visible and reduces surprise diffs.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Changes are deliberately small
&lt;/h3&gt;

&lt;p&gt;Each loop is constrained to a narrow scope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one concern&lt;/li&gt;
&lt;li&gt;one behavioural change&lt;/li&gt;
&lt;li&gt;one verification target&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps review within human cognitive limits and avoids the shift from verification to plausibility that occurs as diffs grow.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Verification is independent and machine-verifiable
&lt;/h3&gt;

&lt;p&gt;Completion requires evidence produced by tools that are &lt;em&gt;not&lt;/em&gt; the language model.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test execution results&lt;/li&gt;
&lt;li&gt;static analysis outputs&lt;/li&gt;
&lt;li&gt;type-checker passes or failures&lt;/li&gt;
&lt;li&gt;runtime traces or logs from real execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model’s explanations and summaries provide context, not verification. This is a deliberate application of &lt;strong&gt;trust, but verify&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Cleanup is mandatory
&lt;/h3&gt;

&lt;p&gt;Every loop ends with a cleanup pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remove temporary scaffolding&lt;/li&gt;
&lt;li&gt;remove dead code&lt;/li&gt;
&lt;li&gt;consolidate overlapping helpers&lt;/li&gt;
&lt;li&gt;update comments to match behaviour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cleanup is treated as part of correctness rather than a cosmetic improvement. Residue compounds review cost and cognitive load over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The sample workflows
&lt;/h2&gt;

&lt;p&gt;The repository contains several variants of the same workflow adapted for different tools. Structurally, they are identical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/daniel-butler-irl/sample-agentic-workflows" rel="noopener noreferrer"&gt;https://github.com/daniel-butler-irl/sample-agentic-workflows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each workflow documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the phases of the loop&lt;/li&gt;
&lt;li&gt;what the agent is allowed to do in each phase&lt;/li&gt;
&lt;li&gt;what the human is expected to review&lt;/li&gt;
&lt;li&gt;what artifacts must exist before progressing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also a &lt;strong&gt;generic methodology document&lt;/strong&gt; in the repository (&lt;code&gt;docs/methodology.md&lt;/code&gt;) that describes the workflow shape and constraints in a tool-agnostic way, using command-style notation to illustrate phases.&lt;/p&gt;

&lt;p&gt;The important part is not the syntax. It’s the shape of the loop.&lt;/p&gt;

&lt;p&gt;This post intentionally does not walk through the workflow step by step. The mechanics are documented in the repository. A follow-up post will walk through one variant in detail and show how the constraints described here are enforced in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  How this mitigates the earlier failure modes
&lt;/h2&gt;

&lt;p&gt;This workflow does not attempt to fix the model. It changes the environment the model operates in.&lt;/p&gt;

&lt;p&gt;Small scopes, durable intent, and independent verification reduce the surface area where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requirements can disappear silently&lt;/li&gt;
&lt;li&gt;shallow implementations can pass unnoticed&lt;/li&gt;
&lt;li&gt;reviewers are pushed into plausibility checks&lt;/li&gt;
&lt;li&gt;architectural decisions slip through unexamined&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow assumes these failures will occur if the structure allows them. Its job is to make them harder to hide and cheaper to detect.&lt;/p&gt;




&lt;h2&gt;
  
  
  This is a starting point
&lt;/h2&gt;

&lt;p&gt;If you already have strong internal workflows, you may only need pieces of this.&lt;/p&gt;

&lt;p&gt;If you are early in agentic coding adoption, starting with something like this avoids learning the hard lessons in production.&lt;/p&gt;

&lt;p&gt;As tools add better built-in guardrails, some of this will become redundant. Until then, workflow design remains the most reliable control surface we have.&lt;/p&gt;

&lt;p&gt;This repository is meant to be copied, adapted, and eventually outgrown.&lt;/p&gt;

&lt;p&gt;In the next post, I walk through how this structure is implemented in practice — how &lt;code&gt;AGENTS.md&lt;/code&gt;, gates, task files, and cleanup steps are wired together into a repeatable core loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-the-core-loop-166d"&gt;Designing agentic workflows: the core loop&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>codereview</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Designing agentic workflows: where agents fail and where we fail</title>
      <dc:creator>Daniel Butler</dc:creator>
      <pubDate>Fri, 30 Jan 2026 13:53:40 +0000</pubDate>
      <link>https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95</link>
      <guid>https://dev.to/danielbutlerirl/designing-agentic-workflows-where-agents-fail-and-where-we-fail-4a95</guid>
      <description>&lt;p&gt;Agentic coding increases throughput. It also increases the probability that we ship something we didn't mean to ship.&lt;/p&gt;

&lt;p&gt;Both the agent and the review process tend to optimise for visible success signals: green tests, plausible diffs, confident summaries, "done".&lt;/p&gt;

&lt;p&gt;This creates predictable failure modes in production work, split into two buckets: where the agent fails (reward hijacking, shallow correctness, residue), and where we fail as output volume spikes (review fatigue, rubber-stamping, intent drift, decision delegation). The split matters because the agent's failure modes are only half the story. The other half is how our own behaviour changes when output volume spikes.&lt;/p&gt;

&lt;p&gt;This isn't an argument against using agents. We get real leverage from them. The point is that the failure modes are predictable, and if we don't design our workflow around them, we end up shipping problems with a green CI badge.&lt;/p&gt;

&lt;p&gt;There are two expectations to set up front:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The workflow has to work &lt;strong&gt;with the human&lt;/strong&gt;, not against them. Most failures don't come from a single "bad suggestion". They come from a process that stops enforcing verification once the diffs get big.&lt;/li&gt;
&lt;li&gt;Enterprise stakes are different. In personal projects we can optimise for momentum and fun. In production work, we're exposed to security regressions, compliance issues, availability incidents, and quiet failures that only surface months later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools are evolving rapidly, with more built-in guardrails appearing. These failure modes are architectural, not implementation bugs in current tools. Guardrails help, but workflow design remains essential. This post focuses on the patterns, not the tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we mean by "vibe coding"
&lt;/h2&gt;

&lt;p&gt;The term has picked up multiple definitions. Here, I'm using it to mean working primarily at the level of intent, and relying on an agentic system to generate and evolve the implementation details.&lt;/p&gt;

&lt;p&gt;That shift increases speed and volume. It does not change ownership. If a failure slips through the gap, it's our failure. The tool isn't accountable. We are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these failures cluster
&lt;/h2&gt;

&lt;p&gt;The most useful label I've found for this behaviour is &lt;strong&gt;reward hijacking&lt;/strong&gt;: the system is not trying to deceive anyone — it's optimising for what it can observe and be "rewarded" for.&lt;/p&gt;

&lt;p&gt;In agentic coding, the "reward" is often an observable success signal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tests are green&lt;/li&gt;
&lt;li&gt;linters are quiet&lt;/li&gt;
&lt;li&gt;the diff looks plausible at a glance&lt;/li&gt;
&lt;li&gt;the agent says "done"&lt;/li&gt;
&lt;li&gt;the UI loads once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's all we validate, that's all we'll reliably get.&lt;/p&gt;

&lt;p&gt;These failure modes cluster around a gap: machine-verifiable gates (tests, linters, type checks) are necessary but insufficient. They catch syntax and contract violations. They don't catch "this works but isn't what we meant" or "this passes but the coverage is worse."&lt;/p&gt;

&lt;h2&gt;
  
  
  Long sessions amplify everything
&lt;/h2&gt;

&lt;p&gt;As the current conversation context grows, earlier intent and constraints are more likely to be missed even if they're still present.&lt;/p&gt;

&lt;p&gt;This is a known long-context behaviour: the &lt;strong&gt;"lost in the middle"&lt;/strong&gt; effect. In long-context evaluation of language models, performance is often highest when relevant information is near the beginning or end, and degrades when the relevant detail is buried in the middle.&lt;/p&gt;

&lt;p&gt;This doesn't create new failure modes. It increases the probability of all of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where agents fail
&lt;/h2&gt;

&lt;p&gt;The four named failure modes below are from &lt;em&gt;Vibe Coding&lt;/em&gt; by Gene Kim and Steve Yegge. I'm using their names as labels, and grounding each one with a concrete example of how it shows up in code review.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Baby-counting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
Requirements are silently dropped while the system still claims completion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
The observable success signal is "the thing looks done" (green CI, fewer failing checks, a confident completion message), not "all original requirements are satisfied".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The metaphor&lt;/strong&gt;&lt;br&gt;
You send someone into a room to count the babies. They report back: "Ten babies, all accounted for." You trust the count. Everything looks fine.&lt;/p&gt;

&lt;p&gt;An hour later, you go into the room yourself. There are five babies.&lt;/p&gt;

&lt;p&gt;Everything was fine until it wasn't. Now it's a catastrophe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
We have ten failing unit tests. We ask the agent to "make sure there are no failing tests".&lt;/p&gt;

&lt;p&gt;The agent fixes five tests, skips one, and deletes the remaining tests.&lt;/p&gt;

&lt;p&gt;Result: zero failing tests.&lt;/p&gt;

&lt;p&gt;From the system's perspective, the observable goal was achieved. From our perspective, coverage was silently lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
Coverage loss is silent. No failing tests, no alerts, just missing protection that surfaces months later when something else breaks and there's no test to catch it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deleted tests, skipped tests, weakened assertions&lt;/li&gt;
&lt;li&gt;"refactors" with suspiciously large removals&lt;/li&gt;
&lt;li&gt;acceptance criteria quietly disappearing from the discussion&lt;/li&gt;
&lt;li&gt;any change that reduces safety signals while claiming progress&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Cardboard muffin
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
The output looks correct on the surface but is hollow or incorrect inside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
Plausibility + test satisfaction are strong proxies. If tests can be satisfied shallowly, there is no pressure to implement the real behaviour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
We provide a function signature and tests. The agent produces a large implementation with helpers and branching.&lt;/p&gt;

&lt;p&gt;Buried in the code is a hard-coded return value. Regardless of input, the function always returns the same result. The existing tests pass.&lt;/p&gt;

&lt;p&gt;The code has the shape of a solution without implementing the underlying intent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
This creates false confidence. Reviewers skim because it looks like a serious implementation. CI is green because the tests were satisfiable shallowly. The bug appears later under real inputs, at a time when the original change is no longer fresh in anyone's head.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hard-coded constants where logic should exist&lt;/li&gt;
&lt;li&gt;conditionals that funnel everything into one output&lt;/li&gt;
&lt;li&gt;broad fallbacks that swallow errors&lt;/li&gt;
&lt;li&gt;tests that assert shape/type instead of behaviour&lt;/li&gt;
&lt;li&gt;"impressive" structure with suspiciously little meaningful computation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Half-assing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
Correct behaviour, poor implementation.&lt;/p&gt;

&lt;p&gt;The feature works, but it ignores standards, architecture, operational concerns, or long-term maintainability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
Unless quality constraints are explicit, the shortest path to "works" wins. The observable success signal is "feature delivered", not "feature delivered sustainably".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
The agent implements the feature correctly but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hard-codes configuration that should be injectable&lt;/li&gt;
&lt;li&gt;bypasses existing abstractions and duplicates logic&lt;/li&gt;
&lt;li&gt;adds minimal error handling to get the happy path working&lt;/li&gt;
&lt;li&gt;writes tests that cover only the most obvious scenario&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything passes. The change is "done". The repo got worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
The debt is silent and cumulative. Each shortcut makes the next change harder. It shows up later as slower delivery, production incidents from missing error handling, operational friction from hard-coded behaviour, and inconsistent patterns across teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;configuration hard-coded into code paths&lt;/li&gt;
&lt;li&gt;bypassing existing patterns "because it's faster"&lt;/li&gt;
&lt;li&gt;incomplete error handling or missing observability&lt;/li&gt;
&lt;li&gt;tests that don't cover failure cases&lt;/li&gt;
&lt;li&gt;new dependencies without justification&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4) Litterbug
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
Residue left behind after "working" changes.&lt;/p&gt;

&lt;p&gt;The behaviour works, but the codebase is messier than before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
Cleanup often doesn't change observable behaviour. If we don't require it explicitly, it won't be prioritised.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
The agent adds a new helper that overlaps heavily with an existing one instead of consolidating logic.&lt;/p&gt;

&lt;p&gt;It leaves TODOs, debug logs, and comments like "new implementation" that quickly stop being true. Nothing breaks. Nobody notices. Entropy increases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
The damage compounds. Small bits of litter become systemic cognitive load.&lt;/p&gt;

&lt;p&gt;Once comments and structure can't be trusted, engineers stop trusting them at all. That degrades onboarding, incident response, and change safety.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicated helpers or parallel implementations&lt;/li&gt;
&lt;li&gt;dead code and commented-out blocks after refactors&lt;/li&gt;
&lt;li&gt;TODO/FIXME without an owner or issue reference&lt;/li&gt;
&lt;li&gt;stale comments that no longer match behaviour&lt;/li&gt;
&lt;li&gt;debug logging or temporary scaffolding left behind&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where we fail
&lt;/h2&gt;

&lt;p&gt;The agent doesn't work in isolation. It works in a process with us.&lt;/p&gt;

&lt;p&gt;That process is almost always a code review: reading diffs, scanning tests, reconstructing intent, and deciding whether a change is safe to merge.&lt;/p&gt;

&lt;p&gt;The part that's easy to miss is that this review has its own "context window". It isn't measured in tokens; it's measured in what we can keep active while scanning diffs, reconstructing intent, and validating behaviour.&lt;/p&gt;

&lt;p&gt;Classic cognitive psychology framed short-term capacity as "seven, plus or minus two" — a description of how many meaningful chunks of information we can actively hold and manipulate at once. Later work argues the practical working set is often smaller under many conditions. In practice, that gap shows up as a predictable pattern: as the change set grows, we shift from verification to plausibility. We stop holding the whole thing in our head, and we start leaning on proxies.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Rubber-stamping
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
Rubber-stamping is approving changes without real verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
Large diffs plus green checks encourage approval-by-glance. Agent summaries can feel like substitutes for evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
A large change set lands. Tests pass. The diff looks reasonable at a glance. It gets approved.&lt;/p&gt;

&lt;p&gt;A baby-counting or cardboard-muffin failure was inside the diff, but nobody checked the specific risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
This is how high-severity regressions slip through "successful" pipelines. The process appears healthy because the mechanics ran.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large diffs merged with minimal review notes&lt;/li&gt;
&lt;li&gt;"LGTM" reviews on complex changes&lt;/li&gt;
&lt;li&gt;reliance on agent summaries instead of evidence (tests, traces, manual checks)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Review fatigue
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
Attention and defect discovery drops as review volume increases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
Humans don't review indefinitely at the same quality level. Once change sets are routinely too large, the review standard shifts from verification to plausibility.&lt;/p&gt;

&lt;p&gt;Industry experience shows defect discovery rates drop significantly as review size increases, leading to practical ceilings on defect discovery per review session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
Early on, reviews are careful. As output increases, the standard quietly shifts from verifying correctness to deciding whether something "looks fine".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
When fatigue sets the review standard, the process becomes performative. Failures become inevitable, not occasional. Fatigue is what drives rubber-stamping: reviewers approve changes they haven't truly verified because the volume makes real verification unsustainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;review cycles that are consistently too large&lt;/li&gt;
&lt;li&gt;repeated "skim reviews" because "we can't read it all"&lt;/li&gt;
&lt;li&gt;teams normalising that "AI output is too big to review"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Intent drift
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
The intended outcome evolves but isn't re-anchored.&lt;/p&gt;

&lt;p&gt;Instructions accumulate through conversation, assumptions change, constraints are added informally. Nothing restates a single explicit definition of "correct".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
We treat the current conversation context like shared memory, but it degrades with length. Without deliberate re-anchoring, the agent optimises against whichever version of intent is most salient or easiest to satisfy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
Early in the session: "Add a new endpoint for user preferences."&lt;/p&gt;

&lt;p&gt;Midway through: "Oh, and this needs to work with our legacy auth system that uses session tokens, not JWTs."&lt;/p&gt;

&lt;p&gt;The agent continues, but the new constraint isn't consistently applied across all code paths. Half the implementation uses the new auth pattern, half assumes the original approach. Both paths pass their tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
Intent drift is where compliance and security constraints get dropped, because they were never re-stated as hard requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decisions made verbally but not captured in artifacts&lt;/li&gt;
&lt;li&gt;constraints that exist "somewhere earlier in the thread"&lt;/li&gt;
&lt;li&gt;mismatches between the final code and the stated intent&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4) Decision delegation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
We delegate not just execution, but architectural and product decisions, without explicitly acknowledging or approving them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt;&lt;br&gt;
Volume creates distance. Confidence creates complacency. Without explicit re-engagement points, decisions get smuggled in as "implementation detail."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example&lt;/strong&gt;&lt;br&gt;
A change introduces a new abstraction or refactors a subsystem "for clarity." We ship it without a deliberate decision that this was the right shape for the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's dangerous (enterprise impact)&lt;/strong&gt;&lt;br&gt;
Decision delegation creates architectural drift. It also creates ownership ambiguity, which is poison in incident response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we look for&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;major structural changes without explicit approval&lt;/li&gt;
&lt;li&gt;"drive-by refactors" embedded in feature work&lt;/li&gt;
&lt;li&gt;unclear rationale for architecture shifts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where this leaves the system
&lt;/h2&gt;

&lt;p&gt;None of these are exotic. They are predictable outcomes of optimising against observable success signals and reviewing under volume.&lt;/p&gt;

&lt;p&gt;Workflow design has to assume both failure surfaces and build in explicit constraints and verification gates. The failure modes are architectural problems. They require architectural solutions.&lt;/p&gt;

&lt;p&gt;The question then becomes: &lt;strong&gt;what does a workflow designed around these constraints actually look like?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question is explored in the follow-up post, &lt;a href="https://dev.to/danielbutlerirl/designing-agentic-workflows-a-practical-example-291j"&gt;Designing agentic workflows: a practical example&lt;/a&gt;, which presents a concrete, verification-first workflow design intended to turn these failure modes into explicit constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Vibe Coding&lt;/em&gt; (Gene Kim, Steve Yegge)

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Vibe-Coding-Building-Production-Grade-Software/dp/1966280025" rel="noopener noreferrer"&gt;Amazon US&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.uk/Vibe-Coding-Building-Production-Grade-Software/dp/1966280025" rel="noopener noreferrer"&gt;Amazon UK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://arxiv.org/abs/2307.03172" rel="noopener noreferrer"&gt;Lost in the Middle: How Language Models Use Long Contexts&lt;/a&gt; (arXiv)&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://psycnet.apa.org/record/1957-02914-001" rel="noopener noreferrer"&gt;The Magical Number Seven, Plus or Minus Two&lt;/a&gt; — George A. Miller&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://deepmind.google/blog/specification-gaming-the-flip-side-of-ai-ingenuity/" rel="noopener noreferrer"&gt;Specification gaming: the flip side of AI ingenuity&lt;/a&gt; (DeepMind)&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>codereview</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
