<?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: Dhairya Modh</title>
    <description>The latest articles on DEV Community by Dhairya Modh (@dhairya_modh_a300d600e44a).</description>
    <link>https://dev.to/dhairya_modh_a300d600e44a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4241438%2Fc8aeeb5e-8166-46c4-b439-054974ff46bc.png</url>
      <title>DEV Community: Dhairya Modh</title>
      <link>https://dev.to/dhairya_modh_a300d600e44a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dhairya_modh_a300d600e44a"/>
    <language>en</language>
    <item>
      <title>Your AI agent's decisions never reach the Jira ticket. Here's what that costs.</title>
      <dc:creator>Dhairya Modh</dc:creator>
      <pubDate>Thu, 12 Nov 2026 16:13:59 +0000</pubDate>
      <link>https://dev.to/dhairya_modh_a300d600e44a/your-ai-agents-decisions-never-reach-the-jira-ticket-heres-what-that-costs-14h6</link>
      <guid>https://dev.to/dhairya_modh_a300d600e44a/your-ai-agents-decisions-never-reach-the-jira-ticket-heres-what-that-costs-14h6</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6fsmuya0q3ignpsmlki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg6fsmuya0q3ignpsmlki.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
There's a pattern I keep seeing on teams that use AI coding agents.&lt;/p&gt;

&lt;p&gt;A developer's agent is implementing a ticket and hits something the ticket doesn't settle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The ticket doesn't say what happens when the due date is empty. Show a validation error, or default to today?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The developer answers. Maybe they remember what the product owner said on a call, maybe they just pick something sensible. The agent writes the code, the PR gets merged, and everyone moves on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ticket never changes.&lt;/strong&gt; It still says &lt;em&gt;"Due date is required."&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Then QA arrives
&lt;/h2&gt;

&lt;p&gt;A few days later QA tests the feature, increasingly with their own AI agent. The agent reads the acceptance criteria, submits the form with an empty due date, expects an error, gets today's date, and files a bug.&lt;/p&gt;

&lt;p&gt;It isn't a bug. It's a decision that only lived in a chat window that has since been closed.&lt;/p&gt;

&lt;p&gt;Now the dev, QA and the product owner are going back and forth in Slack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QA:&lt;/strong&gt; "Empty due date isn't validated 🐞"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev:&lt;/strong&gt; "That's intended, we decided it on the call."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PO:&lt;/strong&gt; "Which call? The ticket says it's required."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nobody can say who decided what, or why. And this happens for dozens of small decisions in every sprint: defaults, edge cases, error handling, rounding, empty states. Before AI agents, a human dev would sometimes remember to update the ticket. An agent can't leave a question open, so it gets an answer from you, or picks one itself, and keeps going.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I built: TruthTrail
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://truthtrail.pages.dev" rel="noopener noreferrer"&gt;TruthTrail&lt;/a&gt; captures those decisions &lt;strong&gt;where they're made&lt;/strong&gt;, inside the coding session, and keeps the ticket in sync.&lt;/p&gt;

&lt;p&gt;Here's the whole flow in two minutes:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WPnadjaq2k0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The agent records the decision
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;npx truthtrail init&lt;/code&gt; adds a short rules block to &lt;code&gt;AGENTS.md&lt;/code&gt; (read by Claude Code, Cursor, Copilot and Codex) and sets up an MCP server. When the agent asks you something the ticket didn't cover, or makes an assumption on its own, it records it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⏺ truthtrail · record_decision
  question  Empty due date: show an error or default to today?
  chosen    Default to today
  reason    Most tasks are created for today
  approver  Priya (PO)
✓ recorded D-1 for KAN-42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ticket key comes from your branch name.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. It's saved in your repo, as a plain file
&lt;/h3&gt;

&lt;p&gt;Each decision is a small Markdown file under &lt;code&gt;.decisions/&lt;/code&gt;, reviewed in the same PR as the code it explains:&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="nn"&gt;---
&lt;/span&gt;&lt;span class="na"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;KAN-42&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;decision&lt;/span&gt;
&lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Empty due date: show an error or default to today?"&lt;/span&gt;
&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Show error&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Default to today&lt;/span&gt;
&lt;span class="na"&gt;chosen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Default to today&lt;/span&gt;
&lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Most tasks are created for today&lt;/span&gt;
&lt;span class="na"&gt;approver_claimed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Priya (PO)&lt;/span&gt;
&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-code&lt;/span&gt;
&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/form.ts&lt;/span&gt;
&lt;span class="nn"&gt;---
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No database you have to trust, no lock-in. It's just files in git.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvpjjdwzxmxnc8ox04rf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvpjjdwzxmxnc8ox04rf7.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The ticket gets told, and the reporter confirms
&lt;/h3&gt;

&lt;p&gt;In Jira mode, TruthTrail keeps &lt;strong&gt;one&lt;/strong&gt; summary comment on the ticket (not a comment per decision), and mentions the reporter:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 &lt;strong&gt;TruthTrail (automatic)&lt;/strong&gt;&lt;br&gt;
⏳ D-1 Empty due date: show an error or default to today? → Default to today · waiting for @Priya · reply "/confirm D-1" or "/reject D-1 &amp;lt;reason&amp;gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Priya replies &lt;code&gt;/confirm D-1&lt;/code&gt;, and the line flips to ✅ &lt;em&gt;confirmed by Priya&lt;/em&gt;. If she rejects it, the dev's agent picks that up in the next session.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fleprjce6h3hscmqn93lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fleprjce6h3hscmqn93lf.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now when QA's agent reads the ticket, the decision is right there, confirmed. No false bug.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Months later: "why is this line like this?"
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npx truthtrail why src/form.ts:2
src/form.ts:2
  commit  d692f66 by Arjun · written by AI (claude-code)
  ticket  KAN-42
  • D-1 [decision] Empty due date: show an error or default to today?
      → Default to today
    why: Most tasks are created for today
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It tells you whether a human or an AI wrote the line, which decisions shaped it, and the ticket they belong to.&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;npx truthtrail check&lt;/code&gt; warns when a branch has AI-assisted commits but no decisions recorded, which is a nice nudge in a PR check.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Claude Code plugin
&lt;/h2&gt;

&lt;p&gt;If you use Claude Code, there's a plugin that goes a step further. It loads the ticket's existing decisions at session start, so the agent doesn't re-ask something already settled. It also captures the questions you answered during the session, and before Claude finishes, it asks you to record or dismiss each one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add truthtrail/claude-plugin
/plugin install truthtrail@truthtrail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;npx truthtrail init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Local mode needs no account. Everything stays in your repo. Jira mode (&lt;code&gt;npx truthtrail login&lt;/code&gt;) adds the ticket comment and the confirm/reject loop.&lt;/p&gt;

&lt;p&gt;It's early. A GitHub PR check and a Jira app with Confirm and Reject buttons are next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'd really like to hear from people running AI agents in a ticket-driven team:&lt;/strong&gt; does this match a problem you have? Where do your agent's decisions end up today? Let me know in the comments.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://truthtrail.pages.dev" rel="noopener noreferrer"&gt;truthtrail.pages.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
