<?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: Jesse Piaścik</title>
    <description>The latest articles on DEV Community by Jesse Piaścik (@saxmanjes).</description>
    <link>https://dev.to/saxmanjes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F14278%2F3b60cb3d-afa9-4a76-b87c-91deceb9757a.jpg</url>
      <title>DEV Community: Jesse Piaścik</title>
      <link>https://dev.to/saxmanjes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saxmanjes"/>
    <language>en</language>
    <item>
      <title>The Shared Context Problem Is Slowing Your Team Down</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Tue, 17 Mar 2026 15:13:31 +0000</pubDate>
      <link>https://dev.to/imdone/your-team-doesnt-have-a-jira-problem-it-has-a-context-problem-4akd</link>
      <guid>https://dev.to/imdone/your-team-doesnt-have-a-jira-problem-it-has-a-context-problem-4akd</guid>
      <description>&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%2Fxv999dw5nfcf3aokxeiq.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%2Fxv999dw5nfcf3aokxeiq.png" alt="Scattered Context" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't think most teams are slowed down by lack of effort.&lt;/p&gt;

&lt;p&gt;I think they're slowed down because the context for the work is scattered.&lt;/p&gt;

&lt;p&gt;The task is in Jira.&lt;br&gt;
The decision is in a doc.&lt;br&gt;
The code is on a branch.&lt;br&gt;
The AI prompt that explains the reasoning is in chat history somewhere.&lt;/p&gt;

&lt;p&gt;Everything exists.&lt;br&gt;
But not in one place where the next person can actually use it.&lt;/p&gt;

&lt;p&gt;So every handoff starts with reconstruction.&lt;/p&gt;

&lt;p&gt;What were we trying to do?&lt;br&gt;
Why did we make that tradeoff?&lt;br&gt;
Which branch has the latest version?&lt;br&gt;
Where did that decision happen?&lt;/p&gt;

&lt;p&gt;I've been noticing this more and more as I work with AI.&lt;/p&gt;

&lt;p&gt;At first I thought AI would reduce the need for documentation and coordination. Instead it made the problem easier to see.&lt;/p&gt;

&lt;p&gt;If the context is stale, incomplete, or spread across five tools, the output drifts.&lt;/p&gt;

&lt;p&gt;That is true for AI.&lt;br&gt;
And it's true for teams.&lt;/p&gt;

&lt;p&gt;That's the shared context problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Isn't Just Missing Information
&lt;/h2&gt;

&lt;p&gt;Most teams don't actually have a shortage of information.&lt;/p&gt;

&lt;p&gt;They have a shortage of shared, current, easy-to-find information.&lt;/p&gt;

&lt;p&gt;That's a different problem.&lt;/p&gt;

&lt;p&gt;I've seen this over and over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the story is technically written down, but the real reasoning lives in comments&lt;/li&gt;
&lt;li&gt;the latest implementation details are only visible on a feature branch&lt;/li&gt;
&lt;li&gt;the best explanation of the problem lives in an AI prompt that nobody else can see&lt;/li&gt;
&lt;li&gt;a key decision was made in chat and never made it back into the work itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when someone else picks up the task, they have to reconstruct the thought process before they can move forward.&lt;/p&gt;

&lt;p&gt;That reconstruction work is expensive. It slows down handoffs, reviews, onboarding, and AI-assisted development.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Workarounds I've Seen
&lt;/h2&gt;

&lt;p&gt;Most teams know this is a problem, so they try to patch around it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the context in the repo
&lt;/h3&gt;

&lt;p&gt;This is usually the first instinct, and honestly, I think it's directionally right.&lt;/p&gt;

&lt;p&gt;Keeping context near the code is better than keeping it in a detached system no developer wants to live in all day.&lt;/p&gt;

&lt;p&gt;But if the context lives in the main repo, another problem shows up fast:&lt;/p&gt;

&lt;p&gt;Which branch has the latest version?&lt;/p&gt;

&lt;p&gt;If the plan changed on a feature branch, the rest of the team has to know that branch exists. If multiple branches each have part of the story, then the source of truth depends on knowing where to look.&lt;/p&gt;

&lt;p&gt;That works for one developer who remembers everything.&lt;br&gt;
It breaks down for a team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the context in another repo
&lt;/h3&gt;

&lt;p&gt;I've seen teams try this too.&lt;/p&gt;

&lt;p&gt;The idea is clean: separate the context from the product repo so it doesn't interfere with the codebase.&lt;/p&gt;

&lt;p&gt;But now every meaningful context update becomes its own coordination problem.&lt;/p&gt;

&lt;p&gt;You need context PRs.&lt;br&gt;
You need someone to review them.&lt;br&gt;
You need to wait for them to merge.&lt;/p&gt;

&lt;p&gt;So instead of making context easier to maintain, you create a second workflow around maintaining the workflow.&lt;/p&gt;

&lt;p&gt;That overhead adds up quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leave it spread across tools
&lt;/h3&gt;

&lt;p&gt;This is where most teams end up by default.&lt;/p&gt;

&lt;p&gt;A little in Jira.&lt;br&gt;
A little in GitHub.&lt;br&gt;
A little in Notion.&lt;br&gt;
A little in Slack.&lt;br&gt;
A little in AI prompts.&lt;/p&gt;

&lt;p&gt;People can usually find enough to keep moving, but not without friction.&lt;/p&gt;

&lt;p&gt;And friction compounds.&lt;/p&gt;




&lt;h2&gt;
  
  
  What AI Made Obvious to Me
&lt;/h2&gt;

&lt;p&gt;Working with AI made this problem impossible for me to ignore.&lt;/p&gt;

&lt;p&gt;When an AI assistant gets a bad prompt, incomplete files, or missing constraints, the result is usually disappointing. Not because the model is useless, but because the context is weak.&lt;/p&gt;

&lt;p&gt;That reminded me of how humans work too.&lt;/p&gt;

&lt;p&gt;We expect teammates to make good decisions with partial tickets, outdated notes, and disconnected artifacts. Then we're surprised when they miss the intent.&lt;/p&gt;

&lt;p&gt;AI didn't create the shared context problem.&lt;br&gt;
It just exposed it more clearly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Actually Want
&lt;/h2&gt;

&lt;p&gt;I want the context for the work to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;close to the code&lt;/li&gt;
&lt;li&gt;visible to the team&lt;/li&gt;
&lt;li&gt;easy to update while working&lt;/li&gt;
&lt;li&gt;available to AI&lt;/li&gt;
&lt;li&gt;tied to the task, not floating in some disconnected place&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, I want the "why," the "what," and the supporting artifacts to travel with the work itself.&lt;/p&gt;

&lt;p&gt;That's the idea behind what I've been building with &lt;a href="https://imdone.io" rel="noopener noreferrer"&gt;&lt;strong&gt;imdone&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How imdone Helps
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;imdone&lt;/code&gt; turns Jira and GitHub issues into a shared context repository next to the code.&lt;/p&gt;

&lt;p&gt;That means the issue, comments, attachments, plans, and working notes can live in a local structure that developers can open in their editor and work with directly.&lt;/p&gt;

&lt;p&gt;For me, that's a much better model than treating Jira like a separate universe you visit in the browser.&lt;/p&gt;

&lt;p&gt;It keeps context close at hand.&lt;br&gt;
It makes it easier to update while the work is happening.&lt;br&gt;
And it gives AI access to the same local context the team is using.&lt;/p&gt;

&lt;p&gt;I've also been pairing that with hypothesis-driven workflows, where each story captures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the outcome we're trying to create&lt;/li&gt;
&lt;li&gt;the hypothesis behind it&lt;/li&gt;
&lt;li&gt;the success metrics&lt;/li&gt;
&lt;li&gt;the design and plan&lt;/li&gt;
&lt;li&gt;the demo path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That structure helps both humans and AI stay grounded in the same goal.&lt;/p&gt;

&lt;p&gt;To me, that's the real opportunity here.&lt;br&gt;
Not just better issue management.&lt;br&gt;
Better alignment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;I don't think most teams are blocked because they lack tools.&lt;/p&gt;

&lt;p&gt;I think they're blocked because too much of the reasoning around the work is fragmented.&lt;/p&gt;

&lt;p&gt;When the context is shared and current:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;handoffs are easier&lt;/li&gt;
&lt;li&gt;reviews are faster&lt;/li&gt;
&lt;li&gt;AI is more useful&lt;/li&gt;
&lt;li&gt;product decisions stay connected to implementation&lt;/li&gt;
&lt;li&gt;the team spends less time reconstructing and more time building&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a meaningful shift.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Test
&lt;/h2&gt;

&lt;p&gt;If your team has ever asked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Which branch has the latest plan?"&lt;/li&gt;
&lt;li&gt;"Where did we decide that?"&lt;/li&gt;
&lt;li&gt;"Can you send me the prompt you used?"&lt;/li&gt;
&lt;li&gt;"Why did we do it this way?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...then you're already feeling the shared context problem.&lt;/p&gt;

&lt;p&gt;The question isn't whether the context exists.&lt;/p&gt;

&lt;p&gt;The question is whether the whole team, and your AI tools, can see the same current version of it without hunting for it.&lt;/p&gt;

&lt;p&gt;If not, it's probably time to change the workflow.&lt;/p&gt;

&lt;p&gt;If you want to see how I'm approaching this, take a look at &lt;a href="https://imdone.io" rel="noopener noreferrer"&gt;&lt;strong&gt;imdone.io&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>jira</category>
      <category>ai</category>
      <category>devex</category>
    </item>
    <item>
      <title>Fast Delivery Isn't Enough. You Need Fast Feedback.</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Thu, 05 Mar 2026 13:34:13 +0000</pubDate>
      <link>https://dev.to/imdone/fast-delivery-isnt-enough-you-need-fast-feedback-138n</link>
      <guid>https://dev.to/imdone/fast-delivery-isnt-enough-you-need-fast-feedback-138n</guid>
      <description>&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%2Ff2nwqa0ut5ar4xhdqfsw.webp" 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%2Ff2nwqa0ut5ar4xhdqfsw.webp" alt="Sweating guy two buttons meme" width="500" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's demo day. Claude Code knocked out the data layer migration in two days. So the team pulled in more backend work—cleaner API contracts, better abstractions. Might as well use the time.&lt;/p&gt;

&lt;p&gt;The product manager asks: "So what can users do now that they couldn't do before?"&lt;/p&gt;

&lt;p&gt;Silence.&lt;/p&gt;

&lt;p&gt;"Nothing yet. But the next feature will be way faster to build."&lt;/p&gt;

&lt;p&gt;She nods. You can tell she's already thinking about how to explain this to stakeholders.&lt;/p&gt;

&lt;p&gt;A full sprint of AI-accelerated work. Users have seen nothing. Feedback: zero. And you're moving faster than ever—on top of assumptions you've never validated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Constraint Isn't Coding Speed
&lt;/h2&gt;

&lt;p&gt;Your developers can now code faster with AI coding assistants. That's incredible. But faster coding doesn't automatically lead to better products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real waste in software development isn't slow coding—it's building the wrong product or feature.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As Marty Cagan from Silicon Valley Product Group puts it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The biggest waste in software development is building the wrong product or feature."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spending 3 months building a feature users don't want&lt;/li&gt;
&lt;li&gt;Shipping a "complete" solution only to discover it solves the wrong problem&lt;/li&gt;
&lt;li&gt;Building all of Feature A when users only needed 20% of it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Speed amplifies this risk. The faster you can code, the more time you can waste building the wrong thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Break Stories into Vertical Slices
&lt;/h2&gt;

&lt;p&gt;The answer isn't just faster coding—it's &lt;strong&gt;faster learning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Break your epics into &lt;strong&gt;vertical slices&lt;/strong&gt;: thin, end-to-end features you can ship, test, and learn from quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's a Vertical Slice?
&lt;/h3&gt;

&lt;p&gt;A vertical slice delivers complete value through all layers of your system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It touches UI, backend, database—everything&lt;/li&gt;
&lt;li&gt;It's deployable independently&lt;/li&gt;
&lt;li&gt;It solves a real user problem (even if minimally)&lt;/li&gt;
&lt;li&gt;It enables you to learn whether you're on the right track&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Instead of:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sprint 1: Build entire backend (no user feedback yet)
Sprint 2: Build entire frontend (still no user feedback)
Sprint 3: Integration (finally users can try it)
Sprint 4: Discover it's not what they wanted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Do this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sprint 1: Ship smallest end-to-end version (get feedback immediately)
Sprint 2: Iterate based on real user feedback
Sprint 3: Add next most valuable slice
Sprint 4: You've validated direction and built only what's needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Matters with AI Coding
&lt;/h3&gt;

&lt;p&gt;When issues live as markdown files in your repo (instead of buried in Jira's UI), you can use AI coding assistants to help refine your stories before you build them.&lt;/p&gt;

&lt;p&gt;Ask your AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Break this epic into vertical slices that deliver value incrementally"&lt;/li&gt;
&lt;li&gt;"What's the smallest end-to-end feature we could ship to validate this?"&lt;/li&gt;
&lt;li&gt;"Identify the walking skeleton for this story"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI can analyze your story structure and suggest slices that enable fast feedback loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tighten Your Feedback Loop
&lt;/h2&gt;

&lt;p&gt;Kent Beck (creator of Extreme Programming) has a principle worth adapting to product work:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Make the change easy, then make the easy change... This is true for product work too: make feedback easy, then make the easy improvement."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When your issues are markdown files next to your code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI can help you refine them&lt;/strong&gt; before development starts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You ship in days, not weeks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You learn what works&lt;/strong&gt; before investing months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You pivot quickly&lt;/strong&gt; based on real user feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You reduce waste&lt;/strong&gt; from building unused features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? Smaller batches, faster feedback, better products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed + Direction = Value
&lt;/h2&gt;

&lt;p&gt;Charles Darwin's principle applies to software teams:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It is not the strongest of the species that survives... It is the one that is most adaptable to change."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fast coding is strength. But adaptability comes from fast feedback.&lt;/p&gt;

&lt;p&gt;Combine them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ship small vertical slices&lt;/strong&gt; (days, not sprints)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get real user feedback quickly&lt;/strong&gt; (not after months)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn and adapt&lt;/strong&gt; (before you've built too much)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate based on what users actually need&lt;/strong&gt; (not assumptions)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's how you turn coding speed into product value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Next Steps
&lt;/h2&gt;

&lt;p&gt;Want to enable faster feedback loops on your team?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Review your current stories&lt;/strong&gt;: Are they vertical slices or horizontal layers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Break one epic into slices&lt;/strong&gt;: What's the smallest end-to-end version you could ship this week?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use AI to help&lt;/strong&gt;: If your issues are in markdown, ask Claude or GPT to suggest vertical slices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship and learn&lt;/strong&gt;: Deploy the smallest slice, get feedback, iterate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The teams that win aren't the ones that code fastest. They're the ones that &lt;strong&gt;learn fastest&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your experience with vertical slicing or fast feedback loops?&lt;/strong&gt; Drop a comment below—I'd love to hear how your team balances speed with learning.&lt;/p&gt;

&lt;p&gt;If you found this useful, &lt;strong&gt;give it a ❤️&lt;/strong&gt; and &lt;strong&gt;follow me&lt;/strong&gt; for more posts on developer productivity, AI-assisted development, and building better products.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is part of a series on context-driven development and enabling adaptive teams. Learn more at &lt;a href="https://imdone.io" rel="noopener noreferrer"&gt;imdone.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>agile</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop Context-Switching: Edit Jira Attachments Like Code (Imdone CLI 0.39.0)</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Thu, 19 Feb 2026 13:09:02 +0000</pubDate>
      <link>https://dev.to/imdone/stop-context-switching-edit-jira-attachments-like-code-imdone-cli-0390-144l</link>
      <guid>https://dev.to/imdone/stop-context-switching-edit-jira-attachments-like-code-imdone-cli-0390-144l</guid>
      <description>&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%2Fj4sf0x3287y9b0gxg0wj.jpg" 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%2Fj4sf0x3287y9b0gxg0wj.jpg" alt="Expanding brain - jira attachments" width="500" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; You're deep in flow. You need to update a screenshot in a Jira issue. Now you have to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stop what you're doing&lt;/li&gt;
&lt;li&gt;Find the issue in your browser (which tab was it?)&lt;/li&gt;
&lt;li&gt;Scroll to attachments&lt;/li&gt;
&lt;li&gt;Upload the new version&lt;/li&gt;
&lt;li&gt;Delete the old version&lt;/li&gt;
&lt;li&gt;Try to remember what you were doing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;10 minutes gone.&lt;/strong&gt; Flow state destroyed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if attachments were just... files?
&lt;/h2&gt;

&lt;p&gt;That's what &lt;a href="https://npmjs.com/package/imdone-cli" rel="noopener noreferrer"&gt;Imdone CLI 0.39.0&lt;/a&gt; does. Attachments live in your repo alongside your code. Edit them like any other file. Push changes like you push code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before: The Browser Dance 💀
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You're working on PROJ-123&lt;/span&gt;
vim src/auth.js
&lt;span class="c"&gt;# "Oh, I need to update that architecture diagram..."&lt;/span&gt;

&lt;span class="c"&gt;# Switch to browser&lt;/span&gt;
&lt;span class="c"&gt;# Open Jira&lt;/span&gt;
&lt;span class="c"&gt;# Find issue PROJ-123&lt;/span&gt;
&lt;span class="c"&gt;# Scroll down... down... down to attachments&lt;/span&gt;
&lt;span class="c"&gt;# Click "Attach files"&lt;/span&gt;
&lt;span class="c"&gt;# Find the file on your computer&lt;/span&gt;
&lt;span class="c"&gt;# Upload&lt;/span&gt;
&lt;span class="c"&gt;# Wait for upload&lt;/span&gt;
&lt;span class="c"&gt;# Scroll back to attachments&lt;/span&gt;
&lt;span class="c"&gt;# Click delete on old version&lt;/span&gt;
&lt;span class="c"&gt;# Confirm deletion&lt;/span&gt;
&lt;span class="c"&gt;# Finally, back to your editor&lt;/span&gt;

&lt;span class="c"&gt;# What was I doing again?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After: Stay in Your Workflow ✨
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You're working on PROJ-123&lt;/span&gt;
vim src/auth.js
&lt;span class="c"&gt;# "Oh, I need to update that architecture diagram..."&lt;/span&gt;

&lt;span class="c"&gt;# Edit the diagram right there&lt;/span&gt;
open backlog/current-sprint/PROJ-123/attachments/architecture.png
&lt;span class="c"&gt;# Make your changes, save&lt;/span&gt;

&lt;span class="c"&gt;# Push to Jira&lt;/span&gt;
imdone push
&lt;span class="c"&gt;# ✓ Updated: PROJ-123/architecture.png (256KB)&lt;/span&gt;

&lt;span class="c"&gt;# Back to coding&lt;/span&gt;
vim src/auth.js
&lt;span class="c"&gt;# Flow unbroken&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's New in 0.39.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Modify Attachments
&lt;/h3&gt;

&lt;p&gt;Edit a file locally. Push syncs the new version to Jira and deletes the old one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone pull
&lt;span class="c"&gt;# Edit the file&lt;/span&gt;
vim backlog/current-sprint/PROJ-123/attachments/screenshot.png
&lt;span class="c"&gt;# Push changes&lt;/span&gt;
imdone push
&lt;span class="c"&gt;# ✓ Updated: PROJ-123/screenshot.png (125KB)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Safety First:&lt;/strong&gt; Uses an upload-then-delete pattern. If the upload fails, your old version is preserved in Jira. No data loss on network failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Delete Attachments
&lt;/h3&gt;

&lt;p&gt;Remove a file locally. Push deletes it from Jira.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;backlog/current-sprint/PROJ-123/attachments/old-design.pdf
imdone push
&lt;span class="c"&gt;# ✓ Deleted: PROJ-123/old-design.pdf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Rename Attachments
&lt;/h3&gt;

&lt;p&gt;Rename a file. Push handles the cleanup automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backlog/current-sprint/PROJ-123/attachments/
&lt;span class="nb"&gt;mv &lt;/span&gt;draft-v1.png final-design.png
&lt;span class="nb"&gt;cd&lt;/span&gt; -
imdone push
&lt;span class="c"&gt;# ✓ Renamed: PROJ-123/draft-v1.png → final-design.png&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes: Deletes old attachment from Jira, uploads the renamed file as new.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Add New Attachments
&lt;/h3&gt;

&lt;p&gt;Drop a file in the attachments folder. Push uploads it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; ~/Desktop/error-log.txt backlog/current-sprint/PROJ-123/attachments/
imdone push
&lt;span class="c"&gt;# ✓ Added: PROJ-123/error-log.txt (45KB)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Technical Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Git-Aware Detection
&lt;/h3&gt;

&lt;p&gt;The tricky part: Imdone CLI runs &lt;code&gt;imdone pull&lt;/code&gt; before &lt;code&gt;imdone push&lt;/code&gt; to ensure you're synced. But the pull operation includes a git stash/pop cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User deletes attachment locally&lt;/li&gt;
&lt;li&gt;Push calls pull&lt;/li&gt;
&lt;li&gt;Pull stashes the deletion&lt;/li&gt;
&lt;li&gt;Pull fetches from Jira (might re-download the attachment!)&lt;/li&gt;
&lt;li&gt;Pull pops the stash&lt;/li&gt;
&lt;li&gt;Push needs to detect the deletion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Capture git status &lt;em&gt;before&lt;/em&gt; the pull operation. Use that pre-analyzed status to detect deleted/renamed attachments, even if pull re-downloaded them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Capture status before pull&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;preAnalyzedStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;projectPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;defaultDirectory&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Pull from Jira (might re-download deleted attachments)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;deps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;providerPlugin&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Use pre-analyzed status to detect deletions&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;_push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;deps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;preAnalyzedStatus&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Upload-Then-Delete Safety
&lt;/h3&gt;

&lt;p&gt;When modifying attachments, the order matters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;replaceAttachment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;issueKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldAttachmentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newFilePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Upload first&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newAttachment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;uploadAttachment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;issueKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newFilePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Only delete if upload succeeded&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;deleteAttachment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldAttachmentId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Uploaded new but failed to delete old: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// User has duplicate in Jira, but no data loss&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newAttachment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the upload fails, the old version stays in Jira. No data loss.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metadata Tracking
&lt;/h3&gt;

&lt;p&gt;Attachments are tracked in &lt;code&gt;.metadata.yml&lt;/code&gt; files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;attachments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;12345"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;12345"&lt;/span&gt;
    &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screenshot.png"&lt;/span&gt;
    &lt;span class="na"&gt;localPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screenshot.png"&lt;/span&gt;
    &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;45678&lt;/span&gt;
    &lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-01-15T10:30:00Z"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detecting which files are new vs. modified&lt;/li&gt;
&lt;li&gt;Mapping local files to Jira attachment IDs&lt;/li&gt;
&lt;li&gt;Avoiding unnecessary re-downloads on pull&lt;/li&gt;
&lt;li&gt;Cleaning up orphaned attachments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; imdone-cli@0.39.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Workflow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize in your repo&lt;/span&gt;
imdone init

&lt;span class="c"&gt;# Pull issues and attachments&lt;/span&gt;
imdone pull

&lt;span class="c"&gt;# Your attachments are now local files:&lt;/span&gt;
&lt;span class="c"&gt;# backlog/&lt;/span&gt;
&lt;span class="c"&gt;# └── current-sprint/&lt;/span&gt;
&lt;span class="c"&gt;#     └── PROJ-123/&lt;/span&gt;
&lt;span class="c"&gt;#         ├── attachments/&lt;/span&gt;
&lt;span class="c"&gt;#         │   ├── screenshot.png&lt;/span&gt;
&lt;span class="c"&gt;#         │   ├── error-log.txt&lt;/span&gt;
&lt;span class="c"&gt;#         │   └── .metadata.yml&lt;/span&gt;
&lt;span class="c"&gt;#         └── issue-PROJ-123.md&lt;/span&gt;

&lt;span class="c"&gt;# Edit any attachment&lt;/span&gt;
open backlog/current-sprint/PROJ-123/attachments/screenshot.png
&lt;span class="c"&gt;# (make your changes)&lt;/span&gt;

&lt;span class="c"&gt;# Push changes back to Jira&lt;/span&gt;
imdone push
&lt;span class="c"&gt;# ✓ Updated: PROJ-123/screenshot.png (125KB)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Full Feature Demo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull latest&lt;/span&gt;
imdone pull

&lt;span class="c"&gt;# Add a new attachment&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; ~/Desktop/architecture.png backlog/current-sprint/PROJ-456/attachments/

&lt;span class="c"&gt;# Modify an existing one&lt;/span&gt;
vim backlog/current-sprint/PROJ-123/attachments/bug-report.txt

&lt;span class="c"&gt;# Rename another&lt;/span&gt;
&lt;span class="nb"&gt;mv &lt;/span&gt;backlog/current-sprint/PROJ-789/attachments/draft.pdf backlog/current-sprint/PROJ-789/attachments/final.pdf

&lt;span class="c"&gt;# Delete an outdated one&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;backlog/current-sprint/PROJ-111/attachments/old-screenshot.png

&lt;span class="c"&gt;# Push all changes at once&lt;/span&gt;
imdone push
&lt;span class="c"&gt;# ✓ Added: PROJ-456/architecture.png (256KB)&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Updated: PROJ-123/bug-report.txt (12KB)&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Renamed: PROJ-789/draft.pdf → final.pdf&lt;/span&gt;
&lt;span class="c"&gt;# ✓ Deleted: PROJ-111/old-screenshot.png&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Attachments belong with your code&lt;/strong&gt;, not in browser tabs.&lt;/p&gt;

&lt;p&gt;When you're fixing a bug, you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code&lt;/li&gt;
&lt;li&gt;The issue description&lt;/li&gt;
&lt;li&gt;The error logs&lt;/li&gt;
&lt;li&gt;The screenshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having them scattered across your IDE and browser is cognitive overhead. Having them all in your repo, in the same directory, is &lt;em&gt;flow&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Imdone CLI gives you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-repo/
├── src/               # Your code
│   └── auth.js
├── tests/             # Your tests
│   └── auth.test.js
└── backlog/           # Your issues (WITH attachments)
    └── current-sprint/
        └── PROJ-123/
            ├── issue-PROJ-123.md         # Issue content
            ├── comments-PROJ-123.md      # Discussion
            └── attachments/              # Files
                ├── error-log.txt
                ├── screenshot.png
                └── architecture.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything in one place. Edit anything. Push to sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; imdone-cli@0.39.0
imdone init
imdone pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two-way sync for Jira issues, comments, and attachments.&lt;br&gt;
All as Markdown and files in your repo.&lt;br&gt;
All in your editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because your best work happens in your editor, not your browser.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://npmjs.com/package/imdone-cli" rel="noopener noreferrer"&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What's your biggest Jira workflow pain point? Drop it in the comments. 👇&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>jira</category>
      <category>cli</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Context-Driven Development Experiment 4: Normalizing CLI Commands with Claude Code and TDD</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Tue, 27 Jan 2026 02:17:32 +0000</pubDate>
      <link>https://dev.to/imdone/context-driven-development-experiment-4-normalizing-cli-commands-with-claude-code-and-tdd-5247</link>
      <guid>https://dev.to/imdone/context-driven-development-experiment-4-normalizing-cli-commands-with-claude-code-and-tdd-5247</guid>
      <description>&lt;p&gt;Every week, I run small experiments with context-driven development (CDD), AI tools, and &lt;a href="https://imdone.io" rel="noopener noreferrer"&gt;imdone-cli&lt;/a&gt; - a tool I built that keeps your backlog right in your source code so you never lose context.&lt;/p&gt;

&lt;p&gt;This week, I'm putting &lt;strong&gt;Claude Code&lt;/strong&gt; to the test on a critical developer experience improvement: normalizing imdone-cli commands to follow Git-like conventions. When CLI tools have inconsistent argument patterns, developers waste mental energy figuring out syntax instead of solving problems.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/Pz8KJA5KmvY"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CLI Consistency Matters
&lt;/h2&gt;

&lt;p&gt;As imdone-cli evolved, command arguments became inconsistent. The &lt;code&gt;template&lt;/code&gt; command required verbose options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone template &lt;span class="nt"&gt;--issue-key&lt;/span&gt; SCRUM-123 &lt;span class="nt"&gt;--template&lt;/span&gt; bug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But developers expect familiar Git-like patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"message"&lt;/span&gt;     &lt;span class="c"&gt;# Positional arguments&lt;/span&gt;
imdone template SCRUM-123 bug  &lt;span class="c"&gt;# Much cleaner&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This inconsistency creates cognitive friction. By normalizing to Git conventions, we reduce mental overhead to zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Context-Driven Development Approach
&lt;/h2&gt;

&lt;p&gt;I structured this task using templates in Imdone:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Normalize the &lt;code&gt;template&lt;/code&gt; command to use positional arguments, accept them in any order, and provide intuitive aliases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use TDD with red-green-refactor cycle&lt;/li&gt;
&lt;li&gt;Follow de facto CLI standards (Git-like)&lt;/li&gt;
&lt;li&gt;Update documentation automatically&lt;/li&gt;
&lt;li&gt;Don't break existing functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Files&lt;/strong&gt;: Links to entry point, test files, and command patterns.&lt;/p&gt;

&lt;p&gt;This template-based approach means I can quickly spin up well-structured tasks. Just type &lt;code&gt;$&lt;/code&gt; in VS Code with the Imdone extension, select my template, and I have a complete spec ready for Claude.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Development Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=106" rel="noopener noreferrer"&gt;01:46&lt;/a&gt; - Template-Based Setup
&lt;/h3&gt;

&lt;p&gt;I demonstrated my workflow using Imdone templates to structure AI tasks. The spec lives as markdown synced with Jira, so teammates see the same information without context-switching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned&lt;/strong&gt;: File linking requires a leading slash (&lt;code&gt;/cli-package/src/bin.mjs&lt;/code&gt;) for proper navigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=185" rel="noopener noreferrer"&gt;03:05&lt;/a&gt; - Handling Merge Conflicts
&lt;/h3&gt;

&lt;p&gt;When I ran &lt;code&gt;imdone push&lt;/code&gt; to sync updates, I hit a merge conflict. imdone-cli handles this with git-like merge resolution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone push    &lt;span class="c"&gt;# Triggers conflict&lt;/span&gt;
imdone merge   &lt;span class="c"&gt;# Completes merge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key feature&lt;/strong&gt;: Multiple team members can work on the same issue simultaneously - something Jira doesn't allow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=431" rel="noopener noreferrer"&gt;07:11&lt;/a&gt; - Claude Implements TDD
&lt;/h3&gt;

&lt;p&gt;I prompted: "Execute the task on line 21." That's it. Claude understood everything from the context file.&lt;/p&gt;

&lt;p&gt;While Claude worked, I explained my &lt;code&gt;.claude/rules&lt;/code&gt; folder where I keep context files for homepage strategies, pair programming experts, and writing constraints. These ensure Claude has domain knowledge about my projects.&lt;/p&gt;

&lt;p&gt;Claude generated comprehensive tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;template command&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should apply template to existing issue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should work with alias t instead of template&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should accept issue and template in any order&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=635" rel="noopener noreferrer"&gt;10:35&lt;/a&gt; - Teaching Red-Green-Refactor
&lt;/h3&gt;

&lt;p&gt;Initial tests passed when they should have failed - Claude implemented everything at once instead of following TDD discipline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is a common AI mistake&lt;/strong&gt;: They're too helpful and skip the red phase.&lt;/p&gt;

&lt;p&gt;I added: "Use red-green-refactor cycle. Tests should fail before implementation."&lt;/p&gt;

&lt;p&gt;After some back-and-forth, Claude understood. It wrote failing tests first, confirmed they failed, then implemented the feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=784" rel="noopener noreferrer"&gt;13:04&lt;/a&gt; - Tests Failing (Good!)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
❌ should accept issue and template &lt;span class="k"&gt;in &lt;/span&gt;any order
❌ should work with &lt;span class="nb"&gt;alias &lt;/span&gt;t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect. This is exactly what we want in TDD.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=808" rel="noopener noreferrer"&gt;13:28&lt;/a&gt; - Implementation
&lt;/h3&gt;

&lt;p&gt;Claude updated the command structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Old way&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--issue-key &amp;lt;key&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Issue key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--template &amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Template name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// New way (positional arguments)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[issue]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Issue key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[template]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Template name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;t&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean, logical, and follows commander.js conventions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1005" rel="noopener noreferrer"&gt;16:45&lt;/a&gt; - All Tests Pass
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;✅ All 14 tests passing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command now follows Git patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before (awkward)&lt;/span&gt;
imdone template &lt;span class="nt"&gt;--issue-key&lt;/span&gt; SCRUM-123 &lt;span class="nt"&gt;--template&lt;/span&gt; bug

&lt;span class="c"&gt;# After (Git-like)&lt;/span&gt;
imdone template SCRUM-123 bug
imdone t SCRUM-123 bug  &lt;span class="c"&gt;# with alias&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1140" rel="noopener noreferrer"&gt;19:00&lt;/a&gt; - Proactive Analysis
&lt;/h3&gt;

&lt;p&gt;Without prompting, Claude suggested: "Would you like me to normalize the &lt;code&gt;update&lt;/code&gt; command? It uses &lt;code&gt;--force&lt;/code&gt; without a corresponding &lt;code&gt;-f&lt;/code&gt; short option."&lt;/p&gt;

&lt;p&gt;This kind of codebase-wide pattern recognition is where AI assistants shine.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1482" rel="noopener noreferrer"&gt;24:42&lt;/a&gt; - Manual Testing Success
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npm &lt;span class="nb"&gt;link
&lt;/span&gt;imdone template SCRUM-138 story
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command accepted positional arguments and felt natural - no mental friction about syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Worked Well
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Template-Based Specs&lt;/strong&gt;: Having a reusable template with files, goals, and constraints meant Claude had everything upfront. No back-and-forth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TDD Discipline&lt;/strong&gt;: Once Claude understood red-green-refactor, it followed perfectly. Tests documented desired behavior, failed appropriately, then passed after implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proactive Pattern Recognition&lt;/strong&gt;: Claude spotted other commands needing normalization without being asked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges and Real-World Friction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AI Over-Helpfulness&lt;/strong&gt;: Initially, Claude implemented features while writing tests instead of following TDD. Required explicit guidance about red-green-refactor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Philosophy Confusion&lt;/strong&gt;: Claude initially wrote test descriptions mentioning "should fail" rather than describing desired behavior. Took iteration to clarify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Waiting Time&lt;/strong&gt;: Moments where you're just waiting for AI to generate code (30-60 seconds) - enough to break flow slightly.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use AI Assistants for Refactoring
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AI coding assistants excel at&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Following established patterns across a codebase&lt;/li&gt;
&lt;li&gt;Writing comprehensive tests for new behavior&lt;/li&gt;
&lt;li&gt;Updating documentation consistently&lt;/li&gt;
&lt;li&gt;Spotting similar patterns elsewhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;They need guidance with&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TDD discipline (will skip red-green-refactor if not reminded)&lt;/li&gt;
&lt;li&gt;Understanding test philosophy&lt;/li&gt;
&lt;li&gt;Making architectural decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bigger Picture: Developer Experience
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Consistency reduces cognitive load.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When every CLI tool invents its own syntax, developers spend mental energy on syntax instead of problems. When tools follow de facto standards (Git, npm, docker), they feel immediately familiar.&lt;/p&gt;

&lt;p&gt;This is what imdone-cli enables more broadly: keeping context (backlog, decisions, discussions) right next to code reduces context-switching overhead. Same principle, different domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install imdone-cli&lt;/strong&gt;: &lt;code&gt;npm install -g imdone-cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up templates&lt;/strong&gt;: Create templates in &lt;code&gt;.imdone/templates/&lt;/code&gt; for common patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure AI tasks&lt;/strong&gt;: Include goals, constraints, and file references&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use TDD explicitly&lt;/strong&gt;: Specify "red-green-refactor" in constraints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate and learn&lt;/strong&gt;: AI assistants need guidance around testing discipline&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;&lt;strong&gt;Upcoming features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Favorites system&lt;/strong&gt;: Organize large issue lists into folders (requested by my 40-person team)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop integration&lt;/strong&gt;: Open Imdone Desktop from CLI&lt;/li&gt;
&lt;li&gt;Maybe ensemble programming with Claude as part of the team?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Join the Conversation
&lt;/h2&gt;

&lt;p&gt;Have you normalized CLI commands in your projects? Used Claude Code for refactoring?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drop a comment below&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patterns you've discovered for teaching AI assistants about TDD&lt;/li&gt;
&lt;li&gt;CLI design decisions you've made (or regretted)&lt;/li&gt;
&lt;li&gt;How you structure tasks for AI coding assistants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you found this useful, &lt;strong&gt;give it a ❤️&lt;/strong&gt; and &lt;strong&gt;follow me&lt;/strong&gt; for weekly experiments at the intersection of AI, developer experience, and better tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Timeline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=0" rel="noopener noreferrer"&gt;00:00&lt;/a&gt; - Introduction to weekly CDD experiments&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=16" rel="noopener noreferrer"&gt;00:16&lt;/a&gt; - Decision to normalize CLI commands&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=106" rel="noopener noreferrer"&gt;01:46&lt;/a&gt; - Setting up with Imdone templates&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=185" rel="noopener noreferrer"&gt;03:05&lt;/a&gt; - Handling merge conflicts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=431" rel="noopener noreferrer"&gt;07:11&lt;/a&gt; - Claude implements with TDD&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=635" rel="noopener noreferrer"&gt;10:35&lt;/a&gt; - Teaching red-green-refactor&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=784" rel="noopener noreferrer"&gt;13:04&lt;/a&gt; - Tests failing (good!)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=808" rel="noopener noreferrer"&gt;13:28&lt;/a&gt; - Implementation passes tests&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1005" rel="noopener noreferrer"&gt;16:45&lt;/a&gt; - All tests green&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1140" rel="noopener noreferrer"&gt;19:00&lt;/a&gt; - Claude suggests more improvements&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1482" rel="noopener noreferrer"&gt;24:42&lt;/a&gt; - Manual testing success&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1576" rel="noopener noreferrer"&gt;26:16&lt;/a&gt; - Planning next release&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/Pz8KJA5KmvY?t=1686" rel="noopener noreferrer"&gt;28:06&lt;/a&gt; - Preview: favorites feature&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This post is part of my weekly context-driven development experiment series. Check out previous experiments and follow along as I explore better ways to build software with AI assistance.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>contextdrivendevelopment</category>
      <category>tdd</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>My 2026 resolution: stop picking Jira resolutions</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Wed, 31 Dec 2025 16:06:03 +0000</pubDate>
      <link>https://dev.to/imdone/my-2026-resolution-stop-picking-jira-resolutions-26ak</link>
      <guid>https://dev.to/imdone/my-2026-resolution-stop-picking-jira-resolutions-26ak</guid>
      <description>&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%2Fd5e32yk2c6ktkcomn8mw.jpeg" 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%2Fd5e32yk2c6ktkcomn8mw.jpeg" alt="meme: Jira when you transition to done. Pick a resolution!" width="689" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TL;DR: In Jira, &lt;strong&gt;Status&lt;/strong&gt; and &lt;strong&gt;Resolution&lt;/strong&gt; are different fields. Depending on your workflow, Jira may prompt you for a resolution… or it may not. That’s how teams end up with issues that are &lt;strong&gt;Done&lt;/strong&gt; but still &lt;strong&gt;Unresolved&lt;/strong&gt;. I shipped a small fix in &lt;strong&gt;imdone-cli 0.28.0&lt;/strong&gt; so moving to Done doesn’t require another decision.&lt;/p&gt;




&lt;p&gt;It’s amazing how many developer interruptions come from tiny “paper cut” fields.&lt;/p&gt;

&lt;p&gt;This one shows up right when you’re trying to wrap up work.&lt;/p&gt;

&lt;p&gt;You do the right thing: move the issue to &lt;strong&gt;Done&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And then… you’re suddenly staring at a drop-down asking you to pick a &lt;strong&gt;Resolution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Or worse: you &lt;em&gt;don’t&lt;/em&gt; get asked, you assume it’s fine, and later someone says “why is this still unresolved?”&lt;/p&gt;

&lt;p&gt;Same feeling either way: you were finishing the work, and Jira found one last way to pull you out of the zone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status vs Resolution (the thing nobody explains clearly)
&lt;/h2&gt;

&lt;p&gt;Jira separates two concepts that many teams treat like one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status&lt;/strong&gt;: where the issue is in the workflow (To Do → In Progress → Done)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution&lt;/strong&gt;: why the issue ended (Fixed, Won’t Fix, Duplicate, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means this state is totally possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;status = Done&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resolution = Unresolved&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it’s not just “cosmetic.” It leaks into dashboards, filters, and sometimes workflow rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The nuance: Jira doesn’t always prompt you
&lt;/h2&gt;

&lt;p&gt;This is where people talk past each other:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Jira always prompts you for a resolution.”&lt;br&gt;&lt;br&gt;
“No it doesn’t.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both can be true, because prompting is not a universal Jira behavior. It’s &lt;em&gt;workflow configuration&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In the wild you’ll find all three:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompting&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The transition screen includes a Resolution field, so Jira asks you to pick one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-setting&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A post-function or automation sets Resolution behind the scenes. No prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Not set at all&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No prompt, no automation, no post-function… and you end up Done + Unresolved.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you’ve got multiple projects, inherited workflows, or “just one tweak” done years ago, you can end up with inconsistent behavior across boards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters (even if you hate dashboards)
&lt;/h2&gt;

&lt;p&gt;This mismatch creates a bunch of low-grade pain:&lt;/p&gt;

&lt;h3&gt;
  
  
  1) “Resolved” reporting gets weird
&lt;/h3&gt;

&lt;p&gt;Some reports/gadgets treat “resolved” as “has a resolution,” not “is in Done.”&lt;/p&gt;

&lt;h3&gt;
  
  
  2) JQL starts lying to you
&lt;/h3&gt;

&lt;p&gt;People write filters like “show me unresolved issues,” and Done issues sneak in. Or you filter for Done work and a chunk is still “unresolved.”&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Transitions get blocked on some projects
&lt;/h3&gt;

&lt;p&gt;Some teams add validators that require resolution on the Done transition. Others don’t. So developers get different friction depending on which project they’re working in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick check: do you have “Done but Unresolved” issues?
&lt;/h2&gt;

&lt;p&gt;Try a query like this (tweak project key and status names):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project = PROJ AND statusCategory = Done AND resolution = Unresolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your instance doesn’t support &lt;code&gt;statusCategory&lt;/code&gt;, try something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project = PROJ AND status in (Done, Closed) AND resolution = Unresolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If either query returns results, you’ve got the footgun in your workflow somewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  How teams usually fix it (in Jira)
&lt;/h2&gt;

&lt;p&gt;The standard fixes are all admin-side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a &lt;strong&gt;post-function&lt;/strong&gt; to set Resolution on Done transitions&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;validator&lt;/strong&gt; requiring Resolution before the transition can complete&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;automation&lt;/strong&gt;: “when status category becomes Done, set resolution (if empty)”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those can work great.&lt;/p&gt;

&lt;p&gt;But they also tend to fail in the exact way “paper cuts” fail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it’s different per project&lt;/li&gt;
&lt;li&gt;it’s easy to forget which workflows have what&lt;/li&gt;
&lt;li&gt;it requires admin attention&lt;/li&gt;
&lt;li&gt;edge cases happen and you’re back to manual cleanup&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scratching an itch (the developer-side fix)
&lt;/h2&gt;

&lt;p&gt;So here’s the thing: the path developers use the most should be the path that’s hardest to mess up.&lt;/p&gt;

&lt;p&gt;Moving an issue to Done is a “closing ritual.” It should be quick, consistent, and not require one more decision unless you explicitly want it.&lt;/p&gt;

&lt;p&gt;That’s what I shipped in &lt;strong&gt;imdone-cli 0.28.0&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What changed in 0.28.0
&lt;/h3&gt;

&lt;p&gt;When you move an issue into a &lt;strong&gt;Done status category&lt;/strong&gt;, imdone-cli will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automatically set &lt;strong&gt;Resolution = "Done"&lt;/strong&gt; &lt;em&gt;if&lt;/em&gt; the issue has no resolution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;never overwrite&lt;/strong&gt; an existing resolution&lt;/li&gt;
&lt;li&gt;stay &lt;strong&gt;non-blocking&lt;/strong&gt;: the move succeeds even if resolution setting fails&lt;/li&gt;
&lt;li&gt;only attempt this when moving to a status in the &lt;strong&gt;Done&lt;/strong&gt; category&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: &lt;em&gt;move it to Done and keep coding.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Default behavior (automatic)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone move PROJ-123 Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set a specific resolution
&lt;/h3&gt;

&lt;p&gt;Sometimes you do want to be explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone move PROJ-123 Done &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"Fixed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Skip resolution entirely
&lt;/h3&gt;

&lt;p&gt;If your Jira workflow already handles it, or you want to leave it alone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone move PROJ-123 Done &lt;span class="nt"&gt;--no-resolution&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prompt me (interactive)
&lt;/h3&gt;

&lt;p&gt;If you want a choice, make it a choice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imdone move PROJ-123 Done &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interactive mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetches available resolutions from the Jira API (with descriptions)&lt;/li&gt;
&lt;li&gt;includes a &lt;strong&gt;Skip&lt;/strong&gt; option&lt;/li&gt;
&lt;li&gt;falls back to common resolutions if the API call fails&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real point: fewer interruptions
&lt;/h2&gt;

&lt;p&gt;This isn’t about being “more compliant with Jira.”&lt;/p&gt;

&lt;p&gt;It’s about removing one of those tiny context switches that happen right at the end of a work loop.&lt;/p&gt;

&lt;p&gt;If your Jira already prompts or auto-sets resolution, great. But if you’ve ever been bitten by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“why is this still unresolved?”&lt;/li&gt;
&lt;li&gt;“why didn’t that chart move?”&lt;/li&gt;
&lt;li&gt;“why did this transition fail on this project but not that one?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…this is a small, practical way to make “Done” mean what developers think it means.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question for you
&lt;/h2&gt;

&lt;p&gt;On your team, does Jira:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;prompt for resolution
&lt;/li&gt;
&lt;li&gt;auto-set it
&lt;/li&gt;
&lt;li&gt;or ignore it entirely?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m genuinely curious how common each setup is across real teams.&lt;/p&gt;




&lt;p&gt;Docs for the &lt;code&gt;move&lt;/code&gt; command (all options + details):&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/imdone-cli#user-content-move--move-issue-to-new-status" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/imdone-cli#user-content-move--move-issue-to-new-status&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jira</category>
      <category>productivity</category>
      <category>cli</category>
      <category>devex</category>
    </item>
    <item>
      <title>It's in Jira. Somewhere.</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Tue, 16 Dec 2025 02:30:48 +0000</pubDate>
      <link>https://dev.to/imdone/its-in-jira-somewhere-53h7</link>
      <guid>https://dev.to/imdone/its-in-jira-somewhere-53h7</guid>
      <description>&lt;p&gt;4:45pm Friday.&lt;/p&gt;

&lt;p&gt;You need that screenshot from three weeks ago.&lt;/p&gt;

&lt;p&gt;It's in Jira. Somewhere.&lt;/p&gt;

&lt;p&gt;You open 6 tabs.&lt;br&gt;
Check 4 different projects.&lt;br&gt;
Scroll through 20 comments.&lt;br&gt;
Download 3 files to check which one it is.&lt;/p&gt;

&lt;p&gt;15 minutes later, you finally find it.&lt;/p&gt;

&lt;p&gt;By then, you've forgotten why you needed it.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;




&lt;p&gt;What's your record for "time spent hunting for a thing you KNOW exists in Jira"?&lt;/p&gt;

</description>
      <category>jira</category>
      <category>contextdrivendevlopment</category>
      <category>devex</category>
      <category>agile</category>
    </item>
    <item>
      <title>Lab Notes: What I Learned Dropping Imdone’s Price for a Week</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Thu, 11 Dec 2025 13:37:29 +0000</pubDate>
      <link>https://dev.to/imdone/lab-notes-what-i-learned-dropping-imdones-price-for-a-week-543l</link>
      <guid>https://dev.to/imdone/lab-notes-what-i-learned-dropping-imdones-price-for-a-week-543l</guid>
      <description>&lt;p&gt;Last week I ran a small pricing experiment for imdone-cli and imdone desktop and told my list I’d share the results.&lt;/p&gt;

&lt;p&gt;These are the lab notes.&lt;/p&gt;

&lt;p&gt;If you just want the punchline:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dropping the solo price from $18 to $9 helped, but the real problems are messaging and onboarding, not just dollars.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The hypothesis
&lt;/h2&gt;

&lt;p&gt;Quick recap: imdone-cli and imdone desktop let you work with Jira issues as markdown files in your repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull issues, comments, and attachments into your project
&lt;/li&gt;
&lt;li&gt;Edit them in your editor or terminal
&lt;/li&gt;
&lt;li&gt;Push changes back to Jira
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core idea is: &lt;strong&gt;“Work Jira like code.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before the experiment, the price for individuals was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$18/user/month&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signals I was seeing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A steady trickle of pricing page visits
&lt;/li&gt;
&lt;li&gt;Almost &lt;strong&gt;no&lt;/strong&gt; conversions at $18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the hypothesis was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If I cut the solo price in half, do more individual developers actually pull the trigger?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The experiment setup
&lt;/h2&gt;

&lt;p&gt;For one week I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dropped the &lt;strong&gt;personal&lt;/strong&gt; price from &lt;strong&gt;$18 → $9/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Left &lt;strong&gt;team pricing&lt;/strong&gt; at &lt;strong&gt;$18/user/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Kept the homepage mostly the same so I didn’t change too many variables at once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only intentional change at the decision point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You can get this for $9/month as a solo developer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No coupons, no bundles, no big launch. Just a price change.&lt;/p&gt;




&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;p&gt;In the first ~24 hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2 new paying customers&lt;/strong&gt; signed up at $9/mo
&lt;/li&gt;
&lt;li&gt;That was more movement than I’d seen in the entire previous month at $18
&lt;/li&gt;
&lt;li&gt;Traffic looked similar; behavior at the &lt;strong&gt;point of decision&lt;/strong&gt; changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Price &lt;strong&gt;did&lt;/strong&gt; matter for solo devs
&lt;/li&gt;
&lt;li&gt;But lowering it didn’t suddenly unlock a huge wave of adoption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was enough signal to make decisions, not enough to declare “pricing solved everything.”&lt;/p&gt;




&lt;h2&gt;
  
  
  What I’m keeping (and what I’m not touching)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ $9/month stays as the Personal License
&lt;/h3&gt;

&lt;p&gt;The experiment confirmed what I suspected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual devs are more price sensitive
&lt;/li&gt;
&lt;li&gt;$18/mo feels like “team tool” pricing
&lt;/li&gt;
&lt;li&gt;$9/mo feels like “personal workflow upgrade” territory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So &lt;strong&gt;$9/month&lt;/strong&gt; stays as the personal plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ $18/user/month stays for teams
&lt;/h3&gt;

&lt;p&gt;Teams behaved differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existing team customers haven’t pushed back on $18
&lt;/li&gt;
&lt;li&gt;They see imdone as DevEx / workflow infrastructure
&lt;/li&gt;
&lt;li&gt;They care more about context and time than a few extra dollars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The experiment didn’t touch team pricing, and I’m not going to “race to the bottom” there.&lt;/p&gt;

&lt;p&gt;So &lt;strong&gt;$18/user/month&lt;/strong&gt; stays for teams.&lt;/p&gt;

&lt;p&gt;Solo and team are now deliberately priced as two different markets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the real bottleneck is
&lt;/h2&gt;

&lt;p&gt;If you drop the price and don’t see a flood of new users, it usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People don’t fully understand what the product actually &lt;em&gt;does&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;It’s hard to picture how it fits into their current workflow
&lt;/li&gt;
&lt;li&gt;First-time setup feels heavy or risky
&lt;/li&gt;
&lt;li&gt;Time-to-first-value is too long&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s what this experiment exposed.&lt;/p&gt;

&lt;p&gt;So my next focus is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tightening the homepage copy around the core idea:
&lt;strong&gt;“Your backlog lives in your repo, not your browser.”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Making it easier to go from “curious” → “first Jira pull into markdown”
&lt;/li&gt;
&lt;li&gt;Smoothing out docs and defaults so setup feels safe and fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Price was friction, but not &lt;em&gt;the&lt;/em&gt; friction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Takeaways if you’re building dev tools
&lt;/h2&gt;

&lt;p&gt;A few lessons I’d pass on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You don’t need a huge experiment to learn something.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One week and one variable was enough to get real signal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Price is rarely the final boss.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dropping from $18 to $9 helped solo devs, but it didn’t magically fix adoption. It just revealed the next constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Solo devs and teams really are different markets.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One feels $9 vs $18 personally; the other feels “how much context and time are we wasting?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you call it an experiment, close the loop.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sharing what happened builds more trust than silently changing a number in Stripe.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  If you’re curious about imdone
&lt;/h2&gt;

&lt;p&gt;If you’re a solo dev who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lives in Jira all day
&lt;/li&gt;
&lt;li&gt;keeps losing context between browser and editor
&lt;/li&gt;
&lt;li&gt;wants screenshots, comments, and “why we did this” next to the code
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…the &lt;strong&gt;$9/month personal plan&lt;/strong&gt; is now the default.&lt;/p&gt;

&lt;p&gt;If you’re on a team and want to pilot this with a few developers, that’s where &lt;strong&gt;team pricing&lt;/strong&gt; comes in — and that’s usually where the biggest impact shows up.&lt;/p&gt;

&lt;p&gt;If you’ve tried imdone and hit friction, I’d genuinely love to hear what slowed you down. That’s exactly what I’m working on next.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://imdone.io/plans" rel="noopener noreferrer"&gt;https://imdone.io/plans&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jira</category>
      <category>productivity</category>
      <category>workflow</category>
      <category>saas</category>
    </item>
    <item>
      <title>Early Access Pricing for imdone-cli &amp; Desktop (Developer Pricing Experiment)</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Tue, 25 Nov 2025 04:56:25 +0000</pubDate>
      <link>https://dev.to/imdone/early-access-pricing-for-imdone-cli-desktop-developer-pricing-experiment-4eic</link>
      <guid>https://dev.to/imdone/early-access-pricing-for-imdone-cli-desktop-developer-pricing-experiment-4eic</guid>
      <description>&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%2F1n625p0sfpiqsq35xwmn.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%2F1n625p0sfpiqsq35xwmn.png" alt="Test tubes with price bubbles floating out" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey folks 👋 — short post.&lt;/p&gt;

&lt;p&gt;I've been working on imdone-cli and imdone desktop, workflow tools that let you manage Jira issues as markdown files directly in your project repo.&lt;/p&gt;

&lt;p&gt;A lot of developers have checked out the pricing page lately, but no one was converting at the $18/month price point. Some have tried the free plan but hit the wall when they need attachments and comments — that's where the real context lives.&lt;/p&gt;

&lt;p&gt;So I'm running a very short &lt;strong&gt;pricing experiment&lt;/strong&gt; starting December 1st for one week:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$9/month for single developers&lt;/strong&gt; (normally $18)&lt;/p&gt;

&lt;p&gt;Same features. Same workflow. Full access to attachments, comments, and everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  What problem does this solve?
&lt;/h2&gt;

&lt;p&gt;Ever lose 20 minutes hunting for that Jira comment that explained &lt;em&gt;why&lt;/em&gt; something was built a certain way?&lt;/p&gt;

&lt;p&gt;Or spend half your sprint context-switching between your IDE, browser tabs, and Jira just to understand what you're supposed to be working on?&lt;/p&gt;

&lt;p&gt;That fragmented context kills momentum.&lt;/p&gt;

&lt;p&gt;imdone-cli and imdone desktop help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build with clear, de-fragmented context — everything in one place&lt;/li&gt;
&lt;li&gt;Work with Jira issues as markdown files in your repo&lt;/li&gt;
&lt;li&gt;Keep story context, attachments, and comments right where you code&lt;/li&gt;
&lt;li&gt;Stop bouncing between browser tabs and your IDE&lt;/li&gt;
&lt;li&gt;"Work Jira like Git" — push, pull, diff and merge&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why am I doing this?
&lt;/h2&gt;

&lt;p&gt;Honestly, I want to understand if pricing is the barrier or if there's something else I need to fix. This experiment will help me figure that out.&lt;/p&gt;

&lt;p&gt;If you work with Jira every day and want to keep context closer to your code, this might be useful.&lt;/p&gt;

&lt;p&gt;No pressure. Just sharing the experiment.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://imdone.io/plans" rel="noopener noreferrer"&gt;https://imdone.io/plans&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've tried imdone-cli or imdone desktop, I'd love to hear what worked — and what didn't. Drop a comment or reach out directly.&lt;/p&gt;

</description>
      <category>jira</category>
      <category>productivity</category>
      <category>devex</category>
      <category>contextdrivendevelopment</category>
    </item>
    <item>
      <title>Context-Driven Development Experiment 3: Building Multi-Project JIRA Support with Claude Code</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Tue, 18 Nov 2025 12:37:26 +0000</pubDate>
      <link>https://dev.to/imdone/context-driven-development-experiment-3-building-multi-project-jira-support-with-claude-code-1gdm</link>
      <guid>https://dev.to/imdone/context-driven-development-experiment-3-building-multi-project-jira-support-with-claude-code-1gdm</guid>
      <description>&lt;p&gt;Every week, I run small experiments with context-driven development (CDD), AI tools, and &lt;a href="https://imdone.io" rel="noopener noreferrer"&gt;imdone&lt;/a&gt; - a tool I built that keeps your backlog right in your source code so you never lose context.&lt;/p&gt;

&lt;p&gt;This week, I'm putting &lt;strong&gt;Claude Code&lt;/strong&gt; to the test on a real-world feature: allowing developers to select which JIRA project to add issues to when using imdone-cli.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/bBy7PTb63f4"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Feature Matters
&lt;/h2&gt;

&lt;p&gt;On my team, we constantly juggle multiple JIRA projects. We have our main development project, but we also need to create tickets for the infrastructure team, file bugs in different projects, and coordinate across team boundaries.&lt;/p&gt;

&lt;p&gt;Previously, switching between projects meant manually editing configuration files or working around limitations. This new feature eliminates that friction, making cross-team collaboration smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Context-Driven Development Approach
&lt;/h2&gt;

&lt;p&gt;The key to working effectively with AI coding assistants is giving them the right context. Here's how I structured the task:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Define the Goal Clearly
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: When a user runs &lt;code&gt;imdone add&lt;/code&gt;, they can choose which project to add the new issue to.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Specify Constraints
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prompt for project key on &lt;code&gt;imdone add&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Allow &lt;code&gt;--project-key&lt;/code&gt; option for command-line usage&lt;/li&gt;
&lt;li&gt;Use Test-Driven Development (TDD)&lt;/li&gt;
&lt;li&gt;Ensure all existing tests continue to pass&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Provide Relevant Files
&lt;/h3&gt;

&lt;p&gt;I included the key files Claude Code would need to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bin.mjs&lt;/code&gt; - Where CLI commands start&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;add-issue.js&lt;/code&gt; - The use case implementation&lt;/li&gt;
&lt;li&gt;Existing tests to understand the testing patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This context allowed Claude Code to understand not just what to build, but how to build it within the existing architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Development Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=23" rel="noopener noreferrer"&gt;00:23&lt;/a&gt; - Getting Started with Claude Code
&lt;/h3&gt;

&lt;p&gt;I started by opening the task in my backlog (stored as markdown in my source code) and asking Claude Code to complete it. The first challenge? Claude Code couldn't initially see my backlog folder because it was in a separate git repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned&lt;/strong&gt;: Be explicit with file paths when working across repository boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=362" rel="noopener noreferrer"&gt;06:02&lt;/a&gt; - Claude Code Begins Implementation
&lt;/h3&gt;

&lt;p&gt;Once Claude Code had the context, it immediately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzed the existing code structure&lt;/li&gt;
&lt;li&gt;Found the test folder&lt;/li&gt;
&lt;li&gt;Started implementing tests using TDD&lt;/li&gt;
&lt;li&gt;Added the &lt;code&gt;--project-key&lt;/code&gt; CLI option&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Watching it work was fascinating - it understood the patterns in my codebase and followed them consistently.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=545" rel="noopener noreferrer"&gt;09:05&lt;/a&gt; - First Test Runs and Debugging
&lt;/h3&gt;

&lt;p&gt;The first test run revealed some issues with the test setup. Claude Code needed a few iterations to get the mocking correct for the &lt;code&gt;inquirer&lt;/code&gt; prompts. This is where AI-assisted development gets interesting - it's not magic, but it's a productive back-and-forth.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=840" rel="noopener noreferrer"&gt;14:00&lt;/a&gt; - Code Review
&lt;/h3&gt;

&lt;p&gt;While Claude Code worked, I reviewed the implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The new project key selection flow&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;projectKeyOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jiraAdapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;projectKeys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;selectedProjectKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projectKey&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;projectKeyOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;promptForProjectKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;projectKeyOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;projectKeyOptions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean, logical, and it handled multiple scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explicit &lt;code&gt;--project-key&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;Interactive prompt when multiple projects exist&lt;/li&gt;
&lt;li&gt;Default to single project if only one is configured&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=1118" rel="noopener noreferrer"&gt;18:38&lt;/a&gt; - All Tests Passing!
&lt;/h3&gt;

&lt;p&gt;After a few iterations, all 14 tests passed. This is where TDD really shines - we had confidence that the new feature didn't break existing functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=1210" rel="noopener noreferrer"&gt;20:10&lt;/a&gt; - Manual Testing
&lt;/h3&gt;

&lt;p&gt;I built and linked the CLI locally to test the real user experience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npm &lt;span class="nb"&gt;link
&lt;/span&gt;imdone add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interactive prompt appeared, showing both my SCRUM and DEMO projects. I selected DEMO, chose "Story" as the issue type, and created a test issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It worked!&lt;/strong&gt; The issue was created in the correct project with the proper template applied.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=1431" rel="noopener noreferrer"&gt;23:51&lt;/a&gt; - Discovering an Edge Case
&lt;/h3&gt;

&lt;p&gt;During testing, I noticed that sprint selection wasn't working correctly for the secondary project. The root cause? The &lt;code&gt;getActiveSprints()&lt;/code&gt; function was joining all project keys with a comma instead of filtering by the selected project.&lt;/p&gt;

&lt;p&gt;This is a great example of why manual testing matters - even with comprehensive unit tests, edge cases emerge in real usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://youtu.be/bBy7PTb63f4?t=1620" rel="noopener noreferrer"&gt;27:00&lt;/a&gt; - Real-World Challenges
&lt;/h3&gt;

&lt;p&gt;Just as I was about to have Claude Code fix the edge case, I hit the credit limit. This is a real constraint when using paid AI services - you need to budget for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Worked Well
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context-Driven Structure&lt;/strong&gt;: By defining goals, constraints, and relevant files upfront, Claude Code had everything it needed to succeed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TDD Approach&lt;/strong&gt;: Having tests as guardrails meant we could iterate confidently without breaking existing functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Quality&lt;/strong&gt;: Claude Code followed existing patterns and wrote clean, readable code that fit naturally into the codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Challenges and Limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup Friction&lt;/strong&gt;: Initial path issues and repository boundaries required manual intervention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edge Cases&lt;/strong&gt;: The AI implemented the happy path well, but edge cases still required human discovery and iteration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost Considerations&lt;/strong&gt;: Running out of credits mid-task is a real concern with usage-based pricing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  When to Use AI Assistants
&lt;/h3&gt;

&lt;p&gt;AI coding assistants like Claude Code excel at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementing well-defined features&lt;/li&gt;
&lt;li&gt;Following existing patterns&lt;/li&gt;
&lt;li&gt;Writing comprehensive tests&lt;/li&gt;
&lt;li&gt;Handling boilerplate and setup code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ambiguous requirements&lt;/li&gt;
&lt;li&gt;Complex architectural decisions&lt;/li&gt;
&lt;li&gt;Edge cases that require domain knowledge&lt;/li&gt;
&lt;li&gt;Understanding cross-repository dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bigger Picture: Context-Driven Development
&lt;/h2&gt;

&lt;p&gt;This experiment reinforces my belief in keeping context close to code. By storing my backlog as markdown files in my repository, I can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quickly provide context&lt;/strong&gt; to AI assistants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never lose track&lt;/strong&gt; of why decisions were made&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link tasks directly&lt;/strong&gt; to the code they affect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version control everything&lt;/strong&gt; - requirements, code, and tests together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what imdone enables, and it's why I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Want to experiment with this workflow?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install imdone-cli&lt;/strong&gt;: &lt;code&gt;npm install -g imdone-cli&lt;/code&gt; (multi-project support is available in v0.27.0 and later)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check out &lt;a href="https://docs.anthropic.com/en/docs/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;&lt;/strong&gt; (requires Anthropic API access)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure your tasks&lt;/strong&gt; with goals, constraints, and file references&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate and learn&lt;/strong&gt; - every experiment teaches you something new&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I'll continue with Claude Code to fix the sprint selection edge case. The structure and approach are solid - it's just a matter of adding one more constraint and letting it iterate.&lt;/p&gt;

&lt;p&gt;Next week, I'll run another experiment. Maybe I'll compare different AI assistants, or dive deeper into a complex refactoring challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Conversation
&lt;/h2&gt;

&lt;p&gt;Have you used Claude Code or other AI coding assistants? What's worked well for you? What challenges have you faced?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drop a comment below&lt;/strong&gt; with your experiences - I'm especially interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How you structure tasks for AI assistants&lt;/li&gt;
&lt;li&gt;Patterns you've discovered for effective AI collaboration&lt;/li&gt;
&lt;li&gt;Edge cases or limitations you've encountered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you found this useful, &lt;strong&gt;give it a ❤️&lt;/strong&gt; and &lt;strong&gt;follow me&lt;/strong&gt; for weekly experiments at the intersection of AI, development workflows, and better tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Timeline
&lt;/h2&gt;

&lt;p&gt;Jump to specific sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=0" rel="noopener noreferrer"&gt;00:00&lt;/a&gt; - Introduction to weekly CDD experiments&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=23" rel="noopener noreferrer"&gt;00:23&lt;/a&gt; - Starting with Claude Code and defining the task&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=182" rel="noopener noreferrer"&gt;03:02&lt;/a&gt; - Setting up the context and files&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=362" rel="noopener noreferrer"&gt;06:02&lt;/a&gt; - Claude Code begins TDD implementation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=545" rel="noopener noreferrer"&gt;09:05&lt;/a&gt; - First test runs and debugging&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=840" rel="noopener noreferrer"&gt;14:00&lt;/a&gt; - Code review: how Claude implemented the feature&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1118" rel="noopener noreferrer"&gt;18:38&lt;/a&gt; - All tests passing!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1140" rel="noopener noreferrer"&gt;19:00&lt;/a&gt; - Building and linking for manual testing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1210" rel="noopener noreferrer"&gt;20:10&lt;/a&gt; - Live demo: selecting projects with the new feature&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1316" rel="noopener noreferrer"&gt;21:56&lt;/a&gt; - Success! Creating issues in different projects&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1431" rel="noopener noreferrer"&gt;23:51&lt;/a&gt; - Discovering edge case with sprint selection&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1620" rel="noopener noreferrer"&gt;27:00&lt;/a&gt; - Running into credit limits (real challenges)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBy7PTb63f4?t=1680" rel="noopener noreferrer"&gt;28:00&lt;/a&gt; - Reflection and next steps&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This post is part of my weekly context-driven development experiment series. Check out previous experiments and follow along as I explore better ways to build software with AI assistance.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>jira</category>
      <category>contextdrivendevelopment</category>
    </item>
    <item>
      <title>Why Developers Hate Jira (and What We're Doing About It)</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Fri, 14 Nov 2025 21:25:48 +0000</pubDate>
      <link>https://dev.to/imdone/why-developers-hate-jira-and-what-were-doing-about-it-1h06</link>
      <guid>https://dev.to/imdone/why-developers-hate-jira-and-what-were-doing-about-it-1h06</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"I was recently talking to a very experienced, very senior person in game development and I asked them, 'How would you make all of game development better?' and they said 'delete every Jira instance across gamedev.'" — Benjamin Carcich&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem: Tools That Should Serve Us Become Our Masters
&lt;/h2&gt;

&lt;p&gt;I recently watched &lt;a href="https://www.youtube.com/watch?v=p9XLp9x0ORY" rel="noopener noreferrer"&gt;@buildingbettergames' video "Why Jira Hurts Game Studios"&lt;/a&gt; and it perfectly captures what I've seen across 25+ years in development. The patterns mentioned in this video, play out everywhere Jira becomes the master instead of the servant.&lt;/p&gt;

&lt;p&gt;A senior producer once said he could track team progress by watching tickets move in Jira. He could tell who was doing well, which projects were on track, just by looking at the dashboard.&lt;/p&gt;

&lt;p&gt;The reality? It wasn't true.&lt;/p&gt;

&lt;p&gt;As teams realized they were being watched through Jira, something predictable happened. They started optimizing for Jira instead of optimizing for building great software. They contorted their behavior to make the tickets look good. They gamed velocity metrics. They spent hours feeding the beast instead of shipping value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Players don't care how many tickets you closed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But when management treats Jira as reality instead of a model of reality, teams have no choice. The tool that should serve development has become the master we all serve.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 The Cost of Context Switching
&lt;/h2&gt;

&lt;p&gt;Research from UC Irvine found that it takes an average of &lt;strong&gt;23 minutes and 15 seconds&lt;/strong&gt; to regain focus after an interruption.&lt;/p&gt;

&lt;p&gt;Think about your workflow: You're deep in code, holding a complex mental model—variable relationships, edge cases, that elegant solution forming in your head. Then you need to check a story detail. Browser. Navigation. Search. Login again. Find the ticket. Read through comments formatted in someone's custom workflow.&lt;/p&gt;

&lt;p&gt;By the time you're back in your editor, it's gone. All of it. That's not a 2-minute interruption. That's 23+ minutes to rebuild the mental context you just lost.&lt;/p&gt;

&lt;p&gt;Multiply this by every Jira check during your day. How much time are you actually coding?&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 What Developers Are Saying
&lt;/h2&gt;

&lt;p&gt;The frustration cuts across every development community:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Managers mess around with workflows and custom fields that infuriate all the developers" — &lt;a href="https://news.ycombinator.com/item?id=17596293" rel="noopener noreferrer"&gt;HackerNews discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"As a developer or team member, it sucks to deal with a complex interface just to move your task from ToDo =&amp;gt; In Progress." — &lt;a href="https://news.ycombinator.com/item?id=26343920" rel="noopener noreferrer"&gt;HackerNews discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"I find a simple text file outline like this is so much more convenient than say an app or a web UI." — &lt;a href="https://hn.algolia.com/api/v1/search?query=jira%20markdown%20simple&amp;amp;tags=comment" rel="noopener noreferrer"&gt;HackerNews comment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Planning is hard. These tools throw a big backlog at you and grooming/planning is incredibly frustrating." — &lt;a href="https://news.ycombinator.com/item?id=26343920" rel="noopener noreferrer"&gt;HackerNews discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Organizations tend to add way too many custom fields and tags so that doing anything requires entering data into a massive form" — &lt;a href="https://news.ycombinator.com/item?id=17596293" rel="noopener noreferrer"&gt;HackerNews discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"I ended up with a very simple system: a markdown journal for what I do every day." — &lt;a href="https://hn.algolia.com/api/v1/search?query=jira%20markdown%20simple&amp;amp;tags=comment" rel="noopener noreferrer"&gt;HackerNews comment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Tell me how you'll measure me and I'll tell you how I'll behave." — Eliyahu Goldratt&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you measure developers by ticket velocity, you get ticket velocity. You don't get ownership. You don't get collaboration. You don't get people helping teammates with the most important work because they're afraid their individual metrics will look bad.&lt;/p&gt;

&lt;p&gt;You get people gaming the system instead of building great software.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Developer's Case for Markdown
&lt;/h2&gt;

&lt;p&gt;Developers gravitate toward markdown for the same reason we prefer grep over GUI search: it's built for how we actually think and work.&lt;/p&gt;

&lt;p&gt;When story work lives as markdown files in your repository, everything changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version controlled&lt;/strong&gt; — Changes are tracked, diffed, reviewed, and merged like code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight&lt;/strong&gt; — No browser tabs, no loading spinners, no authentication timeouts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context-local&lt;/strong&gt; — Requirements live next to the code they describe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor native&lt;/strong&gt; — Work in vim, VS Code, or whatever makes you productive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searchable&lt;/strong&gt; — grep works. Your editor's search works. No special query language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt; — Text files work everywhere, on every platform, forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need to check a story detail? It's in the file next to your code. Want to update task status? Edit and commit. Need to see what changed in requirements? &lt;code&gt;git diff&lt;/code&gt; shows you instantly.&lt;/p&gt;

&lt;p&gt;The context switch from "coding" to "checking requirements" drops to zero. You stay in flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 What We're Doing About It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Imdone CLI&lt;/strong&gt; and &lt;strong&gt;Imdone Desktop&lt;/strong&gt; let you work the way you want while keeping stakeholders happy.&lt;/p&gt;

&lt;p&gt;Story work lives as markdown files in your repository, bi-directionally synced with Jira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jira issues become markdown files&lt;/strong&gt; — Full content, comments, attachments, all version controlled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bi-directional sync&lt;/strong&gt; — Changes flow both ways automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git workflow&lt;/strong&gt; — Your backlog changes are reviewed and merged like code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero context switching&lt;/strong&gt; — Check stories, update status, add comments—all from your editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team collaboration&lt;/strong&gt; — Pair and mob without fighting over browser windows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Management still gets their Jira dashboards and stakeholder visibility. You get to work like a developer instead of a data entry clerk.&lt;/p&gt;

&lt;p&gt;The tool serves you. Not the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Developers Deserve Better
&lt;/h2&gt;

&lt;p&gt;You didn't become a developer to spend your day clicking through web forms and updating ticket statuses.&lt;/p&gt;

&lt;p&gt;You became a developer to build things that matter. To solve hard problems. To create value.&lt;/p&gt;

&lt;p&gt;Your workflow shouldn't be dictated by a tool optimized for middle management dashboards. Your requirements shouldn't live in a system designed to generate reports, not to support building software.&lt;/p&gt;

&lt;p&gt;Stop serving Jira. Make it serve you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://imdone.io" rel="noopener noreferrer"&gt;Try Imdone →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>agile</category>
      <category>contextdrivendevelopment</category>
    </item>
    <item>
      <title>Context-Driven Development: How I Fixed a Real Bug in imdone-cli Using Structured AI Collaboration</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Mon, 10 Nov 2025 02:06:49 +0000</pubDate>
      <link>https://dev.to/imdone/context-driven-development-how-ai-fixed-image-rendering-in-jira-integration-148n</link>
      <guid>https://dev.to/imdone/context-driven-development-how-ai-fixed-image-rendering-in-jira-integration-148n</guid>
      <description>&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/q10YQpnBjrk"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;As developers, we've all been there – you're working on a feature, an AI assistant helps you implement it, but then your teammate has no idea what happened or why certain decisions were made. The context is lost, the AI interaction history is gone, and your team is left to reverse-engineer the thought process.&lt;/p&gt;

&lt;p&gt;This is the exact problem I set out to solve in my latest experiment with &lt;strong&gt;context-driven development&lt;/strong&gt;, and the results led to a real fix in imdone 0.26.0 that improves how images render when syncing markdown content to Jira.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Context Gets Lost
&lt;/h2&gt;

&lt;p&gt;In my weekly experiments with imdone (a tool that keeps your backlog directly in your source code), I noticed a recurring issue: when one team member works with AI to solve a problem, the context and reasoning behind that collaboration doesn't get passed to other humans on the team.&lt;/p&gt;

&lt;p&gt;But there was also a technical problem to solve: images embedded in markdown list items weren't rendering properly when synced to Jira. When you had content like this:&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="p"&gt;-&lt;/span&gt; Here's a bullet point with an image !&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;my-profile&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./my-profile-image.jpeg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jira wouldn't display the image correctly because it doesn't handle images that appear directly in list items.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Structured Context Format
&lt;/h2&gt;

&lt;p&gt;I developed a structured markdown format for AI collaboration that ensures context is preserved and shareable across the team. Every task follows this format:&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="p"&gt;-&lt;/span&gt; [ ] &lt;span class="c"&gt;&amp;lt;!-- Task title --&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;    -&lt;/span&gt; files: 
&lt;span class="p"&gt;        -&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;&amp;lt;file description&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;file path&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;        -&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;&amp;lt;file description&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;file path&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;    -&lt;/span&gt; goal: &lt;span class="c"&gt;&amp;lt;!-- what the change achieves --&amp;gt;&lt;/span&gt;  
&lt;span class="p"&gt;    -&lt;/span&gt; constraints:
&lt;span class="p"&gt;        -&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- constraint 1 --&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;        -&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- constraint 2 --&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;    -&lt;/span&gt; action: apply patch and show diffs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Files&lt;/strong&gt;: Explicitly lists which files are relevant, giving both AI and humans clear scope&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal&lt;/strong&gt;: States what the change should achieve in plain language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constraints&lt;/strong&gt;: Sets boundaries and requirements upfront&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: Defines the expected deliverable&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real-World Application: Fixing Image Rendering
&lt;/h2&gt;

&lt;p&gt;Using this format, I tackled the image rendering issue. Here's how the task was structured:&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="p"&gt;-&lt;/span&gt; [ ] Fix image translation from markdown to JIRA and bullet items
&lt;span class="p"&gt;    -&lt;/span&gt; files: 
&lt;span class="p"&gt;        -&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;markdown parser&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;cli-package/src/parsers/markdown-parser.js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;        -&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;JIRA generator&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;cli-package/src/adapters/jira-generator.js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;    -&lt;/span&gt; goal: If an image appears on a line of markdown that is an ordered or unordered list item, place it on a new line so JIRA renders it properly
&lt;span class="p"&gt;    -&lt;/span&gt; constraints:
&lt;span class="p"&gt;        -&lt;/span&gt; Write good tests to cover this case
&lt;span class="p"&gt;        -&lt;/span&gt; Don't break existing image rendering in other contexts
&lt;span class="p"&gt;    -&lt;/span&gt; action: apply patch and show diffs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The AI Collaboration Process
&lt;/h2&gt;

&lt;p&gt;With this structured context, I simply told GitHub Copilot to "complete the task on line 28." The AI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Understood the scope&lt;/strong&gt; by reading the specified files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implemented test-driven development&lt;/strong&gt; by writing failing tests first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Created the solution&lt;/strong&gt; that moved images to new lines when they follow list items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintained backward compatibility&lt;/strong&gt; as specified in constraints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: by providing structured context, the AI could work more effectively AND any teammate could understand exactly what was being attempted and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results: imdone 0.26.0
&lt;/h2&gt;

&lt;p&gt;The fix successfully made it into imdone 0.26.0. Now when you have markdown content with images in list items, the sync process automatically moves images to separate lines, ensuring they render properly in Jira:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before (broken in Jira):&lt;/strong&gt;&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="p"&gt;-&lt;/span&gt; Here's a bullet point with an image !&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./image.jpeg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After (renders correctly in Jira):&lt;/strong&gt;&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="p"&gt;-&lt;/span&gt; Here's a bullet point with an image 
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./image.jpeg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Structure Enables Better AI Collaboration
&lt;/h3&gt;

&lt;p&gt;By providing files, goals, constraints, and expected actions upfront, AI assistants can work more effectively and deliver more predictable results.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context Preservation is Critical for Teams
&lt;/h3&gt;

&lt;p&gt;When AI interactions are structured and documented, teammates can understand not just what changed, but why and how decisions were made.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Experiments Drive Real Improvements
&lt;/h3&gt;

&lt;p&gt;Treating every feature as an experiment means you're always learning and improving. This "failed" interaction (there were some terminal issues during the process) still produced a working solution that benefits users.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep Context Close to Code
&lt;/h3&gt;

&lt;p&gt;By storing these structured tasks in the same repository as the code (in our case, in a git-ignored &lt;code&gt;backlog/&lt;/code&gt; directory), context stays accessible without cluttering the main codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy: Features as Experiments
&lt;/h2&gt;

&lt;p&gt;Every feature addition is really an experiment – you never know if it will truly benefit users until it's in their hands. By treating development this way and tracking context systematically, we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make more informed decisions about what to build next&lt;/li&gt;
&lt;li&gt;Learn from both successes and failures&lt;/li&gt;
&lt;li&gt;Maintain better team alignment on goals and approaches&lt;/li&gt;
&lt;li&gt;Iterate more effectively based on user feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;The structured context format I use is simple enough to adopt in any project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create tasks with explicit file lists, goals, and constraints&lt;/li&gt;
&lt;li&gt;Store context where your team can access it (we use a git-ignored backlog directory)&lt;/li&gt;
&lt;li&gt;Use the format consistently when working with AI assistants&lt;/li&gt;
&lt;li&gt;Review and approve all AI-generated changes before merging&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;This experiment convinced me that structured context makes AI collaboration more effective and team-friendly. I'll continue refining this approach and testing it on more complex features.&lt;/p&gt;

&lt;p&gt;The real win isn't just the technical fix – it's proving that we can work with AI in a way that enhances rather than replaces human collaboration and decision-making.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want to see more experiments like this? I run these context-driven development experiments weekly. Follow along for more insights into AI-assisted development, team collaboration, and building better software tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>jira</category>
      <category>contextdrivendevelopment</category>
    </item>
    <item>
      <title>Recording My Experiments in Spec-Driven Development</title>
      <dc:creator>Jesse Piaścik</dc:creator>
      <pubDate>Mon, 03 Nov 2025 18:43:07 +0000</pubDate>
      <link>https://dev.to/imdone/recording-my-experiments-in-spec-driven-development-40e0</link>
      <guid>https://dev.to/imdone/recording-my-experiments-in-spec-driven-development-40e0</guid>
      <description>&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/Op9iQ2LX2DI"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;For years, I’ve been chasing one idea — &lt;strong&gt;keeping context close to the work&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Whether it’s TODO comments, markdown notes, or tasks in the repo, my goal has always been to reduce the mental tax of switching tools just to remember what I was doing.&lt;/p&gt;

&lt;p&gt;That’s the foundation of what I call &lt;strong&gt;context-driven development&lt;/strong&gt; — a workflow where the “why” behind each change lives right next to the “how.”&lt;br&gt;&lt;br&gt;
Now I’m taking that same idea into the world of AI-assisted coding.&lt;/p&gt;


&lt;h2&gt;
  
  
  Recording My Experiments
&lt;/h2&gt;

&lt;p&gt;Lately, I’ve been experimenting with &lt;strong&gt;spec-driven development&lt;/strong&gt; — trying to guide AI tools like Copilot to produce code that matches &lt;em&gt;what I actually want&lt;/em&gt;, not just what it infers from nearby syntax.&lt;/p&gt;

&lt;p&gt;Progress has been slow.&lt;br&gt;&lt;br&gt;
There’s just too much going on in my life right now to hold the full context of what’s working and what isn’t. So I’ve decided to start recording my experiments and sharing them here.&lt;/p&gt;


&lt;h2&gt;
  
  
  Embedding Context Where It Belongs
&lt;/h2&gt;

&lt;p&gt;In my latest experiment, I used &lt;strong&gt;context embedded in the Jira issue&lt;/strong&gt; to guide Copilot.&lt;br&gt;&lt;br&gt;
Instead of writing long, open-ended prompts, I pasted that context into the Copilot chat panel and referenced specific files and lines.&lt;/p&gt;

&lt;p&gt;That small change made a big difference. It gave Copilot something closer to what a teammate would see — the &lt;em&gt;why&lt;/em&gt; behind the change, not just the &lt;em&gt;where&lt;/em&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Moving Toward Structured Specs
&lt;/h2&gt;

&lt;p&gt;While researching how ChatGPT interprets structured text, I landed on a markdown format that should be easier for Copilot to understand and follow.  &lt;/p&gt;

&lt;p&gt;Here’s the format I’ll be using in my &lt;strong&gt;next experiment&lt;/strong&gt;:&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="p"&gt;-&lt;/span&gt; [ ] &lt;span class="nt"&gt;&amp;lt;task&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
&lt;span class="p"&gt;  -&lt;/span&gt; files: &lt;span class="sb"&gt;`&amp;lt;path:line&amp;gt;`&lt;/span&gt;, &lt;span class="sb"&gt;`&amp;lt;path:line&amp;gt;`&lt;/span&gt;  
&lt;span class="p"&gt;  -&lt;/span&gt; goal: &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;change&lt;/span&gt; &lt;span class="na"&gt;achieves&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
&lt;span class="p"&gt;  -&lt;/span&gt; constraints: &lt;span class="nt"&gt;&amp;lt;rules&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;avoid&lt;/span&gt; &lt;span class="na"&gt;unwanted&lt;/span&gt; &lt;span class="na"&gt;changes&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
&lt;span class="p"&gt;  -&lt;/span&gt; action: apply patch and show diffs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My hope is that this will make the generated code more predictable — and closer to what I’d write myself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;In the next post, I’ll use this format to see how well Copilot follows the spec when it’s embedded directly in the codebase.&lt;br&gt;
I’ll record the whole thing so you can see exactly how it performs.&lt;/p&gt;

&lt;p&gt;Stay tuned — and if you’ve tried something similar with Copilot or ChatGPT, I’d love to hear how you structure your specs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Watch the short intro video here:&lt;/em&gt;&lt;br&gt;
👉 &lt;a href="https://youtu.be/Op9iQ2LX2DI" rel="noopener noreferrer"&gt;https://youtu.be/Op9iQ2LX2DI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>jira</category>
      <category>contextdrivendevelopment</category>
    </item>
  </channel>
</rss>
