<?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>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>
    <item>
      <title>DeepSeek-V4 Can't Read Images? I Made It Read</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Mon, 15 Jun 2026 06:15:41 +0000</pubDate>
      <link>https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509</link>
      <guid>https://dev.to/qtalen/deepseek-v4-cant-read-images-i-made-it-read-1509</guid>
      <description>&lt;p&gt;Don't wait for a multimodal model, you can use it now&lt;/p&gt;

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

&lt;p&gt;Have you ever had that frustrating moment: you are coding with &lt;code&gt;deepseek-v4&lt;/code&gt; in OpenCode, your code throws an error, you want to screenshot it and send it to DeepSeek, and then you remember that DeepSeek cannot read images.&lt;/p&gt;

&lt;p&gt;I have to say &lt;code&gt;deepseek-v4&lt;/code&gt; is cheap, easy to use, and has a long context. It has already become my main coding model. But as of mid-June, DeepSeek still hasn't released a multimodal version. That means anything involving images, like reading error screenshots, interpreting charts, or recreating pages from visual designs, it cannot do.&lt;/p&gt;

&lt;p&gt;I am not the only one frustrated. My friends are all waiting eagerly too.&lt;/p&gt;

&lt;p&gt;But I found a way: I developed a small plugin called &lt;code&gt;observer&lt;/code&gt; in OpenCode that lets &lt;code&gt;deepseek-v4&lt;/code&gt; call a multimodal agent to gain the ability to read images indirectly.&lt;/p&gt;

&lt;p&gt;After more than a month of polishing, this plugin now handles all image-related coding tasks in my daily work. Today, I will share how I built this plugin, hoping it can help you too.&lt;/p&gt;

&lt;p&gt;The plugin code and agent definitions mentioned in this article are at the end. Feel free to grab them.&lt;/p&gt;

&lt;p&gt;This article was originally published on my personal blog &lt;a href="https://www.dataleadsfuture.com/deepseek-v4-cant-read-images-i-made-it-read/" 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;
  
  
  Demo of Real-World Results
&lt;/h2&gt;

&lt;p&gt;Before diving into the long tutorial, you probably care most about how well this plugin works and whether it is worth your time to try. So let me show you some screenshots of the plugin in action.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Interpreting error stack traces
&lt;/h3&gt;

&lt;p&gt;We start with the simplest task: have &lt;code&gt;deepseek-v4&lt;/code&gt; interpret a screenshot of an error stack trace and find key information. I randomly picked a screenshot of an error I encountered at work:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2hfcyvp8a6mqw74yb2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2hfcyvp8a6mqw74yb2q.png" alt="A screenshot of a common error stack. Image by Author" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in OpenCode Desktop, I sent this image to the &lt;code&gt;plan&lt;/code&gt; agent using &lt;code&gt;deepseek-v4-pro&lt;/code&gt; and asked it to provide a solution:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgh1w19as6wl9cokw4eg8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgh1w19as6wl9cokw4eg8.png" alt="The deepseek-v4-pro agent quickly picked up the error message. Image by Author" width="593" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the &lt;code&gt;plan&lt;/code&gt; agent gave an answer based on the screenshot information.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Interpreting charts
&lt;/h3&gt;

&lt;p&gt;Another multimodal use case is interpreting charts from documents. For this example, I took a screenshot of a company's annual revenue chart and tested it. I still used the &lt;code&gt;plan&lt;/code&gt; agent with &lt;code&gt;deepseek-v4-pro&lt;/code&gt;. For an extra challenge, I asked the agent to give some key insights on the numbers in the chart:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03a0v1zsu7pu7owo2y6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03a0v1zsu7pu7owo2y6a.png" alt="A screenshot of a listed company's financial report. Image by AlphaStreet" width="774" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent read the numbers from the chart and provided some key insights:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczzjy9z9e2yiculgelhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczzjy9z9e2yiculgelhp.png" alt="The agent accurately spotted the data in the chart and offered key insights. Image by Author" width="587" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Developing HTML pages from designs
&lt;/h3&gt;

&lt;p&gt;In frontend development, the biggest demand for multimodal capability is recreating visual designs. Here I found a design with complex page elements to see if the &lt;code&gt;build&lt;/code&gt; agent using &lt;code&gt;deepseek-v4-flash&lt;/code&gt; could recreate the page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faso6zwjqz73w79d7u1la.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faso6zwjqz73w79d7u1la.png" alt="A screenshot of a web design draft. Image by dribbble.com" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the recreated page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjoxonw0mhhn1elq0cyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjoxonw0mhhn1elq0cyg.png" alt="The page that deepseek v4 flash recreated. Image by Author" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One thing is sure: the &lt;code&gt;deepseek-v4-flash&lt;/code&gt; model generated the frontend code, and it only took one prompt to get this result. It did not get a 100% match, but with a few more rounds of conversation, you can tweak it until it is perfect. Keep in mind &lt;code&gt;deepseek-v4-flash&lt;/code&gt; is dirt cheap.&lt;/p&gt;

&lt;p&gt;It costs several times or even ten times less than multimodal models like &lt;code&gt;kimi k2.6&lt;/code&gt; or &lt;code&gt;qwen3.7 plus&lt;/code&gt;. They are not in the same league.&lt;/p&gt;

&lt;p&gt;Of course, you can also crop a section of the page, mark the areas that need attention, and ask DeepSeek to adjust them, like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj0jqtlfgqgh6v3jx212.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj0jqtlfgqgh6v3jx212.png" alt="You can take a screenshot of the webpage and have deepseek-v4-flash make adjustments. Image by Author" width="583" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent perceives the marked area and gives the primary agent an adjustment plan per your request.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Generating HTML pages from hand-drawn sketches
&lt;/h3&gt;

&lt;p&gt;Maybe you are like me and have zero design skills. No problem. We can hand-draw rough sketches. The agent can understand them. For example, in a recent project, I hand-drew a few web page design sketches:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwiqz2iwugn78p67vtkqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwiqz2iwugn78p67vtkqi.png" alt="This is a hand-drawn sketch of the webpage. Image by Author" width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then &lt;code&gt;deepseek-v4-flash&lt;/code&gt; helped me recreate the page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrxhe3ktvy41ea5zvzlt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrxhe3ktvy41ea5zvzlt.png" alt="The agent restored the page based on my handwritten reference. Image by Author" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Impressive, right?&lt;/p&gt;




&lt;h2&gt;
  
  
  Detailed Implementation Walkthrough
&lt;/h2&gt;

&lt;p&gt;Next, you'll find out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How I designed this plugin and agent.&lt;/li&gt;
&lt;li&gt;Why I designed it that way.&lt;/li&gt;
&lt;/ol&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;Click on my full article to keep reading.&lt;/strong&gt;&lt;/a&gt;&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/how-i-cut-kimi-k3-costs-in-opencode/" rel="noopener noreferrer"&gt;How I Cut Kimi K3 Costs in OpenCode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>coding</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Your AI always writes messy code? That's because your spec files have never been properly reviewed. 

By adding a reflection mechanism to the proposal stage of OpenSpec, I got DeepSeek-v4-pro to match Opus 4.6 in coding ability:</title>
      <dc:creator>Peng Qian</dc:creator>
      <pubDate>Mon, 01 Jun 2026 04:05:05 +0000</pubDate>
      <link>https://dev.to/qtalen/your-ai-always-writes-messy-code-thats-because-your-spec-files-have-never-been-properly-5gnc</link>
      <guid>https://dev.to/qtalen/your-ai-always-writes-messy-code-thats-because-your-spec-files-have-never-been-properly-5gnc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/qtalen/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow-15l7" class="crayons-story__hidden-navigation-link"&gt;Reflection SDD: Use a Reflection Harness to Level Up Your OpenSpec Workflow&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-3792447" 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/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow-15l7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 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/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow-15l7" id="article-link-3792447"&gt;
          Reflection SDD: Use a Reflection Harness to Level Up Your OpenSpec Workflow
        &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/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow-15l7" 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/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow-15l7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&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;
            9 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>
