<?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: Peng Qian</title>
    <description>The latest articles on DEV Community by Peng Qian (@qtalen).</description>
    <link>https://dev.to/qtalen</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%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg</url>
      <title>DEV Community: Peng Qian</title>
      <link>https://dev.to/qtalen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qtalen"/>
    <language>en</language>
    <item>
      <title>Most AI coding workflows start to drift once the context gets too long.

I introduced a graph engine based on a state machine to the AIDLC workflow. 

This engine guides the workflow's execution, which solves the drift problem.</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Fri, 23 Oct 2026 03:48:08 +0000</pubDate>
      <link>https://dev.to/qtalen/i-spent-over-a-month-reworking-the-entire-teams-ai-coding-workflow-we-brought-in-amazons-ilb</link>
      <guid>https://dev.to/qtalen/i-spent-over-a-month-reworking-the-entire-teams-ai-coding-workflow-we-brought-in-amazons-ilb</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd" class="crayons-story__hidden-navigation-link"&gt;How I Fixed the AI Coding Workflow Drift with a Simple Script&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
                
              
              &lt;div id="story-author-preview-content-4902652" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd" id="article-link-4902652"&gt;
          How I Fixed the AI Coding Workflow Drift with a Simple Script
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vibecoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vibecoding&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            18 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How I Fixed the AI Coding Workflow Drift with a Simple Script</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Fri, 23 Oct 2026 03:47:12 +0000</pubDate>
      <link>https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd</link>
      <guid>https://dev.to/qtalen/how-i-fixed-the-ai-coding-workflow-drift-with-a-simple-script-2ikd</guid>
      <description>&lt;h3&gt;
  
  
  Judgment to the model, precision to the tool, decisions to humans
&lt;/h3&gt;




&lt;p&gt;What stops you from using AI coding at scale in your work?&lt;/p&gt;

&lt;p&gt;Besides the fact that AI generated code quality is not stable, another big problem is that AI never follows the process you told it to follow.&lt;/p&gt;

&lt;p&gt;You tell it to do requirements analysis first, and it just runs off and starts writing code. You make a five step plan, and by step three it forgets what the first two steps decided. Open a new session, and it cannot even remember where it left off yesterday.&lt;/p&gt;

&lt;p&gt;Over the past few months, our team used a Python script to fix this bad habit of AI. This script acts as a navigator for the AI coding workflow. It uses a graph based on a state machine, and this graph decides where each step should go. Since then, the AI coding workflow has never drifted again.&lt;/p&gt;

&lt;p&gt;In this article, I will show you how we did this.&lt;/p&gt;

&lt;p&gt;This article was first published on my personal blog, &lt;a href="https://www.dataleadsfuture.com/your-ai-coding-workflow-keeps-drifting-i-gave-it-a-navigator/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt;. &lt;strong&gt;You can find the source code for this article at the bottom of my original post&lt;/strong&gt;, and I will also answer your questions there in detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Problem I Ran Into
&lt;/h2&gt;

&lt;p&gt;I have been formally pushing AI coding in my team for more than half a year now.&lt;/p&gt;

&lt;p&gt;At first, we only made the kind of demo used to show off a product idea. It looked cool, but it could not really be used.&lt;/p&gt;

&lt;p&gt;Later, we brought AIDLC into our AI development workflow. This is a workflow skill that came from Amazon, and it is a set of workflows made to standardize the AI development life cycle. It fully follows the enterprise level SDLC (software development life cycle) process, and it guides the LLM to generate code through detailed spec files.&lt;/p&gt;

&lt;p&gt;After a few months of tuning, we were finally able to get AI to build applications that run stably in production.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/" rel="noopener noreferrer"&gt;I also shared our experience using AIDLC online&lt;/a&gt;, and it got a warm welcome from many people.&lt;/p&gt;

&lt;p&gt;But as the work went on, we found that AIDLC could only help us build small projects or small features. When the project got bigger, problems started to show up.&lt;/p&gt;

&lt;p&gt;When the context got too long, or when we switched sessions, AIDLC would start to lose track of the spec documents. This caused the whole workflow to stop strictly following the spec files generated ahead of time, and in the end there was always a bug or some gap in understanding.&lt;/p&gt;

&lt;p&gt;We also switched back to OpenSpec and Superpowers to test it out, and the result was the same. Both had the problem of workflow drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Problem Happens
&lt;/h2&gt;

&lt;p&gt;The root cause is that these are all workflow frameworks based on SDD (spec-driven development).&lt;/p&gt;

&lt;p&gt;Whether it is AIDLC's skills or OpenSpec's commands, they are both made up of dozens of Markdown files. These frameworks get loaded into the harness when the session starts, and this takes up 30k to 50k tokens.&lt;/p&gt;

&lt;p&gt;At the same time, before coding even starts, an SDD based development workflow also generates a large number of spec files. These files also get loaded into the context, and they take up a lot of the context window.&lt;/p&gt;

&lt;p&gt;Frontier models often have context windows of more than 1 million tokens. It looks like they can hold a lot, but the model does not pay the same amount of attention to every position in the context.&lt;/p&gt;

&lt;p&gt;Once a key rule document falls into a low weight zone, the model ignores it, and the instructions start to drift. It is like a thick instruction manual. The further you flip through it, the less you remember about the details at the front.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4go6eiq0zg2gkvtq1pk8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4go6eiq0zg2gkvtq1pk8.png" alt="LLMs don't pay equal attention to different parts of the context. Arxiv 2404.01430" width="575" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is especially true for models like deepseek-v4.1-flash, which have a very long context window and super cheap caching. To chase a high cache hit rate, people tend to stuff a lot of content into the context window. Then they find that once the session gets long, the coding quality of these models drops a lot, and their ability to follow instructions also goes down.&lt;/p&gt;

&lt;p&gt;In an article I wrote last year, &lt;a href="https://www.dataleadsfuture.com/fixing-the-agent-handoff-problem-in-llamaindexs-agentworkflow-system/" rel="noopener noreferrer"&gt;I explained why LlamaIndex at the time could not accurately carry out workflow tasks based on the handoff mechanism&lt;/a&gt;. The reason was that the context was too long, and this caused the process to drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using a Graph Engine in AIDLC
&lt;/h2&gt;

&lt;p&gt;Now that we know where the problem comes from, the next step is to look at how to fix it.&lt;/p&gt;

&lt;p&gt;The answer is not in the AI itself, but in traditional agent frameworks. These frameworks figured out one thing a long time ago: who should drive the workflow should not be left entirely to the LLM's own judgment.&lt;/p&gt;

&lt;p&gt;But if the goal is the same, having agents hand off tasks to each other, why did everyone end up choosing the graph engine path? To answer that, we need to look back at a bit of history in multi agent frameworks.&lt;/p&gt;

&lt;p&gt;In early 2025, OpenAI released an agent framework called OpenAI Swarm. The core idea of this framework was to let the LLM call a function called &lt;code&gt;handoff&lt;/code&gt;. This let the main agent hand off a planned task to a sub agent to carry out, which created a &lt;code&gt;planner-executor&lt;/code&gt; architecture. Does this sound a lot like how modern AI coding tools (harnesses) use the &lt;code&gt;task&lt;/code&gt; method to call up sub agents?&lt;/p&gt;

&lt;p&gt;But this framework had a big limitation. When to hand off which task to which agent was written in the prompt given to the LLM. Because of this, the framework only worked well on the most advanced GPT models of that time. It did not work with other open source models. The root cause was that open source models back then were not yet good enough at following instructions.&lt;/p&gt;

&lt;p&gt;This is why LangChain's LangGraph, which came out later (along with Crew.ai from around the same time), used a different approach. It used a scripted execution engine based on a state machine and a directed acyclic graph (DAG).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00f7n29o36qk9mpm17zl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00f7n29o36qk9mpm17zl.png" alt="LangGraph is a scripted execution engine built on DAG. Image by Author" width="565" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach is actually simple when you say it out loud. You use a Python script to first define a traditional workflow based on a graph. Each node in the graph is an agent that runs its own logic and produces structured output. Each edge is a conditional edge, and it decides which node to route the flow to next, based on the output of the previous node.&lt;/p&gt;

&lt;p&gt;The LLM itself works on probability, so in the graph it is only responsible for making judgments, in other words, updating the state. What really decides how the workflow runs is a traditional scripted process defined by LangGraph. Because the script runs in a very deterministic way, the whole process never drifts.&lt;/p&gt;

&lt;p&gt;By now, you have probably already seen where this is going. Yes, to let the harness also carry out the workflow accurately, I decided to add a graph based script engine to AIDLC. And at each stage, I let the LLM output a structured state to guide each step the script engine takes.&lt;/p&gt;

&lt;p&gt;Now that the logic behind this is clear, let me walk you through how I designed this script engine.&lt;/p&gt;

&lt;p&gt;I split the design of the engine into two phases: the authoring phase and the runtime phase. The authoring phase is mainly about how to define the workflow, and the runtime phase is about how to use the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step one: define the workflow metadata
&lt;/h3&gt;

&lt;p&gt;Whether it is AIDLC or an SDD framework like OpenSpec, they both actually record the definition of the whole AI coding workflow in prose, inside skill files or prompt files. The LLM then follows this prompt definition to move agents and process nodes along the flow.&lt;/p&gt;

&lt;p&gt;This creates a problem. The LLM can pull information out of text, but a script program cannot. Neither Python nor JS can understand the meaning of text without help from an LLM.&lt;/p&gt;

&lt;p&gt;One way to do this is like LangGraph's API, where the whole workflow gets defined directly in code. When a new development task comes in, it gets routed strictly according to the code that was already written.&lt;/p&gt;

&lt;p&gt;But this method has a big downside: it is almost impossible to customize. I want to turn AIDLC into an open framework, which means it also allows users to modify the workflow themselves. And while using it, I also want to be able to adjust the implementation details of the workflow. If every change means I have to touch the script engine, that is too risky.&lt;/p&gt;

&lt;p&gt;So I thought, could we use a structured YAML text file to define the workflow, the way crew.ai does?&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6lnwv8cm2k7m3zrg78h9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6lnwv8cm2k7m3zrg78h9.png" alt="A CrewAI workflow definition. Image by Author" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I also did not want to throw away the workflow definitions already in the existing Markdown files and start a whole new spec from scratch. That would mean every time I adjust the workflow, I would need to change both the Markdown file and the YAML file.&lt;/p&gt;

&lt;p&gt;So I came up with a solution. I kept the existing 14 stage Markdown prompt files of AIDLC unchanged. But at the top of each file, I added a frontmatter. This means I put a block of config information at the start of the Markdown file that only the script reads. Then I pulled all the workflow related definitions out of the prompt and put them into this config block.&lt;/p&gt;

&lt;p&gt;Here is a typical frontmatter, using the &lt;code&gt;requirements-analysis.md&lt;/code&gt; file as an example:&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="na"&gt;slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;requirements-analysis&lt;/span&gt;
&lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inception&lt;/span&gt;
&lt;span class="na"&gt;execution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ALWAYS&lt;/span&gt;
&lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always executes with adaptive depth — every request needs its intent and requirements assessed; depth (minimal/standard/comprehensive) scales with clarity, complexity, and risk&lt;/span&gt;
&lt;span class="na"&gt;gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;approve-continue&lt;/span&gt;
&lt;span class="na"&gt;produces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;inception/requirements/requirements.md&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;inception/requirements/requirement-verification-questions.md&lt;/span&gt;
&lt;span class="na"&gt;consumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inception/reverse-engineering/*&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;conditional_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;brownfield&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inception/product-design/product-design.md&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;requires_stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;workspace-detection&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;reverse-engineering&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;product-brainstorm&lt;/span&gt;
&lt;span class="na"&gt;depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;adaptive&lt;/span&gt;
&lt;span class="na"&gt;scopes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;classic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EXECUTE&lt;/span&gt;
  &lt;span class="na"&gt;bugfix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EXECUTE&lt;/span&gt;
  &lt;span class="na"&gt;refactor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EXECUTE&lt;/span&gt;
  &lt;span class="na"&gt;security-patch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EXECUTE&lt;/span&gt;
  &lt;span class="na"&gt;infra&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EXECUTE&lt;/span&gt;
  &lt;span class="na"&gt;express&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EXECUTE&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This frontmatter looks pretty complex, but it is actually very simple to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keys like &lt;code&gt;slug&lt;/code&gt;, &lt;code&gt;phase&lt;/code&gt;, &lt;code&gt;execution&lt;/code&gt;, &lt;code&gt;condition&lt;/code&gt;, &lt;code&gt;gate&lt;/code&gt;, &lt;code&gt;produces&lt;/code&gt; are all metadata. They define the conditions needed before the current node runs, what phase it is in, what it produces, and so on. The script engine uses these keys to check if the current node is working correctly when it routes the state.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;consumes&lt;/code&gt; and &lt;code&gt;requires_stage&lt;/code&gt; define which upstream nodes the current node depends on, and which states of the upstream nodes it needs to consume.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;depth&lt;/code&gt; and &lt;code&gt;scopes&lt;/code&gt; define which workflows the current node shows up in, and how deep the branch of the graph goes. This makes it clear exactly when a Markdown file needs to be loaded, instead of loading every single Markdown file right at the start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also wrote a &lt;code&gt;stage-contract.md&lt;/code&gt; document under the &lt;code&gt;reference/common&lt;/code&gt; directory of AIDLC. This document works as a meta spec, and it records in detail what each key in the frontmatter means and what values it can take. So the next time I adjust the workflow, or add or remove a stage, the LLM can use this document to help me write the frontmatter correctly, and it can update the dependencies between the existing frontmatters without making mistakes. This is very handy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step two: set up multiple workflows based on scenario
&lt;/h3&gt;

&lt;p&gt;Next, let me focus on the &lt;code&gt;scopes&lt;/code&gt; key. This key is used to let AIDLC generate different workflows for different scenarios. Yes, after bringing in the new script engine, AIDLC no longer has just one single workflow. Instead, it now has 6 completely different workflows.&lt;/p&gt;

&lt;p&gt;What is the benefit here?&lt;/p&gt;

&lt;p&gt;In the original AIDLC V1.0, there was only one workflow, and all 14 stages were marked with different activation conditions. Depending on whether it was a new project, how complex the project was, whether it was a bugfix or a feature request, and so on, it was decided which stages would run and which would be skipped.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0nhmsbfowzh34ain60sd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0nhmsbfowzh34ain60sd.png" alt="AIDLC's 14 stages: green gets activated continuously, while yellow only gets activated when conditions are met. Image by Author" width="799" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But whether a stage would run or get skipped, the prompt defining it would still get loaded into the context as soon as the skill loaded. This wasted a lot of tokens.&lt;/p&gt;

&lt;p&gt;So this time I split AIDLC's workflow by business scope, from one scope into six. Each business scope maps to a different set of stages to run. When the user types a prompt and this triggers the &lt;code&gt;aidlc-workflows&lt;/code&gt; skill to load, the LLM figures out which &lt;code&gt;scope&lt;/code&gt; the current iteration falls into, and it only loads the Markdown files it needs.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcfcxcgjzwo61q73luuue.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcfcxcgjzwo61q73luuue.png" alt="The six scopes each correspond to six different workflows. Image by Author" width="341" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As your project moves through different stages, the system also adjusts which &lt;code&gt;scope&lt;/code&gt; it picks on its own, instead of sticking with the same one &lt;code&gt;scope&lt;/code&gt; forever.&lt;/p&gt;

&lt;p&gt;Here is an example: say your project starts out as just an MVP you want to build quickly to test your idea in the market. In this case, AIDLC decides this is an &lt;code&gt;express&lt;/code&gt; scope, so it only loads the fewest stages needed to quickly finish a product prototype.&lt;/p&gt;

&lt;p&gt;Then, as your project wins over users and slowly grows into a product running stably in production, AIDLC's workflow uses the audit log and past spec files to shift the &lt;code&gt;scope&lt;/code&gt; to &lt;code&gt;classic&lt;/code&gt;. At this point, optional stages like user stories, non functional requirements, security, and scalability all get loaded in, helping you polish your product step by step.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step three: turn the metadata into a workflow graph
&lt;/h3&gt;

&lt;p&gt;As I mentioned earlier, a script engine cannot possibly build a workflow at runtime by reading natural language text. So we need a descriptive syntax to let the engine run according to a definition made ahead of time.&lt;/p&gt;

&lt;p&gt;We used frontmatter to define AIDLC's metadata at each stage. We also used scope to sort out which stages should be used in which scenarios. Now, just like crew.ai, we need to use a structured syntax to turn these workflows into predefined workflows.&lt;/p&gt;

&lt;p&gt;The approach here is actually pretty simple. I did not generate the workflow dynamically at runtime (meaning, while the user is using AIDLC). Instead, I generate the workflow graph while developing the AIDLC skill.&lt;/p&gt;

&lt;p&gt;I placed a &lt;code&gt;generate.py&lt;/code&gt; script under &lt;code&gt;aidlc-workflows/scripts&lt;/code&gt;. Every time the workflow definition changes, you can have the harness run the &lt;code&gt;generate.py&lt;/code&gt; script to regenerate the graph file.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;generate.py&lt;/code&gt; script also supports a &lt;code&gt;--check&lt;/code&gt; flag. Every time the AIDLC skill gets updated, you can use this flag to run an integrity check. I also set up a GitHub CI process that automatically checks the integrity of the graph every time code gets committed. This is very handy.&lt;/p&gt;

&lt;p&gt;In the end, the &lt;code&gt;generate.py&lt;/code&gt; script produces a graph in JSON format, stored under the &lt;code&gt;aidlc-workflows/scripts/data/&lt;/code&gt; directory. This graph defines what the workflow architecture looks like under each scope, what its entry conditions are, what it is responsible for, what it outputs, and so on. At runtime, the script engine reads this graph and uses it to build the final workflow.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgegkqewgd0eshypacvxi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgegkqewgd0eshypacvxi.png" alt="The generate.py script reads the frontmatter of each stage file and generates a DAG diagram describing the workflow definition. Image by Author" width="681" height="412"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step four: use the script engine to run the workflow precisely
&lt;/h3&gt;

&lt;p&gt;Now that we have talked about how the workflow gets defined, let's talk about how I use the script engine to make sure the workflow runs precisely.&lt;/p&gt;

&lt;p&gt;Other frameworks also use scripted mechanisms to make sure the workflow runs precisely, but they all need hooks from the harness to listen to the different states of the workflow as it runs. This often means an SDD framework needs to work with more than twenty different harnesses, and it needs a custom plugin for each one.&lt;/p&gt;

&lt;p&gt;But in an enterprise level AI coding environment, this approach does not work very well, because we always build our own harness on top of an open source harness. So I would rather use a workflow framework that is not tied to any specific harness.&lt;/p&gt;

&lt;p&gt;The AIDLC skill I built was designed from the start to be harness agnostic. It still follows the AgentSkill spec, and it keeps the script engine as a CLI script stored under the skill directory's &lt;code&gt;scripts&lt;/code&gt; folder, with the script named &lt;code&gt;engine.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The nice thing about this is that you do not need to care at all about how this script is built or used. You just copy the skill directory into your project's root folder like before, and then you can use it.&lt;/p&gt;

&lt;p&gt;Let me give a quick intro to how the &lt;code&gt;engine.py&lt;/code&gt; script works. As a CLI script, &lt;code&gt;engine.py&lt;/code&gt;'s most important commands are these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;init&lt;/code&gt;. This command sets up a state file when the workflow starts. All the different states of the workflow get recorded in this file later on, so the script engine can use the state machine to route each node of the workflow.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;next&lt;/code&gt;. This command reads the state file, figures out which stages are already finished and what those finished stages produced, and uses this to decide what the next node is and routes to it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;report&lt;/code&gt;. After each stage finishes, this command gets used to update the state file. This way, whether you are continuing after the context got compressed or starting a new session, you can always pick up from the last finished stage.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt;. This reads the global workflow properties set in the state file. For example, which scope is in use right now, whether optional stages are turned on, whether team collaboration mode is turned on, and so on, can all be read through this command. This way, every time a session resumes and reloads &lt;code&gt;aidlc-workflows&lt;/code&gt;, there is no need to ask the user the optional questions all over again.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step five: use a state file to precisely record the workflow state
&lt;/h3&gt;

&lt;p&gt;As I mentioned earlier, the script engine I designed is basically a graph engine based on a state machine, similar in principle to LangGraph. So besides the graph file that defines the workflow, the state file is another very important file.&lt;/p&gt;

&lt;p&gt;This file gets generated each time a new workflow starts. It still uses the original &lt;code&gt;aidlc-state.md&lt;/code&gt; file from AIDLC V1.0, but this file has been heavily reworked, and now it is split into two parts.&lt;/p&gt;

&lt;p&gt;The first part is the workflow related config. Whether it is a new project or an old project, which scope is in use, which stages need to run, where the artifact documents are stored, which extended features are turned on, all of this gets recorded here. This way, whether it is a new session or picking up from a break in the session, there is no need to scan through the artifact documents one by one. You just read this file and can pick up the process from where it left off.&lt;/p&gt;

&lt;p&gt;The second part is the task checklist that &lt;code&gt;engine.py&lt;/code&gt; generates based on the config. While the workflow is running, the engine follows this checklist strictly, and after finishing, it goes back to this checklist to update the task status.&lt;/p&gt;

&lt;p&gt;The script engine uses the two XML tags &lt;code&gt;&amp;lt;!-- BEGIN ENGINE-STATE&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;!-- END ENGINE-STATE&amp;gt;&lt;/code&gt; to mark the content of the task checklist. Only the script engine is allowed to change the text wrapped inside these tags, not even the LLM is allowed to edit it directly.&lt;/p&gt;

&lt;p&gt;Also, every time the task status is updated, a sha256 hash gets generated for the whole checklist. If the sha256 hash changes during a run, this means the node status has been tampered with, either by a human or by the LLM. The script engine will then raise a warning, and it will rebuild a correct checklist by working backward from the artifact files that were already generated. This greatly reduces the chance of workflow drift during a long running task, or cases where the LLM planned a task but never actually carried it out.&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="gh"&gt;# AI-DLC State Tracking&lt;/span&gt;
&lt;span class="gu"&gt;## Project Information&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Project Type**&lt;/span&gt;: Greenfield
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Start Date**&lt;/span&gt;: 2026-10-08T04:10:57Z
&lt;span class="gu"&gt;## Workspace State&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Existing Code**&lt;/span&gt;: No
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Reverse Engineering Needed**&lt;/span&gt;: No
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Workspace Root**&lt;/span&gt;: D:&lt;span class="se"&gt;\D&lt;/span&gt;ocuments&lt;span class="se"&gt;\P&lt;/span&gt;ythonProject&lt;span class="se"&gt;\b&lt;/span&gt;15-dogfood2-chess
...
&lt;span class="c"&gt;&amp;lt;!-- BEGIN ENGINE-STATE | do not hand-edit — maintained by scripts/engine.py --&amp;gt;&lt;/span&gt;
State Version: 1
Engine: aidlc-workflows/scripts/engine.py
&lt;span class="gu"&gt;## Stage Progress&lt;/span&gt;
&lt;span class="gu"&gt;### inception&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] workspace-detection
&lt;span class="p"&gt;-&lt;/span&gt; [S] reverse-engineering
&lt;span class="p"&gt;-&lt;/span&gt; [x] product-brainstorm
...
&lt;span class="gu"&gt;## State Digest&lt;/span&gt;
sha256: 33cc76d5ae995526968640649c234282291b00e42949b40c826722fc5ee5ac02
&lt;span class="c"&gt;&amp;lt;!-- END ENGINE-STATE --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Alright, that covers the whole implementation of the script engine. You might feel a bit anxious thinking this is so complex, do I need to spend time learning a whole new framework again?&lt;/p&gt;

&lt;p&gt;Actually, no. This new script engine, just like the &lt;code&gt;aidlc-workflows&lt;/code&gt; skill itself, is harness agnostic. You just drop the skill into your project's root folder and it runs on its own. You do not need to worry at all about how to use this skill.&lt;/p&gt;

&lt;p&gt;Next, let me use a simple project to show you how the script engine works within a workflow.&lt;/p&gt;


&lt;h2&gt;
  
  
  Demo the Script Engine with a Small Project
&lt;/h2&gt;

&lt;p&gt;I will use a small request, "build a bookkeeping app", to show you how this script engine works.&lt;/p&gt;

&lt;p&gt;Since this is just a demo project, I used a one sentence request. But if you want to use this in a production project, it is best to prepare a full product design document ahead of time, writing out clearly what features your product should have. Or you can first use OpenCode's &lt;code&gt;plan&lt;/code&gt; mode to talk through your idea with AI, and write it down as a design document, then use &lt;code&gt;build&lt;/code&gt; mode to start the aidlc-workflows and kick off the development process.&lt;/p&gt;

&lt;p&gt;Since this starts from a new session, once I submitted my development intent to OpenCode and &lt;code&gt;aidlc-workflows&lt;/code&gt; finished loading, the script engine first ran the &lt;code&gt;status&lt;/code&gt; command to find out what state the workflow was currently in. Of course, the result was that this is a brand new, empty project.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fomrhgn07wzsj8v5grurq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fomrhgn07wzsj8v5grurq.png" alt="When starting a new aidlc iteration, the script engine first checks the current state of the workflow. Image by Author" width="738" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So it used the &lt;code&gt;init&lt;/code&gt; command to set up the new workflow.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffd0b4sogo2nw74p8cg7w.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffd0b4sogo2nw74p8cg7w.png" alt="Use the init command to initialize a new workflow. Image by Author" width="743" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After each stage finishes, the script engine uses the report command to update the workflow state. You can see that the LLM is no longer involved in moving the workflow forward at all. This is all handled by the skill calling the CLI.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs5ze8mghuzmeswvd04e9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs5ze8mghuzmeswvd04e9.png" alt="Use the report command to update the workflow status. Image by Author" width="727" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is pretty much it. The script engine compiles every node that the whole iteration needs to move through into a flow graph, and no matter how long the session stretches, it never drifts off track.&lt;/p&gt;

&lt;p&gt;All you need to do is, at the approval gate set up for each stage (the gate configured for that stage), take a quick look at what it produced and give it a thumbs up. Once it passes review, the engine calls the &lt;code&gt;next&lt;/code&gt; command to move you forward to the next stage.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdlxvefne8k05la2bkvnc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdlxvefne8k05la2bkvnc.png" alt="Use the next command to move to the next stage. Image by Author" width="716" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And at every important point, like writing a document, calling an outside tool, or moving between states, the script engine uses the &lt;code&gt;park&lt;/code&gt; command to leave a note. So even if your workflow gets cut off unexpectedly for whatever reason, the AI can pick back up from the spot where the last note was left.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8dbaefj9tjynfj5z14c.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8dbaefj9tjynfj5z14c.png" alt="The workflow uses the park command to jot down temporary notes at any time, so it can pick up where it left off if something interrupts it unexpectedly. Image by Author" width="715" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you start a new session to pick up a development process that was not finished before, the script engine also uses &lt;code&gt;status&lt;/code&gt; first to read the current state and continue from there. There is no need to ask the user to choose again, and no need to scan through every single artifact file that has already been saved. This saves a lot of time.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fffk5wueicpbggt1damyg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fffk5wueicpbggt1damyg.png" alt="When you start a new session to pick up where you left off, the engine uses the status command to check the current state. Image by Author" width="726" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That covers the demo of the core features. As you can see, while the script runs, every step follows the predefined process exactly, and even in a long session, nothing drifts off track, because the state file keeps everything in line.&lt;/p&gt;

&lt;p&gt;You also do not need to give any special instructions. Just tell the AI your intent normally, and you do not need to worry about how the workflow is actually built.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That is the story of how I used a script engine to make AIDLC run exactly according to the predefined workflow. This script engine borrows a core idea from Amazon's AIDLC v2.0: "judgment to the LLM, precision to the tool, decisions to humans." It also draws on the design wisdom of traditional agent workflow frameworks like LangGraph and Crew.ai.&lt;/p&gt;

&lt;p&gt;The new &lt;code&gt;aidlc-workflows&lt;/code&gt; skill, now with the script engine, has been running as a trial in my team for more than two months. The biggest thing I have noticed is that the workflow almost never drifts off track because of a long session anymore, and this precise execution of the workflow has further raised the quality of the code produced by AI coding.&lt;/p&gt;

&lt;p&gt;I enjoyed writing this article. A lot of people say that AI technology moves so fast that whatever you learn today might be useless in just a few months. But we do not need to be too pessimistic about this. Take the solution shown in this article as an example. Even though the technology keeps changing, the principles behind the technology can still help you solve problems you have not even seen yet.&lt;/p&gt;

&lt;p&gt;My story of improving AIDLC is not over yet. In my next article, I will walk you through how the AIDLC workflow can help you start from a "one sentence wish" and iterate step by step, eventually growing into a large, sustainably run project. Stay tuned.&lt;/p&gt;

&lt;p&gt;Thanks for reading and subscribing. You can find the source code for this article at the end of the post, and try it out yourself. If you have any questions, feel free to leave a comment anytime, and I will reply as soon as I can.&lt;/p&gt;


&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F33%2F67%2F33678c00-2c15-4961-93e9-497b427e2006%2Fcontent%2Fimages%2Fsize%2Fw1200%2F2026%2F04%2Fopencode_cover_3-1.webp" height="457" class="m-0" width="799"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/" rel="noopener noreferrer" class="c-link"&gt;
            How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Ride the wave of AI coding, don't get swept away by it
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F33%2F67%2F33678c00-2c15-4961-93e9-497b427e2006%2Fcontent%2Fimages%2Fsize%2Fw256h256%2F2025%2F02%2Fcolor_192_192.png" width="192" height="192"&gt;
          dataleadsfuture.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F33%2F67%2F33678c00-2c15-4961-93e9-497b427e2006%2Fcontent%2Fimages%2Fsize%2Fw1200%2F2026%2F09%2Faidlc-cover.webp" height="533" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/" rel="noopener noreferrer" class="c-link"&gt;
            From OpenSpec to AIDLC: How I Improved My Team's AI Code Quality
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            No new commands to learn, just pick it up and use it
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.ghost.io%2Fc%2F33%2F67%2F33678c00-2c15-4961-93e9-497b427e2006%2Fcontent%2Fimages%2Fsize%2Fw256h256%2F2025%2F02%2Fcolor_192_192.png" width="192" height="192"&gt;
          dataleadsfuture.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;This article was first published on my personal blog, &lt;a href="https://www.dataleadsfuture.com/your-ai-coding-workflow-keeps-drifting-i-gave-it-a-navigator/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt;. &lt;strong&gt;You can find the source code for this article at the bottom of my original post&lt;/strong&gt;, and I will also answer your questions there in detail.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>I spent over a month reworking the entire team's AI Coding workflow. We brought in Amazon's aidlc-workflows and adapted it to fit our own needs.

Both the team's AI development efficiency and code quality improved significantly.</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Wed, 09 Sep 2026 03:44:46 +0000</pubDate>
      <link>https://dev.to/qtalen/i-spent-over-a-month-reworking-the-entire-teams-ai-coding-workflow-we-brought-in-amazons-21a8</link>
      <guid>https://dev.to/qtalen/i-spent-over-a-month-reworking-the-entire-teams-ai-coding-workflow-we-brought-in-amazons-21a8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2" class="crayons-story__hidden-navigation-link"&gt;From OpenSpec to AIDLC: How I Improved My Team's AI Code Quality&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
                
              
              &lt;div id="story-author-preview-content-4610823" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 9&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2" id="article-link-4610823"&gt;
          From OpenSpec to AIDLC: How I Improved My Team's AI Code Quality
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/development"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;development&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            17 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>From OpenSpec to AIDLC: How I Improved My Team's AI Code Quality</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Wed, 09 Sep 2026 03:40:57 +0000</pubDate>
      <link>https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2</link>
      <guid>https://dev.to/qtalen/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality-3mn2</guid>
      <description>&lt;p&gt;No new commands to learn, just pick it up and use it&lt;/p&gt;

&lt;p&gt;By this August, our team had been writing code with AI for more than half a year. The biggest thing I noticed during this time was that our development speed went up, but code quality stayed pretty rough. Development often took just half a day, but hunting down bugs could take several days.&lt;/p&gt;

&lt;p&gt;So recently I spent more than a month restructuring our team's AI coding workflow. I replaced OpenSpec with the AIDLC workflow, using a more detailed software development process and stronger team collaboration. Code quality finally jumped up a lot.&lt;/p&gt;

&lt;p&gt;In today's article, I want to tell you how we did it.&lt;/p&gt;

&lt;p&gt;This article was originally published on my personal blog, &lt;a href="https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt;, where you can &lt;strong&gt;find the source code at the bottom of the original post&lt;/strong&gt;. I'll also keep updating content there and am happy to answer any questions you might have.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;AI coding has been around for more than a year now. People's focus in this field has slowly shifted from which model works better and how much it boosts efficiency, to how we can make sure the code AI generates is actually good quality.&lt;/p&gt;

&lt;p&gt;I recently noticed something. On social media, people talk more and more about questions like "how do I actually make sure my AI coding output has good quality" and "who should be responsible for code AI writes."&lt;/p&gt;

&lt;p&gt;If you asked me six months ago, I would have said the best answer to this question was SDD (Spec Driven Development). Based on rule frameworks like SpecKit and OpenSpec, you first talk things through in a question-and-answer style to nail down the requirements and implementation rules. Then you feed the spec files to the LLM as a prompt, and the LLM writes code strictly following those specs. This seemed like the best way to do AI coding.&lt;/p&gt;

&lt;p&gt;I even wrote a few &lt;a href="https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/" rel="noopener noreferrer"&gt;articles&lt;/a&gt; about tips for using OpenSpec.&lt;/p&gt;

&lt;p&gt;It wasn't until I rolled out my method to the whole development team that I realized something. SDD works pretty well for small projects. But once your project gets big, spans several years, and needs collaboration across multiple teams, OpenSpec just doesn't hold up.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Went Wrong with OpenSpec
&lt;/h2&gt;

&lt;p&gt;When I say it doesn't hold up, let's look at what actually went wrong with SDD frameworks like OpenSpec.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using it got way too complicated
&lt;/h3&gt;

&lt;p&gt;How many commands from OpenSpec's documentation on GitHub do you still remember? Do you know exactly when to use &lt;code&gt;explore&lt;/code&gt; and when to use &lt;code&gt;propose&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;When I rolled out OpenSpec to my team, I wrote a whole document explaining when to use each command, and I told everyone to follow the workflow I laid out.&lt;/p&gt;

&lt;p&gt;Things still went sideways. Should &lt;code&gt;explore&lt;/code&gt; come before &lt;code&gt;propose&lt;/code&gt; or after? Why can't I just jump straight to the &lt;code&gt;plan&lt;/code&gt; agent? I bet you can't answer that either, right?&lt;/p&gt;

&lt;p&gt;Because the commands and their use cases got so complicated, everyone on the team ended up using OpenSpec differently. Some people even used OpenSpec just for show at the start and switched to pure vibe coding afterward. This shows that the extra learning cost didn't really pay off for developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  It never captured the original intent
&lt;/h3&gt;

&lt;p&gt;Speaking of the difference between the &lt;code&gt;explore&lt;/code&gt; command and the &lt;code&gt;plan&lt;/code&gt; agent, this brings up another problem. The spec files OpenSpec writes never save the user's original intent or original requirements, and they never keep the conversation the user had with AI during the &lt;code&gt;plan&lt;/code&gt; phase.&lt;/p&gt;

&lt;p&gt;Because of this, when I reviewed spec files written by another team member, I often felt completely lost. Why was this user story written this way? What problem was this method design actually trying to solve?&lt;/p&gt;

&lt;p&gt;Give it enough time, and even the developer who wrote the code might forget why a feature got designed a certain way.&lt;/p&gt;

&lt;p&gt;Once you lose the original intent, your project drifts further and further from its original goal with every iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's hard to get the right level of detail for requirements
&lt;/h3&gt;

&lt;p&gt;OpenSpec's &lt;code&gt;explore&lt;/code&gt; mode, or the &lt;code&gt;brainstorm&lt;/code&gt; mode in other SDD frameworks, is honestly pretty powerful. This can pull you straight into the trap of wish-based coding without you even noticing. You start hoping that a single sentence is enough, that OpenSpec will chat with you and break your requirements down step by step, then gradually build out a complete product for you.&lt;/p&gt;

&lt;p&gt;But AI can't do that yet.&lt;/p&gt;

&lt;p&gt;The current generation of LLMs is really good at finding shortcuts. If you describe a vague goal for your project and expect OpenSpec to break it down into fine-grained requirements and iterations, that rarely works. What you get in the end is just a demo with the main features and nothing else. All the detailed implementation is missing, so it's really just a half-finished product that can't go live in a production system.&lt;/p&gt;

&lt;p&gt;So experienced developers know that when doing SDD development, the best move is to break the product's features into small pieces and let OpenSpec iterate on them round by round. For example, build the project skeleton and tech stack in the first round, then build the login and authentication system in the second round, and so on. Only this way can a project slowly get polished into a real product.&lt;/p&gt;

&lt;p&gt;But it's really hard to control how fine you break these requirements down. Break them too coarse, and your project turns into a demo. Break them too fine and your development speed drops. Sometimes the developer hasn't even thought of some necessary features at the start, so details easily get missed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation stops matching reality
&lt;/h3&gt;

&lt;p&gt;Next up is the documentation consistency problem. Your team member starts by using OpenSpec to write out the spec docs, then moves on to coding, adjusting the implementation along the way. But because they never explicitly called an OpenSpec command again, none of those later adjustments ever get written back into any document.&lt;/p&gt;

&lt;p&gt;There's another situation too. While generating rule artifacts, you notice a problem in tasks.md and fix it, but unless you specifically ask, AI won't go touch design.md on its own.&lt;/p&gt;

&lt;p&gt;As your project grows bigger with each iteration, this kind of inconsistency shows up everywhere. Eventually, the spec files completely lose their value as a reference. Then you end up with a pile of messy code.&lt;/p&gt;

&lt;h3&gt;
  
  
  You never know when to start the process
&lt;/h3&gt;

&lt;p&gt;I once asked a teammate why they still chose vibe coding even though everyone knew SDD could improve code quality.&lt;/p&gt;

&lt;p&gt;One reason they gave me was that the commands map to development phases in such a complicated way that they genuinely didn't know when to kick off the process.&lt;/p&gt;

&lt;p&gt;Here's an example.&lt;/p&gt;

&lt;p&gt;Right after you use &lt;code&gt;apply&lt;/code&gt; to finish writing code, you suddenly find a bug in what got generated. Do you ask AI to fix it directly, or do you go run the &lt;code&gt;proposed&lt;/code&gt; artifact flow first?&lt;/p&gt;

&lt;p&gt;Or say you're in the middle of fixing a bug and suddenly get a great idea to tweak an existing feature, or maybe you just want to delete this chunk of code and rewrite it a different way. Do you run the OpenSpec flow first, or just change it directly?&lt;/p&gt;

&lt;h3&gt;
  
  
  Team collaboration falls apart
&lt;/h3&gt;

&lt;p&gt;Every open source framework like OpenSpec assumes the same thing. With AI's help, each of us becomes a super developer who can handle everything from start to finish alone.&lt;/p&gt;

&lt;p&gt;But everyone on our team has a clearly defined role. Modern business has gotten complicated enough that no single person can handle everything alone anymore.&lt;/p&gt;

&lt;p&gt;After you finish writing the requirements analysis doc and user stories, shouldn't you check them with the product team? At the very least, you need to align on how metrics get calculated, right? The same goes for architecture design and coding plans. Shouldn't you run those docs by other developers or an architect? What if the design approach has a mistake somewhere?&lt;/p&gt;

&lt;p&gt;But the OpenSpec framework ignores this kind of problem completely. From the moment you start using &lt;code&gt;propose&lt;/code&gt; to write spec artifacts until you finish coding, the whole workflow only happens in your own environment. Nobody else looks at the docs you wrote unless you go show them yourself. OpenSpec also makes it really hard to plug in quality gates or review mechanisms for control.&lt;/p&gt;

&lt;p&gt;Sure, even the best frameworks have some flaws. But the problems with SDD frameworks like OpenSpec make it much harder for them to succeed in enterprise development teams.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's My Solution
&lt;/h2&gt;

&lt;p&gt;So how did I solve this whole mess?&lt;/p&gt;

&lt;p&gt;At first, I thought like most programmers in the AI era. Build a new wheel myself, and let AI write a brand new workflow under my guidance.&lt;/p&gt;

&lt;p&gt;But I quickly realized this wouldn't work. A new development process that hasn't been tested by a lot of development teams just turns into another AI toy. It doesn't have the reliability you need for an enterprise development environment.&lt;/p&gt;

&lt;p&gt;So I remembered a piece of news from six months ago about Amazon AWS's AI coding workflow.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyh62z00o9pytmaml49ad.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyh62z00o9pytmaml49ad.png" alt="Amazon requires that any code written by junior or mid-level engineers has to be reviewed and approved by someone else on the team." width="585" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Amazon seemed to run into the same problem we did. Their unreliable AI development process caused disasters in production. So they required that any code written by junior or mid-level engineers get approved by another role on the team. Hmm, this matches exactly what we ran into.&lt;/p&gt;

&lt;p&gt;I figured that at the time, this response was probably just a temporary fix. Six months had passed, so they must have come up with a more systematic, more engineered solution by now.&lt;/p&gt;

&lt;p&gt;After some digging, I found the solution they came up with: &lt;a href="https://github.com/awslabs/aidlc-workflows/tree/v1" rel="noopener noreferrer"&gt;aidlc-workflows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Amazon already released version 2.0 of aidlc-workflows, but this article is still based on version 1.0 with some custom modifications. I think version 1.0 is lightweight enough and easy to extend, which makes it more convenient to use. Try the customized version I share at the end of this article.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is AIDLC
&lt;/h3&gt;

&lt;p&gt;AIDLC stands for AI Driven Development Life Cycle. It's a software development process that corresponds to the traditional SDLC, or Software Development Life Cycle.&lt;/p&gt;

&lt;p&gt;The traditional SDLC breaks enterprise-level software development into six or seven main phases: planning, requirements analysis, design, development, testing, deployment, and maintenance.&lt;/p&gt;

&lt;p&gt;AIDLC builds on top of these seven phases and adds two new capabilities: dynamic workflows and dynamic team collaboration.&lt;/p&gt;

&lt;p&gt;How does it pull this off?&lt;/p&gt;

&lt;p&gt;First, AIDLC doesn't just inherit SDLC's seven phases. It also groups these seven phases into three big stages.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bpi1ftf1dzyajwr351v.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bpi1ftf1dzyajwr351v.png" alt="The three major phases of AI-DLC and their responsibilities. Image by Author" width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Inception stage handles workspace detection, conditional sub-stages, and workflow planning. This stage answers the questions of what and why.&lt;/p&gt;

&lt;p&gt;The Construction stage handles sub-stages like design, implementation, building, and testing. This stage answers the question of how.&lt;/p&gt;

&lt;p&gt;Here's what it looks like.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkiyqq0v4t020ah1hl62.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkiyqq0v4t020ah1hl62.png" alt="All sub-stages of AIDLC, where green means always loaded and yellow means dynamically loaded depending on the situation. Image by Author" width="799" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks like there are a lot of sub-stages to go through, but don't worry. Not every new requirement goes through all of them. As the image shows, the ones marked green always run, while the ones marked yellow only run when certain conditions are met.&lt;/p&gt;

&lt;p&gt;What decides which ones run and which ones don't is what AIDLC calls its dynamic workflow planning capability.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is dynamic workflow planning
&lt;/h3&gt;

&lt;p&gt;When we bring up a new development requirement, AIDLC works differently from traditional SDD frameworks that first chat, then write docs, then implement. Based on the current project environment and the choices the user makes during the conversation, AIDLC branches into different conditional paths, and each branch loads a different subworkflow. Complex projects load more subworkflow stages, while small projects load simpler ones.&lt;/p&gt;

&lt;p&gt;Here's an example.&lt;/p&gt;

&lt;p&gt;The first time AIDLC loads, it checks whether the current project environment is brand new (Green Field) or already exists (Brown Field). If it's an existing environment, it loads the &lt;code&gt;reverse-engineering&lt;/code&gt; workflow to analyze what the existing code already does. If it's a brand new environment, it skips the &lt;code&gt;reverse-engineering&lt;/code&gt; subworkflow entirely.&lt;/p&gt;

&lt;p&gt;When we bring up a new requirement, AIDLC checks whether it affects the product's end users. If it does, it loads the &lt;code&gt;user-stories&lt;/code&gt; workflow to do user story analysis. If your requirement is just a non-functional requirement, or purely a frontend page development task, it skips &lt;code&gt;user stories&lt;/code&gt; and moves straight to the next sub-stage.&lt;/p&gt;

&lt;p&gt;AIDLC also keeps a file called &lt;code&gt;aidlc-state.md&lt;/code&gt;. Besides tracking which stage the workflow currently sits at, this file serves another purpose too. If you want to do wish-based development, AIDLC breaks down your one-sentence requirement, pulls out the sub-requirement that needs the most urgent action, and kicks off the workflow for that one. The other sub-requirements get recorded in &lt;code&gt;aidlc-state.md&lt;/code&gt; and wait for the next round of the workflow to start. This solves the problem of requirement granularity.&lt;/p&gt;

&lt;p&gt;AIDLC's core workflow works like a butler that always stays in the conversation. When something you say or the project's state triggers a condition, the butler pulls out the matching subworkflow document from the cabinet and lets that sub-process take over. This way, you don't need to remember which command to use when. The butler figures it out for you. You don't need to worry about learning new commands you can't remember, and you don't need to think about when to start a process either. The butler handles all of that.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is dynamic team collaboration
&lt;/h3&gt;

&lt;p&gt;AIDLC's dynamic team collaboration has two parts: requirements analysis logging and approval gates.&lt;/p&gt;

&lt;p&gt;Unlike traditional question-and-answer conversations that mostly keep the chat history in context, AIDLC starts conversations and asks the developer questions whenever the sub workflow calls for it, at any point in the process. Every question and every choice the developer makes gets recorded in a file called &lt;code&gt;{current-phase}-questions.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;At the end of each sub-stage, if you want to tweak the output of the current stage or you have some new thoughts to share, those tweaks and AI's response get organized and saved in a file called &lt;code&gt;audit.md&lt;/code&gt;. This solves the problem of the original intent never getting recorded.&lt;/p&gt;

&lt;p&gt;If you work solo, you just need to check that all the documents look good and reply with "continue." But if you work on a team and you need another role to review the documents for you, you can commit the code through git and send it to your teammate for review.&lt;/p&gt;

&lt;p&gt;Your teammate's review notes and marks get recorded in &lt;code&gt;audit.md&lt;/code&gt;, and then that gets sent back to you. Your instance of AIDLC only moves to the next stage once it sees the approval mark for the current stage. &lt;code&gt;audit.md&lt;/code&gt; only supports incremental updates and never gets edited, so you always have access to every change and every review record.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2pkipwiw1qf0n522jsy3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2pkipwiw1qf0n522jsy3.png" alt="You can submit the documents generated at each stage to your colleague, and once they approve them, you move on to the next step. Image by Author" width="417" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AIDLC also lets you &lt;code&gt;extend&lt;/code&gt; the workflow using the extensions folder. You can set which key stages need review from which roles, and you can set every round of review to log the reviewer's info for future reference. So, compared to OpenSpec, AIDLC puts a lot more emphasis on team collaboration.&lt;/p&gt;

&lt;p&gt;OK, that covers the details of what AIDLC can do. I bet you're eager to hear how this works out in our team's actual development.&lt;/p&gt;




&lt;h2&gt;
  
  
  How We Put AIDLC to Work on Our Team
&lt;/h2&gt;

&lt;p&gt;Since everyone cares about different things, going through my specific project won't give you much to work with. So in this section, I'm not going to walk through a specific project. Instead, I want to walk you through the local customizations I made based on what our team's development actually needed.&lt;/p&gt;

&lt;p&gt;To make things easier to use, I already rewrote all these customizations as Skills. You just need to grab the source code at the end of this article, put it in the right place, and let your coding agent load it. It kicks in automatically after that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turning AIDLC into a Skill
&lt;/h3&gt;

&lt;p&gt;AIDLC's core lives in two folders. The &lt;code&gt;aws-aidlc-rules&lt;/code&gt; folder holds the core workflow definitions, and the &lt;code&gt;aws-aidlc-rule-details&lt;/code&gt; folder holds the subworkflow files that load on demand.&lt;/p&gt;

&lt;p&gt;By default, it supports Amazon's own coding agent Kiro. For other common coding agents, the setup steps the official site gives you get so complicated that nobody has the patience to read through them.&lt;/p&gt;

&lt;p&gt;But at its core, AIDLC is really just made up of a dozen or so Markdown files. That means you can completely turn it into a Skill instead.&lt;/p&gt;

&lt;p&gt;The transformation is really simple too. Just create a folder called &lt;code&gt;aidlc-workflows&lt;/code&gt; under &lt;code&gt;.agents/skills&lt;/code&gt;, copy &lt;code&gt;aws-aidlc-rules/core-workflow.md&lt;/code&gt; into that folder, and rename it to &lt;code&gt;SKILL.md&lt;/code&gt;. Then, following the Agent Skills spec, copy every file from &lt;code&gt;aws-aidlc-rule-details&lt;/code&gt; into the &lt;code&gt;aidlc-workflows/references&lt;/code&gt; folder. Finally, have your coding agent fix up all the file paths so they point to the right place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extending the AIDLC workflow
&lt;/h3&gt;

&lt;p&gt;As I mentioned earlier, AIDLC's workflow is really easy to extend. Beyond the sub-workflows already customized for the existing &lt;code&gt;inception&lt;/code&gt;, &lt;code&gt;construction&lt;/code&gt;, and &lt;code&gt;operations&lt;/code&gt; stages under the &lt;code&gt;reference&lt;/code&gt; folder, it also supports the &lt;code&gt;extensions&lt;/code&gt; folder, which lets you add optional custom workflows that load dynamically. Testing, security, and resilient deployment all fall into this category.&lt;/p&gt;

&lt;p&gt;An extension workflow usually splits into two files: the core workflow file &lt;code&gt;{workflow-name}.md&lt;/code&gt;, and a lead-in file with an opt-in.md suffix called &lt;code&gt;{workflow-name}.opt-in.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;{workflow-name}.opt-in.md&lt;/code&gt; file contains a question that needs clarification from the user. The answer to that question decides which stages the extension workflow &lt;code&gt;{workflow-name}.md&lt;/code&gt; applies to.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;opt-in&lt;/code&gt; file loads during the requirements analysis stage, and based on how the user answers, it decides whether the extension workflow loads later on. If your custom extension workflow only has a &lt;code&gt;{workflow-name}.md&lt;/code&gt; file and no &lt;code&gt;opt-in&lt;/code&gt; file, that workflow always loads. This mechanism makes sure multiple extensions can load dynamically, so you can maintain endless extensions without blowing up your context.&lt;/p&gt;

&lt;p&gt;Alright, now that you understand how AIDLC's workflow extension mechanism works, let me walk you through a few extensions I customized.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping documentation consistent
&lt;/h3&gt;

&lt;p&gt;This extension requires AIDLC to update every related workflow document whenever code changes happen. This keeps the docs consistent with the code, so you never run into the SDD problem where the code changes but the spec docs stay out of sync.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separating approval from execution
&lt;/h3&gt;

&lt;p&gt;In the default AIDLC flow, once you approve a stage, the workflow automatically moves on and keeps running.&lt;/p&gt;

&lt;p&gt;That's fine if you work solo, but it breaks down when you need to review a colleague's document. Say you're the product manager. You can't just let AI generate code on your own computer the moment the requirements doc gets approved, right?&lt;/p&gt;

&lt;p&gt;So I split the meaning of "approved" into two separate actions: approve and continue. Once you approve the documents at a certain stage, the workflow doesn't automatically move to the next step. Instead, you should send the docs over to whoever handles the next stage. Once your colleague sees that you approved the docs, they say "continue," and only then does the workflow keep going.&lt;/p&gt;

&lt;p&gt;This split keeps approval and action separate, making sure different roles handle different stages of the software development process. It lets each teammate's expertise shine where it matters most.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signing off on the audit trail
&lt;/h3&gt;

&lt;p&gt;This extension solves the problem of who should get held responsible for code AI writes.&lt;/p&gt;

&lt;p&gt;In the default flow, AIDLC logs every round of conversation between the user and AI in &lt;code&gt;audit.md&lt;/code&gt;. This makes it easy to audit where a requirement came from and to trace the approval history at each stage.&lt;/p&gt;

&lt;p&gt;But the default &lt;code&gt;audit.md&lt;/code&gt; file never records who raised the requirement or the change, and it never records who approved the documents. When your project needs team collaboration, it gets hard to figure out exactly who to talk to just by reading through &lt;code&gt;audit.md's&lt;/code&gt; history.&lt;/p&gt;

&lt;p&gt;So I used this extension to modify audit.md and added two keys: User and Email. I use &lt;code&gt;git config user.name&lt;/code&gt; and &lt;code&gt;git config user.email&lt;/code&gt; to fill in these two keys. This way I always know exactly who each history record belongs to.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06cz49862rlwe8318d2s.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F06cz49862rlwe8318d2s.png" alt="Added the username and email of the user who left the approval message in the audit.md log, so it’s easier to keep track of things for auditing purposes. Image by Author" width="798" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using the question tool
&lt;/h3&gt;

&lt;p&gt;The original version of AIDLC is a workflow module built for Kiro, so it doesn't play that well with other AI IDEs. The questions it asks users get written into a file called &lt;code&gt;{phase-name}-questions.md&lt;/code&gt;, and it expects users to go into that file to answer and record their responses.&lt;/p&gt;

&lt;p&gt;But ever since I started using AI IDEs, I haven't touched traditional editors like VS Code in a long time. I really don't want to open up a whole IDE just to answer a few questions. That's way too much hassle.&lt;/p&gt;

&lt;p&gt;Since I mainly use OpenCode, I built an extension that has AIDLC directly use OpenCode's &lt;code&gt;question&lt;/code&gt; tool to ask the user right after generating the questions, then writes the user's answers back into the document. This way, I never have to leave OpenCode to go edit a file in another IDE.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing and other best practices
&lt;/h3&gt;

&lt;p&gt;These next few items are default extensions in AIDLC, not something I built myself, but I think they're worth talking about.&lt;/p&gt;

&lt;p&gt;Why did we pick Amazon's AIDLC instead of yet another open source SDD framework? Besides the fact that this workflow got tested through the software development process at a huge tech company, we also wanted to learn from the software engineering experience of a top-tier tech company through AIDLC.&lt;/p&gt;

&lt;p&gt;And AIDLC really lives up to that. Under the &lt;code&gt;extensions&lt;/code&gt; folder, the &lt;code&gt;testing&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, and &lt;code&gt;resiliency&lt;/code&gt; subfolders each hold this company's best practices for software testing, security, and continuous integration and deployment.&lt;/p&gt;

&lt;p&gt;Here's an example.&lt;/p&gt;

&lt;p&gt;In the past, when AI wrote unit tests for us, it would sometimes change the source code or tweak the test afterward, just to make the coverage numbers look good. Basically, AI wrote the exam questions and then changed its own answers to cheat the metrics.&lt;/p&gt;

&lt;p&gt;But AIDLC does things differently. It requires using Property Based Testing, or PBT. Instead of checking a single fixed input, PBT randomly generates a huge batch of input conditions, making it really hard for the code to "memorize the answer" ahead of time. AI has no idea what input comes next, so it can't tweak the code to game the test.&lt;/p&gt;

&lt;p&gt;For a lot of startup teams, these practices are valuable lessons that are hard to come across in everyday work. If you get the chance, I recommend turning on the related options and giving them a try.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That covers how I used AIDLC to rework our team's AI coding process.&lt;/p&gt;

&lt;p&gt;Based on how we've been using it, this workflow really works well. There's basically no learning curve, and you can pick it up and start using it right away.&lt;/p&gt;

&lt;p&gt;And since this comes from the best practices of a major tech company, this workflow puts a lot of focus on dynamic workflows and dynamic team collaboration. It's really convenient for customizing based on what your team's development process actually needs.&lt;/p&gt;

&lt;p&gt;It also makes it easier to clarify what each team member is responsible for at every stage of development. If something goes wrong in production, it's easier to trace the root cause, figure out who's responsible, and get it fixed.&lt;/p&gt;

&lt;p&gt;One thing worth noting is that this workflow really emphasizes a software lifecycle management style of development. The questions that need clarifying during the conversation get a lot more technical too. You might need to learn more software engineering knowledge to fully master this workflow. But software engineering is basic knowledge every developer should learn anyway, so I don't think this is a big deal.&lt;/p&gt;

&lt;p&gt;This workflow gave our team a huge boost, both in development efficiency and in code quality. So I recommend giving it a try yourself. If you run into any problems along the way, leave me a comment, and I'll answer as soon as I can.&lt;/p&gt;

&lt;p&gt;Thanks for reading. I'm &lt;a href="https://www.linkedin.com/in/qtalen/" rel="noopener noreferrer"&gt;Mr. Qian&lt;/a&gt;, and I focus on researching AI agents for enterprise applications and AI coding. Follow my personal blog Data Leads Future to get my latest updates.&lt;/p&gt;

&lt;p&gt;If you found this helpful, feel free to share it with your friends too.&lt;/p&gt;




&lt;p&gt;This article was first published on my personal blog, &lt;a href="https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt;, where you can &lt;strong&gt;find the source code at the end of the original post&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>development</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I spent over a month reworking the entire team's AI Coding workflow. We brought in Amazon's aidlc-workflows and adapted it to fit our own needs.

Both the team's AI development efficiency and code quality improved significantly.</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Wed, 02 Sep 2026 04:00:56 +0000</pubDate>
      <link>https://dev.to/qtalen/i-spent-over-a-month-reworking-the-entire-teams-ai-coding-workflow-we-brought-in-amazons-1jej</link>
      <guid>https://dev.to/qtalen/i-spent-over-a-month-reworking-the-entire-teams-ai-coding-workflow-we-brought-in-amazons-1jej</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/how-i-use-aidlc-to-improve-my-teams-ai-code-quality-3c8f" class="crayons-story__hidden-navigation-link"&gt;How I Use Aidlc to Improve My Team's AI Code Quality&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
                
              
              &lt;div id="story-author-preview-content-4551533" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/how-i-use-aidlc-to-improve-my-teams-ai-code-quality-3c8f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/how-i-use-aidlc-to-improve-my-teams-ai-code-quality-3c8f" id="article-link-4551533"&gt;
          How I Use Aidlc to Improve My Team's AI Code Quality
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/coding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;coding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/how-i-use-aidlc-to-improve-my-teams-ai-code-quality-3c8f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/how-i-use-aidlc-to-improve-my-teams-ai-code-quality-3c8f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>With the same Kimi K3 quota and similar quality, you can get more done. This post outlines how I optimized my OpenCode setup to reduce Kimi K3 costs.</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Mon, 03 Aug 2026 08:39:47 +0000</pubDate>
      <link>https://dev.to/qtalen/with-the-same-kimi-k3-quota-and-similar-quality-you-can-get-more-done-this-post-outlines-how-i-1ll3</link>
      <guid>https://dev.to/qtalen/with-the-same-kimi-k3-quota-and-similar-quality-you-can-get-more-done-this-post-outlines-how-i-1ll3</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9" class="crayons-story__hidden-navigation-link"&gt;How I Cut Kimi K3 Costs in OpenCode&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
              
              &lt;div id="story-author-preview-content-4300347" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9" id="article-link-4300347"&gt;
          How I Cut Kimi K3 Costs in OpenCode
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vibecoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vibecoding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/coding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;coding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How I Cut Kimi K3 Costs in OpenCode</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Mon, 03 Aug 2026 08:39:12 +0000</pubDate>
      <link>https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9</link>
      <guid>https://dev.to/qtalen/how-i-cut-kimi-k3-costs-in-opencode-3lj9</guid>
      <description>&lt;p&gt;Better code quality, but spend less money&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Last week, I burned through 7 days' worth of quota in a single day while using the &lt;code&gt;Kimi K3&lt;/code&gt; model on Kimi's Allegretto plan.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Kimi K3&lt;/code&gt; is genuinely great. Its performance is on par with &lt;code&gt;Claude Fable 5&lt;/code&gt; and &lt;code&gt;GPT 5.6 SOL&lt;/code&gt;, so I ended up going full throttle with it all day long.&lt;/p&gt;

&lt;p&gt;But the cost is ridiculous. It runs way higher than &lt;code&gt;GLM-5.2&lt;/code&gt;, &lt;code&gt;DeepSeek-V4&lt;/code&gt;, or even &lt;code&gt;Kimi K2.7&lt;/code&gt;. For someone like me who was spoiled by the cheap API of &lt;code&gt;DeepSeek-V4&lt;/code&gt;, that was not acceptable.&lt;/p&gt;

&lt;p&gt;So I started optimizing how I use OpenCode. The goal was to do more with the same &lt;code&gt;Kimi K3&lt;/code&gt; quota while keeping quality about the same.&lt;/p&gt;

&lt;p&gt;After a few days of work, the results are pretty solid. The Allegreto plan now covers a full week of development for me. No more sitting around two days out of five waiting for the weekly &lt;code&gt;Kimi K3&lt;/code&gt; quota to reset.&lt;/p&gt;

&lt;p&gt;If these methods work for me, they should work for you too. So this article is a quick write-up of what I've done, and I hope it helps you lower your &lt;code&gt;Kimi K3&lt;/code&gt; costs in OpenCode.&lt;/p&gt;

&lt;p&gt;All the source code mentioned in this article is at the bottom. Feel free to grab it.&lt;/p&gt;

&lt;p&gt;This article was originally published on my personal blog &lt;a href="https://www.dataleadsfuture.com/how-i-cut-kimi-k3-costs-in-opencode/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt;, where I'll keep updating this content. You can also grab the source code for free over there and ask me anything you like.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pick the Right Provider
&lt;/h2&gt;

&lt;p&gt;The most fundamental way to cut costs is picking the right provider. The official Coding Plan is the best option. Based on various reports, the third and fourth tiers of the Coding Plan offer dozens of times more value per dollar than the API at the same price. That's a great deal.&lt;/p&gt;

&lt;p&gt;Besides the official Coding Plan, if you'd rather pay per use or call a third-party API, you can just use open platforms that support Kimi K3, like &lt;a href="https://fas.st/t/cBJ7iuNS" rel="noopener noreferrer"&gt;&lt;strong&gt;Novita.ai&lt;/strong&gt;&lt;/a&gt; (which offers ultra-low-latency endpoints and generous free credits for new users) and OpenRouter. The setup and how it works are the same.&lt;/p&gt;

&lt;p&gt;Since I already purchased the official Allegreto plan upfront, I'll use the Coding Plan models as the primary example throughout this article.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pick the Right Model and Thinking Level (Variants)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pick the right model
&lt;/h3&gt;

&lt;p&gt;The Coding Plan gives you access to two models: K2.7 Code and K3. K3 requires Allegretto or above, and only the K3 model supports 1M context length.&lt;/p&gt;

&lt;p&gt;This week, Kimi also released a K3 model with 256K context, with the model ID &lt;code&gt;k3-256k&lt;/code&gt;. At the same time, the official docs confirmed that the standard K3 model consumes twice the quota of &lt;code&gt;k3-256k&lt;/code&gt;. That's probably why I burned through a whole week's quota right out of the gate. Without a second thought, I switched my default model to &lt;code&gt;k3-256k&lt;/code&gt;.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fylak627fjutf79pc1kmq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fylak627fjutf79pc1kmq.png" alt="A comparison of model capabilities provided on the official website. Screenshot from Kimi" width="595" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might wonder: since I'm used to &lt;code&gt;DeepSeek-V4&lt;/code&gt;'s 1M context, will 256K be enough?&lt;/p&gt;

&lt;p&gt;I don't think you need to worry too much about that.&lt;/p&gt;

&lt;p&gt;The 1M context mainly helps your cache hit rate stay high as conversations get longer. But context rot is still a real problem as the context grows. So if you've ever felt like &lt;code&gt;DeepSeek-V4&lt;/code&gt; gets dumber after a long session, your instinct is right. That's context rot at work.&lt;/p&gt;

&lt;p&gt;On top of that, we normally use frameworks like OpenSpec for SDD (Spec-Driven Development). All the plans and specs worked out earlier with the model get saved as files on disk. Whether you use the &lt;code&gt;/compact&lt;/code&gt; command or start a new session, the model reads context from those files. The message history doesn't need to be that long.&lt;/p&gt;

&lt;p&gt;Then there are situations where you need to scan a large codebase or pull in a lot of information from the web. For those cases, we use sub-agents running in separate sub-sessions to handle the research, then return only the key findings to the main session. That approach cuts down context usage a lot.&lt;/p&gt;

&lt;p&gt;All things considered, 256K context is plenty for now. For the &lt;code&gt;Plan&lt;/code&gt; and &lt;code&gt;Build&lt;/code&gt; agents, just use &lt;code&gt;k3-256k&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;If you're using the API from &lt;a href="https://fas.st/t/cBJ7iuNS" rel="noopener noreferrer"&gt;&lt;strong&gt;Novita.ai&lt;/strong&gt;&lt;/a&gt;, it's even simpler. Just use Kimi K3 straight up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pick the thinking level
&lt;/h3&gt;

&lt;p&gt;For a long time, Kimi models felt slow. That's because before K3, Kimi didn't support the &lt;code&gt;reasoning_effort&lt;/code&gt; parameter. Every call defaulted to maximum thinking, so each request took forever to finish.&lt;/p&gt;

&lt;p&gt;The K3 release added support for &lt;code&gt;reasoning_effort&lt;/code&gt;, with three levels: &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, and &lt;code&gt;max&lt;/code&gt;. But when the model first launched last week, only max was available. That meant every call generated massive thinking tokens through a long chain-of-thought process, which burned through a huge amount of token budget.&lt;/p&gt;

&lt;p&gt;Good news: starting this week, both K3 models support &lt;code&gt;low&lt;/code&gt; and &lt;code&gt;high&lt;/code&gt;. If you're setting up &lt;code&gt;Kimi K3&lt;/code&gt; in OpenCode for the first time this week, the default thinking level is &lt;code&gt;High&lt;/code&gt;. If you configured &lt;code&gt;Kimi K3&lt;/code&gt; last week, make sure you change the thinking level from &lt;code&gt;Max&lt;/code&gt; to &lt;code&gt;High&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you care more about code quality than cost, or you're doing complex research and don't want lower thinking intensity to hurt your results, there's a middle ground. Use &lt;code&gt;Max&lt;/code&gt; thinking in the &lt;code&gt;Plan&lt;/code&gt; agent for architecture planning, then use &lt;code&gt;High&lt;/code&gt; thinking in the &lt;code&gt;Build&lt;/code&gt; agent for code execution.&lt;/p&gt;

&lt;p&gt;One thing to watch out for here is that, according to the &lt;code&gt;official docs&lt;/code&gt;, switching the &lt;code&gt;reasoning_effort&lt;/code&gt; value invalidates the context cache.&lt;/p&gt;

&lt;p&gt;Right after the switch, the model immediately refills the cache using your existing message history, which costs extra tokens. The official recommendation is to open a new session before switching &lt;code&gt;reasoning_effort&lt;/code&gt;, so you avoid paying to refill old messages into the cache.&lt;/p&gt;

&lt;p&gt;There's a more elegant solution though. Set up a dedicated sub-agent with &lt;code&gt;Max&lt;/code&gt; thinking, specifically for architecture decisions and hard problems. I'll cover that in the next section.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;How to configure the built-in explore and general agents in OpenCode to significantly cut down on input costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to save on output costs by setting up the executor and architect agents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A quick walkthrough on cache configuration for the coding agent. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're interested, feel free to click on &lt;a href="https://www.dataleadsfuture.com/how-i-cut-kimi-k3-costs-in-opencode/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt; to read the full article.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/" rel="noopener noreferrer"&gt;How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow/" rel="noopener noreferrer"&gt;Reflection SDD: Use a Reflection Harness to Level Up Your OpenSpec Workflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/deepseek-v4-cant-read-images-i-made-it-read/" rel="noopener noreferrer"&gt;DeepSeek-V4 Can't Read Images? I Made It Read&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/no-plugins-needed-i-built-a-fully-automated-coding-loop-in-opencode/" rel="noopener noreferrer"&gt;No Plugins Needed, I Built a Fully Automated Coding Loop in OpenCode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>coding</category>
      <category>programming</category>
    </item>
    <item>
      <title>The concept of Loop Engineering has been getting a lot of buzz lately, so I decided to give it a shot in OpenCode. The results were surprisingly good:</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Thu, 16 Jul 2026 07:41:44 +0000</pubDate>
      <link>https://dev.to/qtalen/the-concept-of-loop-engineering-has-been-getting-a-lot-of-buzz-lately-so-i-decided-to-give-it-a-gb7</link>
      <guid>https://dev.to/qtalen/the-concept-of-loop-engineering-has-been-getting-a-lot-of-buzz-lately-so-i-decided-to-give-it-a-gb7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk" class="crayons-story__hidden-navigation-link"&gt;How I Built a Fully Automated Coding Loop in OpenCode&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
              
              &lt;div id="story-author-preview-content-4156106" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 16&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk" id="article-link-4156106"&gt;
          How I Built a Fully Automated Coding Loop in OpenCode
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/coding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;coding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>automation</category>
      <category>coding</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built a Fully Automated Coding Loop in OpenCode</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Thu, 16 Jul 2026 07:41:10 +0000</pubDate>
      <link>https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk</link>
      <guid>https://dev.to/qtalen/how-i-built-a-fully-automated-coding-loop-in-opencode-22jk</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you've been following the AI agent space recently, you've probably heard the term Loop Engineering. Claude Code and OpenClaw both mention it.&lt;/p&gt;

&lt;p&gt;But nobody really explains what it means.&lt;/p&gt;

&lt;p&gt;Until Andrew Ng posted a clear breakdown of what Loop Engineering actually is. That post gave me the direction I needed to build it inside OpenCode.&lt;/p&gt;

&lt;p&gt;This article was originally published on my personal blog &lt;a href="https://www.dataleadsfuture.com/no-plugins-needed-i-built-a-fully-automated-coding-loop-in-opencode/" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Leads Future&lt;/strong&gt;&lt;/a&gt;, where I'll keep updating this content. You can also grab the source code for free over there and ask me anything you like.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Andrew Ng Says About the Coding Loop
&lt;/h2&gt;

&lt;p&gt;Andrew Ng's explanation centers around this diagram:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7p3tqmphamvfcxh5v750.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7p3tqmphamvfcxh5v750.png" alt="3 key product development loops. Image by Andrew Ng" width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three loops, simply put:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first loop is the code agent's implementation loop. You give the agent a product spec and a measurable target. The agent starts building features on its own, runs tests, and keeps iterating until every requirement in the spec is met.&lt;/li&gt;
&lt;li&gt;The second loop is the engineer feedback loop. Here the engineer acts as QA for their own product. They test what the coding agent built, and check if it matches their vision. If something is off, they write a new spec and kick off another round in the first loop.&lt;/li&gt;
&lt;li&gt;The third loop is the external feedback loop. Once the engineer is happy with the product, it goes to the open-source community or gets handed to a product team. Real user feedback comes in. The engineer collects that feedback regularly, feeds it back into the engineer feedback loop, and from there back into the code implementation loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three loops keep running. With AI in the mix, they push the product forward until it gets to where it needs to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Attempts
&lt;/h2&gt;

&lt;p&gt;Following Professor Andrew Ng's breakdown, I gave it a try in OpenCode. I built a &lt;code&gt;/goal&lt;/code&gt; command that lets users just type in what they want the AI to do, and the AI will kick off a coding loop to get it done automatically.&lt;/p&gt;

&lt;p&gt;I tested this command out and honestly, the results were way better than I expected.&lt;/p&gt;

&lt;p&gt;Here are some of the test scenarios I ran:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Write a Fibonacci script
&lt;/h3&gt;

&lt;p&gt;This test checks whether the agent picks the best algorithm. The prompt is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;/goal Write a Fibonacci calculation script with the best possible performance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F181qxf1yvewoplxwf5sr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F181qxf1yvewoplxwf5sr.png" alt="What's pretty cool is that DeepSeek went with a fast doubling algorithm, and it's incredibly performant. " width="697" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Build a Tower of Hanoi web game
&lt;/h3&gt;

&lt;p&gt;Everyone knows this game. You could honestly just prompt an LLM directly and get it built. But that predictability is exactly what makes it useful for testing whether each step of the coding loop is working correctly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;/goal Build a playable Tower of Hanoi web game.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frn5sfsfvvtzi305r1hy8.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frn5sfsfvvtzi305r1hy8.gif" alt="The Towers of Hanoi game built using the /goal command comes with a built-in AI solver. " width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build a chess web game
&lt;/h3&gt;

&lt;p&gt;Maybe you are not impressed by the Tower of Hanoi example, since a regular prompt to any frontier model can do the same thing without a coding loop. Fair. The chess game experiment is something you should actually try for yourself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;/goal Build a playable chess web game. 
Include easy, medium, and hard difficulty levels. 
No online multiplayer needed. 
Use a Python backend as the AI engine.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7x0rovisl6gkvwoo4bwc.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7x0rovisl6gkvwoo4bwc.gif" alt="A full-stack chess game with both frontend and backend, built using the /goal command. Image by Author" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A typing practice game for kids
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;/goal I want to build a typing practice web app for kids. 
At the bottom of the screen are 9 keys representing the positions of 10 fingers, with the thumbs sharing a wider spacebar key that takes up two slots. 
Above those 9 keys is a gradient-transparent rectangle. 
Letters fall down from the top toward that rectangle, aligned to their matching key positions. 
Press the right key as the letter enters the zone and it counts as a hit, triggering a hit effect. 
Consecutive correct hits build up increasingly dramatic effects. 
The falling speed gradually increases. 
At the top of the screen is a scoreboard that adds 1 point for each hit, with a pop animation. 
The whole thing should feel exciting and dopamine-triggering, with plenty of visual encouragement.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnn75lb1lv4qfmitl7ch2.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnn75lb1lv4qfmitl7ch2.gif" alt="A typing mini-game created with /goal command." width="760" height="572"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Pretty cool, right? Feeling curious?
&lt;/h2&gt;

&lt;p&gt;Go ahead and check out my latest article &lt;a href="https://www.dataleadsfuture.com/no-plugins-needed-i-built-a-fully-automated-coding-loop-in-opencode/" rel="noopener noreferrer"&gt;&lt;strong&gt;No Plugins Needed, I Built a Fully Automated Coding Loop in OpenCode&lt;/strong&gt;&lt;/a&gt; for the full tutorial, which covers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My implementation approach.&lt;/li&gt;
&lt;li&gt;How to use it.&lt;/li&gt;
&lt;li&gt;The complete source code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's all free, so what are you waiting for?&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;How I built a coding workflow in OpenCode, Oh-My-OpenCode-Slim, and OpenSpec that rivals Claude Code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/" rel="noopener noreferrer"&gt;&lt;strong&gt;How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How I added a reflection agent to the OpenSpec workflow and got DeepSeek-V4 to match or beat Claude Opus:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow/" rel="noopener noreferrer"&gt;&lt;strong&gt;Reflection SDD: Use a Reflection Harness to Level Up Your OpenSpec Workflow&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Still can't get your DeepSeek-V4 or GLM-5.2 to read images? Try my method:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/deepseek-v4-cant-read-images-i-made-it-read/" rel="noopener noreferrer"&gt;&lt;strong&gt;DeepSeek-V4 Can't Read Images? I Made It Read&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>coding</category>
      <category>llm</category>
    </item>
    <item>
      <title>The essence of prompt engineering isn't about feeding the model more information. It's about helping both the model and humans put their limited attention in the right place.</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Wed, 01 Jul 2026 06:14:54 +0000</pubDate>
      <link>https://dev.to/qtalen/the-essence-of-prompt-engineering-isnt-about-feeding-the-model-more-information-its-about-23f</link>
      <guid>https://dev.to/qtalen/the-essence-of-prompt-engineering-isnt-about-feeding-the-model-more-information-its-about-23f</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h" class="crayons-story__hidden-navigation-link"&gt;Why Well-Written Prompts Are Almost Always Structured&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
              
              &lt;div id="story-author-preview-content-4037780" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 1&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h" id="article-link-4037780"&gt;
          Why Well-Written Prompts Are Almost Always Structured
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Why Well-Written Prompts Are Almost Always Structured</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Wed, 01 Jul 2026 06:13:02 +0000</pubDate>
      <link>https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h</link>
      <guid>https://dev.to/qtalen/why-well-written-prompts-are-almost-always-structured-420h</guid>
      <description>&lt;p&gt;There's been endless debate about which language format prompts should be written in. Last year it was Markdown vs. JSON, this year it's Markdown vs. HTML.&lt;/p&gt;

&lt;p&gt;But if you ask me, the answer has never been about the format itself. The reason why some prompts work so well all points to the same thing: structure.&lt;/p&gt;

&lt;p&gt;The essence of prompt engineering isn't about feeding the model more information. It's about helping both the model and humans put their limited attention in the right place. Structured languages happen to do exactly that. They use just a few markers to distribute attention ahead of time within the text.&lt;/p&gt;

&lt;p&gt;Let me give you an example. Take a look at this natural language first:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We're going on a picnic on July 1st, the destination is xx City's Second Park (Central Park). We'll drive there. You take the ring road from the south side of the city, and I'll drive straight from the north side. We'll meet at 8 AM at Entrance 2 of Second Park. Remember to bring tuna sandwiches, bottled water, and a Bluetooth speaker. I'll bring a picnic blanket, a tent, chicken sandwiches, and mosquito repellent. Also, don't forget to book the park tickets on the app in advance. You can only book one day ahead. Search for xx City's Second Park on the app.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So where are we meeting? You'd have to spend a lot of time digging through the text to find it. But if we switch to a structured description, it's a whole different story:&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="gu"&gt;### Picnic Location&lt;/span&gt;
xx City's Second Park

&lt;span class="gu"&gt;### Meeting Time and Place&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; July 1st, meet at 8 AM
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Entrance 2**&lt;/span&gt; of Second Park

&lt;span class="gu"&gt;### Transportation&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; You: Drive via the ring road
&lt;span class="p"&gt;-&lt;/span&gt; Me: Drive straight from the north side

&lt;span class="gu"&gt;### Items to Bring&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; You: &lt;span class="gs"&gt;**Tuna**&lt;/span&gt; sandwiches, bottled water, Bluetooth speaker
&lt;span class="p"&gt;-&lt;/span&gt; Me: &lt;span class="gs"&gt;**Chicken**&lt;/span&gt; sandwiches, picnic blanket, tent, mosquito repellent

&lt;span class="gu"&gt;### Special Notes&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Must book tickets on the app in advance, search for &lt;span class="ge"&gt;*xx City's Second Park*&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Can only book one day ahead**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See? After writing it this way, if I ask you which entrance we're meeting at, your search efficiency goes way up, right?&lt;/p&gt;

&lt;p&gt;By categorizing and highlighting key points, the important information grabs your attention early on, instead of getting lost in a sea of text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataleadsfuture.com/why-well-written-prompts-are-almost-always-structured/" rel="noopener noreferrer"&gt;I wrote a full article explaining my take on structured prompts in plain language.&lt;/a&gt; If you're interested, feel free to click and read on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Don't wait for a multimodal DeepSeek-v4 model, you can use my plugin now to read images.</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Mon, 15 Jun 2026 06:18:01 +0000</pubDate>
      <link>https://dev.to/qtalen/dont-wait-for-a-multimodal-deepseek-v4-model-you-can-use-my-plugin-now-to-read-images-2a99</link>
      <guid>https://dev.to/qtalen/dont-wait-for-a-multimodal-deepseek-v4-model-you-can-use-my-plugin-now-to-read-images-2a99</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509" class="crayons-story__hidden-navigation-link"&gt;DeepSeek-V4 Can't Read Images? I Made It Read&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/qtalen" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" alt="qtalen profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/qtalen" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peng Qian
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peng Qian
                
              
              &lt;div id="story-author-preview-content-3903700" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/qtalen" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2927908%2F838177c1-066e-4986-a3ba-d764afa88632.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peng Qian&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 15&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509" id="article-link-3903700"&gt;
          DeepSeek-V4 Can't Read Images? I Made It Read
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/coding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;coding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vibecoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vibecoding&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
