<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[BugIt Engineering]]></title><description><![CDATA[BugIt Engineering]]></description><link>https://bugit.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ac1866ece224f06d91a9764/5154cba6-ee90-4384-b501-6af1c702ce7a.png</url><title>BugIt Engineering</title><link>https://bugit.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 10:40:45 GMT</lastBuildDate><atom:link href="https://bugit.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Before you file it: how to find the duplicate a newest first list hides]]></title><description><![CDATA[Most trackers have the same ghost: the bug that was reported eight months ago, triaged, discussed, half fixed, and then forgotten. Today someone hits it again and files a fresh ticket. Now the context]]></description><link>https://bugit.hashnode.dev/before-you-file-it-how-to-find-the-duplicate-a-newest-first-list-hides</link><guid isPermaLink="true">https://bugit.hashnode.dev/before-you-file-it-how-to-find-the-duplicate-a-newest-first-list-hides</guid><category><![CDATA[Testing]]></category><category><![CDATA[QA]]></category><category><![CDATA[bug tracking]]></category><category><![CDATA[Developer Tools]]></category><dc:creator><![CDATA[BugIt by Taskivator]]></dc:creator><pubDate>Tue, 06 Oct 2026 10:27:30 GMT</pubDate><content:encoded><![CDATA[<p>Most trackers have the same ghost: the bug that was reported eight months ago, triaged, discussed, half fixed, and then forgotten. Today someone hits it again and files a fresh ticket. Now the context lives in one place and the attention lives in another, and a developer spends an hour rediscovering what the old thread already knew.</p>
<p>Duplicate bugs are rarely laziness. Most testers do search first. The search just fails in predictable ways, and once you know them you can get around most of them.</p>
<h2>Why the search misses</h2>
<p><strong>The words differ.</strong> You call it "checkout total wrong". The original reporter called it "price not updated after plan switch". Same bug, no shared keyword. Tracker search is mostly literal, so two honest descriptions of one problem can sail past each other.</p>
<p><strong>The list is sorted for the wrong question.</strong> Search results usually come back newest first, or by the tracker's own relevance score. When you are asking "has anyone seen this before?", the answer is often the oldest matching ticket, and that is exactly the one a short result page cuts off.</p>
<p><strong>The spelling is not the spelling.</strong> A product name typed in full width characters by a teammate on a Japanese keyboard, a German word with or without its umlaut, a version number written three ways. Each one splits the history in two.</p>
<p><strong>Closed tickets are out of sight.</strong> Many searches default to open issues. A bug that was closed as fixed and has come back is the most useful duplicate of all, because its fix tells you where to look.</p>
<h2>A search routine that works</h2>
<ol>
<li><strong>Search by symptom and by area, separately.</strong> One query with the visible symptom ("total", "price", "discount"), another with the feature or screen ("billing", "annual plan"). Read both.</li>
<li><strong>Include closed tickets.</strong> A regression is a duplicate with a history, and the history is the valuable part.</li>
<li><strong>Sort oldest first at least once.</strong> If the bug has existed for a while, the original report is at the bottom of the default view.</li>
<li><strong>Try the other spellings.</strong> Product names, error codes, version strings, and any word your team writes in more than one way.</li>
<li><strong>When in doubt, link instead of filing blind.</strong> If a ticket looks related but you are not sure, file yours and link the old one. A developer can merge two linked tickets in seconds; finding an unlinked twin later takes much longer.</li>
</ol>
<h2>Judging "is this the same bug?"</h2>
<p>A matching title is not enough. Compare three things:</p>
<ul>
<li><strong>The trigger.</strong> Same steps, same condition? "After switching plans" and "after applying a coupon" may be two different bugs with the same symptom.</li>
<li><strong>The environment.</strong> A bug reported on last year's build in one browser may not be yours.</li>
<li><strong>The evidence.</strong> The same error message or the same stack frame is the strongest signal you will get.</li>
</ul>
<p>If two of the three match, treat it as a likely duplicate and say why in your comment. That sentence saves the triager from repeating your comparison.</p>
<h2>How BugIt helps with this</h2>
<p>This is one of the checks we built into BugIt, a QA agent that runs inside the AI assistant you already use: GitHub Copilot Chat or Claude in VS Code, or a plain terminal.</p>
<p>Before you see a draft ticket, BugIt searches your tracker for tickets like yours and <strong>ranks them by how likely each one is the same bug</strong>, rather than trusting the tracker's own result order. In our own tests the true duplicate was the oldest matching ticket, exactly the one a newest first list cuts off. It searches your title the way you typed it, including full width and half width characters, and it gives you a number for each candidate so you can see how close it thinks the match is.</p>
<p>You make the call. If one of them is your bug, you comment there instead of filing. If none of them is, you carry on, and nothing is filed until you have read the draft and typed <strong>FILE IT</strong>.</p>
<p>The search goes from your machine straight to your tracker, with your own credentials. Here is the short film on it:</p>
<p><a href="https://www.youtube.com/watch?v=1Ser7PATJfE"><img src="https://img.youtube.com/vi/1Ser7PATJfE/hqdefault.jpg" alt="Is it a duplicate? BugIt gives you a number" /></a></p>
<h2>Try BugIt</h2>
<ul>
<li>Read the related article on bugit.dev: <strong><a href="https://bugit.dev/articles/catch-duplicate-bugs-before-filing/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06">Catch duplicate bugs before you file them</a></strong>.</li>
<li>See what BugIt does at <strong><a href="https://bugit.dev?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06">bugit.dev</a></strong>, or read about it on the Taskivator website: <strong><a href="https://taskivator.com/bugit/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06">taskivator.com/bugit</a></strong>.</li>
<li><strong>Testers can request a free trial</strong> at <a href="https://bugit.dev/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06#trial">bugit.dev</a>, in exchange for honest feedback.</li>
<li>One short film per feature on our YouTube channel: <strong><a href="https://www.youtube.com/@BugItByTaskivator">@BugItByTaskivator</a></strong>.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[How to write a bug report developers can act on (with a free template)]]></title><description><![CDATA[Most bug reports are not wrong. They are just not enough. "Checkout is broken" is true, and it starts a conversation instead of a fix: which checkout, which build, broken how, for whom? Each question ]]></description><link>https://bugit.hashnode.dev/how-to-write-a-bug-report-developers-can-act-on-with-a-free-template</link><guid isPermaLink="true">https://bugit.hashnode.dev/how-to-write-a-bug-report-developers-can-act-on-with-a-free-template</guid><dc:creator><![CDATA[BugIt by Taskivator]]></dc:creator><pubDate>Sun, 04 Oct 2026 11:26:14 GMT</pubDate><content:encoded><![CDATA[<p>Most bug reports are not wrong. They are just not enough. "Checkout is broken" is true, and it starts a conversation instead of a fix: which checkout, which build, broken how, for whom? Each question is a round trip between a tester and a developer, and each round trip can cost a day.</p>
<p>A good bug report answers those questions before anyone asks them. This post covers what goes into one, gives you a template you can copy into any tracker, and shows the mistakes that send tickets back.</p>
<h2>What a developer needs from a bug report</h2>
<p>A developer reading your ticket is trying to do three things, in order:</p>
<ol>
<li><p><strong>Reproduce it.</strong> If they cannot see the bug happen, they are guessing.</p>
</li>
<li><p><strong>Understand the gap.</strong> What should have happened, and what happened instead.</p>
</li>
<li><p><strong>Judge the impact.</strong> Whether this blocks a release or can wait for next sprint.</p>
</li>
</ol>
<p>Each section of a good report serves one of those three jobs. Anything that serves none of them is noise, and noise makes the important part harder to find.</p>
<h2>The template</h2>
<p>Copy this into Jira, GitHub Issues, Azure DevOps, Linear or wherever your team works:</p>
<pre><code class="language-plaintext">Title: [Area] What goes wrong, under which condition

Environment
  Build or version:
  Platform (OS, browser, device):
  Account or role used:

Steps to reproduce
  1.
  2.
  3.

Expected result

Actual result

How often
  Every time / sometimes (about N out of M tries) / once

Severity
  Blocker / major / minor / cosmetic, and one sentence on why

Evidence
  Screenshot, recording, log excerpt, error message (copied as text)

Notes
  What you already ruled out, related tickets, when it started
</code></pre>
<p>Now, what makes each part good.</p>
<h2>Write the title as a search result</h2>
<p>Your title is what a developer sees in a list of fifty tickets, and what the next tester searches for before filing a duplicate. Make it specific enough to tell this bug apart from its neighbours.</p>
<ul>
<li><p>Weak: <code>Discount not working</code></p>
</li>
<li><p>Better: <code>[Checkout] SAVE20 discount is dropped after switching to annual billing</code></p>
</li>
</ul>
<p>The better title names the area, the symptom and the condition. Someone searching for "SAVE20" or "annual billing" finds it, and a developer knows which part of the code to open before reading another word.</p>
<h2>Steps to reproduce: write for a stranger</h2>
<p>Write the steps as if the reader has never seen the product. Number them, and give one action per step.</p>
<ul>
<li><p>Start from a known state ("Log in as a new user with an empty cart"), not from wherever you happened to be.</p>
</li>
<li><p>Use the exact values you used: the coupon code, the file name, the account type.</p>
</li>
<li><p>Stop at the step where the bug shows up.</p>
</li>
</ul>
<p>Then run your own steps once more from the start before you file. A surprising number of reports skip a step the tester did without noticing, like dismissing a cookie banner or switching tabs, and that missing step is the whole bug.</p>
<h2>Expected and actual: the heart of the report</h2>
<p>These two lines carry most of the value, and they are the ones most often left thin.</p>
<ul>
<li><p><strong>Expected:</strong> "The total shows the 20 percent discount applied to the annual price."</p>
</li>
<li><p><strong>Actual:</strong> "The total shows the full annual price. The coupon field still displays SAVE20 as applied."</p>
</li>
</ul>
<p>"It doesn't work" is not an actual result. Describe what you saw, including anything misleading, like a coupon that still looks applied. That detail tells a developer the display and the calculation disagree, which narrows the search a lot.</p>
<p>If the expected behaviour comes from a spec, a design or an acceptance criterion, link it. Then the report is about a requirement, not an opinion.</p>
<p>Here is a short film on how BugIt flags exactly these thin spots while you can still fix them:</p>
<p><a href="https://www.youtube.com/watch?v=xIrP4pcaVMM"><img src="https://img.youtube.com/vi/xIrP4pcaVMM/hqdefault.jpg" alt="BugIt tells you when your bug report is thin" style="display:block;margin:0 auto" /></a></p>
<h2>How often, and how bad</h2>
<p>"Every time" and "once" are very different bugs. If it happens intermittently, say how many tries it took ("3 out of 10 attempts"). That number tells a developer whether to look for a race condition or a plain logic error.</p>
<p>For severity, give your best judgement and one sentence of reasoning. "Major: affects every annual upgrade that uses a coupon" lets the team agree or disagree quickly. A bare "Critical" invites a debate.</p>
<h2>Evidence that actually helps</h2>
<ul>
<li><p><strong>Error messages as text, not only as screenshots.</strong> Text can be searched, copied and matched against logs.</p>
</li>
<li><p><strong>Logs: the relevant part.</strong> The exception, its message and the first few stack frames usually tell the story. A 4,000 line log attached without comment often goes unread.</p>
</li>
<li><p><strong>Screenshots and recordings</strong> for anything visual, or anything that depends on timing.</p>
</li>
<li><p><strong>Check for private data first.</strong> Logs and screenshots often carry email addresses, tokens and customer details. Remove them before they land in a tracker that the whole company can read.</p>
</li>
</ul>
<h2>Five mistakes that send tickets back</h2>
<ol>
<li><p><strong>Two bugs in one ticket.</strong> One gets fixed, the ticket gets closed, and the other is lost. File them separately and link them.</p>
</li>
<li><p><strong>A duplicate.</strong> Search the tracker first, including older and closed tickets. The original often holds context you need.</p>
</li>
<li><p><strong>A solution instead of a problem.</strong> "Change the rounding function" assumes the cause. Describe the behaviour and let the investigation find the cause.</p>
</li>
<li><p><strong>No environment.</strong> A bug on yesterday's build may already be fixed. A bug in one browser may not exist in another.</p>
</li>
<li><p><strong>Emotion instead of facts.</strong> "This is completely broken again!!" helps nobody. Calm, specific reports get fixed sooner.</p>
</li>
</ol>
<h2>Where BugIt fits</h2>
<p>Following this template takes discipline, especially at the end of a long test session when you just want to get the ticket in. That is the problem we built BugIt to help with.</p>
<p>BugIt is a QA agent that runs inside the AI assistant you already use: GitHub Copilot Chat or Claude in VS Code, or a plain terminal. You describe what happened in a sentence, and it works through the same checklist as above:</p>
<ul>
<li><p>It asks for what is missing, such as the build or how often it happens.</p>
</li>
<li><p>It drafts the title, steps, expected and actual result and a suggested severity, with its reasons. You decide the severity.</p>
</li>
<li><p>It scores the report and tells you when the steps, the expected result or the actual result look thin.</p>
</li>
<li><p>It searches your tracker for likely duplicates and ranks them, so an older matching ticket is not lost at the bottom of a list.</p>
</li>
<li><p>Paste a crash log and it keeps the exception, the message and the top stack frames.</p>
</li>
<li><p>It redacts email addresses, tokens, API keys and similar data from the text before filing. This is pattern based, so read the draft before you approve it.</p>
</li>
</ul>
<p>Nothing is filed until you have read the draft and typed <strong>FILE IT</strong>. BugIt works with eleven trackers, including Jira, Azure DevOps, GitHub, GitLab and Linear. This short film shows the approval step:</p>
<p><a href="https://www.youtube.com/watch?v=sdh0R215uZc"><img src="https://img.youtube.com/vi/sdh0R215uZc/hqdefault.jpg" alt="Nothing is filed until you type FILE IT" style="display:block;margin:0 auto" /></a></p>
<h2>Try it</h2>
<p>The template above is yours to keep, whether or not you use BugIt. If you would like help applying it to your reports:</p>
<ul>
<li><p>See what BugIt does at <a href="https://bugit.dev"><strong>bugit.dev</strong></a>, or watch the <a href="https://www.youtube.com/watch?v=nlLLNSYlzqo">introduction film</a>.</p>
</li>
<li><p><strong>Testers can request a free trial</strong> at <a href="https://bugit.dev/#trial">bugit.dev</a>, in exchange for honest feedback.</p>
</li>
<li><p>More short films, one feature each, are on our YouTube channel: <a href="https://www.youtube.com/@BugItByTaskivator"><strong>@BugItByTaskivator</strong></a>.</p>
</li>
</ul>
<p>Learn more: <a href="https://taskivator.com/bugit/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06">https://taskivator.com/bugit/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06</a></p>
]]></content:encoded></item><item><title><![CDATA[Why our AI QA agent waits for you to type FILE IT]]></title><description><![CDATA[An agent that can write to your bug tracker is useful right up to the moment it files something you never read. A ticket in Jira is public inside your company. People get notified, boards change, and ]]></description><link>https://bugit.hashnode.dev/why-our-ai-qa-agent-waits-for-you-to-type-file-it</link><guid isPermaLink="true">https://bugit.hashnode.dev/why-our-ai-qa-agent-waits-for-you-to-type-file-it</guid><category><![CDATA[Testing]]></category><category><![CDATA[AI]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[QA]]></category><dc:creator><![CDATA[BugIt by Taskivator]]></dc:creator><pubDate>Sat, 03 Oct 2026 22:53:41 GMT</pubDate><content:encoded><![CDATA[<p>An agent that can write to your bug tracker is useful right up to the moment it files something you never read. A ticket in Jira is public inside your company. People get notified, boards change, and most trackers cannot truly delete an issue afterwards. So when we built BugIt, a QA agent that runs inside the AI assistant you already use (GitHub Copilot Chat, Claude in VS Code, or a plain terminal), the first design question was not how to write a better ticket. It was how to make sure a human approves every write.</p>
<p>Our answer is two words: <strong>FILE IT</strong>. This post explains how that gate works, what runs on your machine before you see a draft, and where the gate stops.</p>
<h2>The gate: three properties</h2>
<p>Every write to a tracker (a new ticket, a comment, an edit, an attachment) goes through one command, <code>tools/file_it.py</code>. It has two steps. <code>preview</code> shows you the exact ticket. <code>file</code> writes it, and only with a confirmation. The confirmation has three properties, all enforced in that write path.</p>
<p><strong>1. It must match exactly.</strong> The confirmation is compared as a whole string, not searched for inside a sentence. "don't file it", "file it later" and "FILE IT?" are all refused, because a substring test would let a sentence that <em>declines</em> the write authorize it. Case and extra spaces are forgiven (<code>file it</code> works), because you are typing into a chat box, not a password prompt. Nothing else is forgiven: a reply with invisible characters or lookalike letters is refused, and the refusal names the character it found.</p>
<p><strong>2. It is bound to the draft you read.</strong> When <code>preview</code> runs, it records a fingerprint of the provider, the destination, the account and the full content it showed you. When <code>file</code> runs, it recomputes that fingerprint and refuses if anything changed. If the model rewrites the description after you approved it, or a retry produces a slightly different body, the approval no longer fits and you get a fresh preview instead.</p>
<p><strong>3. It is spent once.</strong> The pending preview is consumed by the write that uses it. A repeated command, a retried tool call or a model that calls the same thing twice gets <code>already_used</code>, not a second ticket. A preview also expires after an hour, so a stale draft from the morning cannot be filed by an accidental rerun in the afternoon.</p>
<p>There is deliberately no command that deletes a ticket.</p>
<h2>A small example</h2>
<p>You paste a crash log and write one rough sentence:</p>
<blockquote>
<p>checkout total is wrong after switching to annual with SAVE20</p>
</blockquote>
<p>BugIt asks what is missing (which build, does it happen every time), then shows a preview: destination, title, steps, expected and actual result, severity. So far the only call to your tracker has been a read: the duplicate search described below.</p>
<p>Under the hood, the assistant runs something like:</p>
<pre><code class="language-plaintext">python tools/file_it.py preview --file .cache/bug.json --json
</code></pre>
<p>You reply "looks good". Nothing is filed, because that is not the phrase. You reply <strong>FILE IT</strong>, and the assistant runs:</p>
<pre><code class="language-plaintext">python tools/file_it.py file --file .cache/bug.json --confirm "FILE IT" --json
</code></pre>
<p>The fingerprint matches, the approval is spent, and the tracker returns a ticket key such as <code>KAN-192</code>. Running the same command again is refused.</p>
<h2>The five checks, and where they run</h2>
<p>Before you see a draft, five checks run. There is nothing to switch on.</p>
<ol>
<li><p><strong>Duplicates.</strong> BugIt searches your tracker for tickets like yours and ranks them by how likely each one is the same bug, rather than trusting the tracker's own result order. In our own tests the true duplicate was the oldest matching ticket, exactly the one a "newest first" list cuts off.</p>
</li>
<li><p><strong>Severity.</strong> A suggestion from the symptoms, shown with its reasons. You decide.</p>
</li>
<li><p><strong>Log parsing.</strong> Paste a crash log and it keeps the exception, the message and the top stack frames. A log too large to scan is reported as truncated, not cut silently.</p>
</li>
<li><p><strong>Personal data.</strong> Email addresses, tokens, API keys, private keys, IP addresses and card numbers are redacted from the text before filing. This is pattern based, so read the draft before you approve it.</p>
</li>
<li><p><strong>Quality score.</strong> It says so when the steps, the expected result or the actual result look thin.</p>
</li>
</ol>
<p>The checks themselves are plain Python helpers with no dependencies, and they run locally. To keep report text out of shell history and the process list, they read it from a file or standard input, never from the command line.</p>
<p><strong>What leaves your machine, and where it goes:</strong></p>
<ul>
<li><p>Your conversation goes to the AI model behind the assistant you chose, as it does for anything else you type there.</p>
</li>
<li><p>The duplicate search and the final write go from your machine to your tracker with your own credentials. For Jira Cloud and Azure DevOps that path runs through Atlassian's and Microsoft's own MCP servers; for the other trackers, BugIt calls the tracker's API directly.</p>
</li>
<li><p>BugIt itself sends Taskivator only licence and update data: a hashed device fingerprint, an installation id, the device name and operating system, the BugIt version and the plan you picked. The full list is in the privacy notice. Your tickets, specs and tokens do not pass through our servers.</p>
</li>
</ul>
<h2>The honest limitation</h2>
<p>The gate proves that the two words arrived on BugIt's command line. It does not prove that <em>you</em> typed them. Your assistant writes that command, and it is instructed to pass FILE IT only when your whole reply was exactly that. Nothing in BugIt reads your chat to check.</p>
<p>So an assistant that ignores its instructions (because it was jailbroken, or followed an instruction hidden inside a ticket or web page it read) could pass the phrase itself. What stands in its way is the approval prompt your editor shows before a command runs. BugIt makes that prompt appear for every BugIt command it recognises, on Claude Code through a guard hook and on VS Code through the terminal approvals it ships. A command disguised so it does not look like a BugIt command is not recognised. So keep terminal approval on, read what a prompt says it will run, and do not add a broad allow rule such as <code>python</code> to your editor's settings.</p>
<p>We think naming this beats claiming the gate is airtight. The confirmation stops the common failure, an agent treating "sure" or "looks fine" as consent or filing the same ticket twice. Your editor's prompt is the second lock.</p>
<h2>About BugIt</h2>
<p>BugIt is our product. It works with eleven trackers, including Jira, Azure DevOps, GitHub, GitLab and Linear, and needs Python 3.10 to 3.14. Windows 11 is fully supported; macOS and Linux are in preview. Testers can request a free trial, offered to a limited number of testers in exchange for honest feedback.</p>
<p>Learn more at <a href="https://bugit.dev">bugit.dev</a>.</p>
<hr />
<p><em>This article was written with AI assistance and checked claim by claim against the BugIt source code by the BugIt team at Taskivator.</em></p>
<p>Learn more: <a href="https://taskivator.com/bugit/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06">https://taskivator.com/bugit/?utm_source=hashnode&amp;utm_medium=social&amp;utm_campaign=round-2026-10-06</a></p>
]]></content:encoded></item></channel></rss>