<?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: Tariq Davis</title>
    <description>The latest articles on DEV Community by Tariq Davis (@tagzauthor).</description>
    <link>https://dev.to/tagzauthor</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%2F3920882%2F7fb5fa66-14fb-4ef2-acfc-9a2bbd0874d8.png</url>
      <title>DEV Community: Tariq Davis</title>
      <link>https://dev.to/tagzauthor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tagzauthor"/>
    <language>en</language>
    <item>
      <title>The code was fine. The green check was lying.</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Mon, 17 Aug 2026 15:50:40 +0000</pubDate>
      <link>https://dev.to/tagzauthor/the-code-was-fine-the-green-check-was-lying-oh3</link>
      <guid>https://dev.to/tagzauthor/the-code-was-fine-the-green-check-was-lying-oh3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug wasn't in my code. It was in the thing I trusted to tell me my code was fine.
&lt;/h2&gt;

&lt;p&gt;I build and sell ebooks. Not the kind of software most people picture when they hear "bug" — no server, no users, no stack trace at 3am. Just a document that has to render correctly on a stranger's Kindle.&lt;/p&gt;

&lt;p&gt;But I lost two full days to two different bugs this year, and when I finally sat down and looked at both of them side by side, they were the same bug wearing two costumes. Both times, the code was fine. Both times, the thing I trusted to &lt;em&gt;check&lt;/em&gt; the code was quietly lying to me. And the gap between "what my tools told me" and "what was actually true" is exactly where both bugs were hiding.&lt;/p&gt;

&lt;p&gt;If you've ever shipped something with a green test suite and watched it break in production anyway, this is your bug too. Mine just happened to live in an ebook.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug one: I rebuilt a document by eye, and my eye is an idiot
&lt;/h2&gt;

&lt;p&gt;Here's the setup. I had a finished 18-page PDF — a product, already built, already looked good. What I did &lt;em&gt;not&lt;/em&gt; have anymore was the code that generated it. The source was gone. Lost to a container reset. All that survived was the output.&lt;/p&gt;

&lt;p&gt;I needed to make edits. So I did the obvious thing: I opened the PDF, looked at it, and started rebuilding the source to match what I saw.&lt;/p&gt;

&lt;p&gt;This went badly in a way I didn't notice for hours.&lt;/p&gt;

&lt;p&gt;I looked at the body text and figured it was about 9.6pt. It was actually 11px. I looked at the chapter titles and called them 27pt. They were 30px. I eyeballed the rail widths, the margins, the colors — all slightly off, all in ways that &lt;em&gt;looked&lt;/em&gt; close enough that nothing screamed at me. And three diagrams I couldn't quite make out? I quietly replaced them with my own versions and told myself they were "unreconstructable."&lt;/p&gt;

&lt;p&gt;They were not unreconstructable. That's the part that stings.&lt;/p&gt;

&lt;p&gt;Because here's what I forgot: &lt;strong&gt;a rendered PDF is not a picture of the source. It &lt;em&gt;contains&lt;/em&gt; the source.&lt;/strong&gt; Every font size is sitting right there in the file as a &lt;code&gt;Tf&lt;/code&gt; operator. Every color is an &lt;code&gt;rg&lt;/code&gt; operator. Every position is a text matrix. The exact values I was squinting at and guessing — 11px, 30px, the real colors, the real diagram coordinates — were all in the file, as numbers, the entire time I was eyeballing them.&lt;/p&gt;

&lt;p&gt;I wasn't missing information. I was ignoring it in favor of a guess.&lt;/p&gt;

&lt;p&gt;The fix was to stop looking and start reading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lost_source.pdf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# who made this file? (tells you which engine to reproduce with)
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finditer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/(Producer|Creator)\s*\(([^)]*)\)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# pull the real values out of the page streams
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stream\r?\n(.*?)endstream&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decompress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;latin-1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finditer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/F\d+ ([\d.]+) Tf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;   &lt;span class="c1"&gt;# font sizes
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;font size:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&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;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finditer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;([\d.]+) ([\d.]+) ([\d.]+) rg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# colors
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;color:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The moment I ran that, the guessing stopped. The fonts were exact because I was no longer estimating them — I was copying them out of the file. The rebuild became a transcription instead of an impression. And the "unreconstructable" diagrams turned out to be perfectly reconstructable the second I read their actual coordinates instead of squinting at their shapes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson, stated plainly: if you're reconstructing something from its output, the output usually still carries the real values. Measure them. Do not trust your eye when the file will just tell you the number.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug two: every test passed, and the thing was still broken
&lt;/h2&gt;

&lt;p&gt;Different day, different project — an EPUB this time. There's a small design element between sections of the book: a kicker line of text, and a thin decorative rule centered under it. On my machine it looked perfect. In my test renders it looked perfect. On an actual Kindle, the rule jammed itself against the left margin like it was scared of the middle of the page.&lt;/p&gt;

&lt;p&gt;So I fixed it. Then I fixed it again. Then again. Five times.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fix 1 &amp;amp; 2:&lt;/strong&gt; I used flexbox to center it, plus a tall min-height so it'd sit in the middle. The Kindle ignored both. Collapsed straight to the top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix 3:&lt;/strong&gt; Classic &lt;code&gt;margin: 0 auto&lt;/code&gt; on the element. On older Kindle software, &lt;code&gt;margin: auto&lt;/code&gt; is silently treated as &lt;code&gt;margin: 0&lt;/code&gt;. It didn't center. It did nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix 4:&lt;/strong&gt; I made the rule a 1px-tall element with a background color. The Kindle didn't paint the background. The rule didn't shift — it &lt;em&gt;vanished&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix 5, the one that worked:&lt;/strong&gt; three em-dash characters — &lt;code&gt;———&lt;/code&gt; — in a paragraph with &lt;code&gt;text-align: center&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is almost embarrassingly simple, and &lt;em&gt;why&lt;/em&gt; it worked is the entire point of this post. It worked because it's the exact same mechanism the book's chapter titles already used, on the same device, successfully, the whole time. I didn't need to invent a centering technique. I needed to reuse the one that was already proven inside this exact file, on this exact reader.&lt;/p&gt;

&lt;p&gt;But here's the real bug, the one underneath all five failed fixes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every single test render passed.&lt;/strong&gt; My local renderer was more capable than a Kindle. It honored flexbox. It honored &lt;code&gt;margin: auto&lt;/code&gt;. It painted hairline backgrounds. So every broken fix got a green light from my tools and a red light from the actual device. I wasn't debugging the bug. I was debugging against a renderer that didn't share the Kindle's limitations — which meant my tests were confidently telling me "fixed" four times in a row while real readers would've seen it broken.&lt;/p&gt;

&lt;p&gt;I only made progress when I stopped trusting the lenient renderer and forced my test to reproduce the &lt;em&gt;actual&lt;/em&gt; failure — I disabled &lt;code&gt;margin: auto&lt;/code&gt; in my check on purpose, to make my tool as dumb as the target device. The instant my test could fail the way the Kindle failed, it caught the bug immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson, stated plainly: a passing test is only worth as much as the conditions it runs under. If your test environment is more forgiving than reality, a green check isn't proof — it's a nicer-looking version of the bug.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The two costumes, one bug
&lt;/h2&gt;

&lt;p&gt;Line them up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What I trusted&lt;/th&gt;
&lt;th&gt;What was actually true&lt;/th&gt;
&lt;th&gt;Where the truth was hiding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rebuild by eye&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;My visual estimate of the PDF&lt;/td&gt;
&lt;td&gt;Exact font/color/position values&lt;/td&gt;
&lt;td&gt;Inside the PDF's own operators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The centering rule&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A passing test render&lt;/td&gt;
&lt;td&gt;The Kindle's real behavior&lt;/td&gt;
&lt;td&gt;In the actual failure condition&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbcr0ionf63uf4t90xao.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%2Fcbcr0ionf63uf4t90xao.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same shape both times. I trusted a &lt;em&gt;convenient signal&lt;/em&gt; — my eye, my green test — instead of measuring the &lt;em&gt;real thing&lt;/em&gt;. And both bugs lived precisely in the gap between the two.&lt;/p&gt;

&lt;p&gt;This is not an ebook lesson. It's the thing under most bugs that survive more than one fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The log that looks clean because it isn't logging the thing that's actually failing.&lt;/li&gt;
&lt;li&gt;The test that passes because it mocks away the exact condition that breaks in prod.&lt;/li&gt;
&lt;li&gt;The metric that's green because it's measuring something adjacent to what you care about.&lt;/li&gt;
&lt;li&gt;The "it works on my machine" that is true, and useless, because your machine is more forgiving than the one that matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When a bug survives your fix, the first thing to distrust isn't your code. It's the signal that's telling you your code is fine.&lt;/strong&gt; Go make your check as harsh as reality — measure the real value, reproduce the real failure — and the bug usually stops hiding.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm proud of
&lt;/h2&gt;

&lt;p&gt;Not the fixes. The fixes were small — a regex and three em-dashes. What I'm proud of is that I stopped treating each bug as a code problem and started treating it as a &lt;em&gt;trust&lt;/em&gt; problem, and that reframe turned two separate two-day slogs into one lesson I now reach for automatically. The next time something survives a fix, I don't touch the code first. I go interrogate whatever told me the code was fine.&lt;/p&gt;

&lt;p&gt;That's the resilience win. Not harder code — harder checks.&lt;/p&gt;




&lt;p&gt;Check out my website: &lt;a href="http://www.tagzauthor.com" rel="noopener noreferrer"&gt;www.tagzauthor.com&lt;/a&gt;&lt;br&gt;
Support TagzAuthor: &lt;a href="//ko-fi.com/tagzauthor"&gt;ko-fi.com/tagzauthor&lt;/a&gt;&lt;br&gt;
My author page: &lt;a href="https://www.amazon.com/stores/author/B0DGDTFWZY?ccs_id=14f4f573-f026-4e4a-b8bc-3bb6c9c1ff0d" rel="noopener noreferrer"&gt;Amazon Bookstore&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>testing</category>
      <category>debugging</category>
    </item>
    <item>
      <title>I Built Three Cybersecurity Products. I Didn't Realize They Were One System Until the Third.</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Fri, 07 Aug 2026 14:32:53 +0000</pubDate>
      <link>https://dev.to/tagzauthor/i-built-three-cybersecurity-products-i-didnt-realize-they-were-one-system-until-the-third-2l4f</link>
      <guid>https://dev.to/tagzauthor/i-built-three-cybersecurity-products-i-didnt-realize-they-were-one-system-until-the-third-2l4f</guid>
      <description>&lt;p&gt;This didn't start as a system. It started as a side hustle.&lt;/p&gt;

&lt;p&gt;I wanted a business built around the field I was actually in — hacking, AI, cybersecurity — something I could build on while I learned how to navigate all of it. So I stopped overthinking it. Made a plan, outsourced the heavy lifting to AI so I could direct it instead of drown in it, and started.&lt;/p&gt;

&lt;p&gt;This was also a stretch where I was building my relationship with God, and that ended up being the ground I stood on through the uncertainty of starting something with no idea if it would work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The first one was a test
&lt;/h2&gt;

&lt;p&gt;Bug bounty. I thought people wanted a clean way into that world, so I made a starter kit — methodical, easy to digest, the thing I wish I'd had.&lt;/p&gt;

&lt;p&gt;After a month, I got a little traction. Mostly free-preview downloads, nothing huge. I went into cybersecurity and bug bounty communities on Reddit, posted on Dev.to, actually helped people instead of pitching them, and that got TagzAuthor its first real attention. Small, but real. It's all still new and incomplete, so I didn't expect more than that.&lt;/p&gt;

&lt;p&gt;That was the test. It passed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The second one carried more weight
&lt;/h2&gt;

&lt;p&gt;Next I built the &lt;strong&gt;Cybersecurity Intelligence Framework&lt;/strong&gt;. This one mattered more, because it solved cybersecurity reporting for me — the gap between finding something real and being able to say it in a way that holds up under review.&lt;/p&gt;

&lt;p&gt;Then the timing got strange. A few weeks after I finished it, I landed an application security internship. Felt like more than coincidence.&lt;/p&gt;

&lt;p&gt;So I did the obvious thing: I wrote down every piece of gold I could pull from it. That experience was exactly what I'd been missing, and I wasn't going to keep it to myself. With AI helping me shape it, I turned the whole thing into a methodology, and then into a book — the most in-depth, experience-based thing I've written. It's ready for Amazon now.&lt;/p&gt;

&lt;p&gt;And then it happened again. Days after the first internship ended, I got a second one. A whole new layer of experience that completed what the first one started.&lt;/p&gt;




&lt;h2&gt;
  
  
  The third one connected everything
&lt;/h2&gt;

&lt;p&gt;Out of that second round, I built my own version of an &lt;strong&gt;AI x Cybersecurity Toolkit&lt;/strong&gt; — practical, accessible tools and methods for making cybersecurity manageable, even fun to work with.&lt;/p&gt;

&lt;p&gt;It carries the part most technical guides leave out: the human side. The stillness that lets information organize itself instead of forcing it. It's built to teach beginners how to iterate their own systems while they work, not just follow mine.&lt;/p&gt;

&lt;p&gt;Here's the part I didn't plan. Because of how I think — in systems, always half-anticipating the next piece — plus some genuine luck, the three frameworks locked into one ecosystem. They connect and support each other with no friction. The Toolkit is how you think, the Bug Bounty Kit is what you do, the CIF is how you defend what you found.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F72xsymmt6d325d6vk271.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%2F72xsymmt6d325d6vk271.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three different starting problems. Same method underneath. I drew this after I noticed the connection, not before.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I didn't design that. I noticed it after the fact.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where this goes
&lt;/h2&gt;

&lt;p&gt;That accident gave me a blueprint. I know how to build the next ones now, and the direction from here is going to be worth watching.&lt;/p&gt;

&lt;p&gt;I won't spoil it. I'll just leave it here for the ones who tune in and wait — this is a metal that's slow to melt and slow to cool.&lt;/p&gt;

&lt;p&gt;Wish me luck. God bless everyone who read this.&lt;/p&gt;




&lt;p&gt;The three guides, bundled:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tagzauthor.com/l/security-bundle" rel="noopener noreferrer"&gt;www.tagzauthor.com/l/security-bundle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Free previews are up if you want to read before you commit.&lt;/p&gt;

&lt;p&gt;Support TagzAuthor: &lt;a href="https://ko-fi.com/tagzauthor" rel="noopener noreferrer"&gt;ko-fi.com/tagzauthor&lt;/a&gt;&lt;br&gt;
My author page: &lt;a href="https://amazon.com/stores/author/B0DGDTFWZY" rel="noopener noreferrer"&gt;Amazon Bookstore&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>career</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your AI Doesn't Know the Difference Between Knowing and Guessing</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Fri, 24 Jul 2026 02:44:43 +0000</pubDate>
      <link>https://dev.to/tagzauthor/your-ai-doesnt-know-the-difference-between-knowing-and-guessing-mf6</link>
      <guid>https://dev.to/tagzauthor/your-ai-doesnt-know-the-difference-between-knowing-and-guessing-mf6</guid>
      <description>&lt;h1&gt;
  
  
  Your AI Doesn't Know the Difference Between Knowing and Guessing
&lt;/h1&gt;

&lt;p&gt;I asked a local model what seven times eight was.&lt;/p&gt;

&lt;p&gt;Not in chat. Through a tool-calling setup I wired myself, where the model reaches for tools on its own.&lt;/p&gt;

&lt;p&gt;It reached for a tool called "Math." That tool does not exist. It made it up, answered with full confidence, and did the same thing again on a second machine running identical config.&lt;/p&gt;

&lt;p&gt;In plain chat, the same model answered 56 without a problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Failures, Not One
&lt;/h2&gt;

&lt;p&gt;The obvious one is that it couldn't do tool-calling. Math and tool-calling are separate skills, trained separately, and this model had one and not the other.&lt;/p&gt;

&lt;p&gt;The failure underneath is the one that matters.&lt;/p&gt;

&lt;p&gt;It didn't know it was guessing.&lt;/p&gt;

&lt;p&gt;It produced a mechanism it had no basis for and delivered it in the same voice it uses for things it actually knows. No hedge, no flag, no difference in tone between the real part and the invented part.&lt;/p&gt;

&lt;p&gt;That's not an AI problem. That's the oldest reporting failure there is, running inside a model instead of inside a document.&lt;/p&gt;




&lt;h2&gt;
  
  
  I Already Had a Name for It
&lt;/h2&gt;

&lt;p&gt;I built the Cybersecurity Intelligence Framework around three categories, because reports don't get rejected for wrong findings. They get rejected for claims sitting in the wrong category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proven.&lt;/strong&gt; You can point at what supports it. A log line, a response body, a screenshot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inferred.&lt;/strong&gt; Concluded from evidence, not directly stated. Say &lt;em&gt;consistent with&lt;/em&gt;, not &lt;em&gt;proves&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assumed.&lt;/strong&gt; No source yet. Name it, don't bury it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✗  "The attacker accessed the database."
     no source. stated as fact. category error.

✓  "An authenticated session accessed the database at 02:14,
    consistent with the observed pattern."
     same evidence. defensible.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same evidence. Completely different standing.&lt;/p&gt;

&lt;p&gt;The model did exactly what the top line does. Took something with no source and stated it as fact. The difference is it can't be taught to catch itself, so the catch has to happen outside it.&lt;/p&gt;

&lt;p&gt;Which gives you two jobs. Find where it starts guessing. Then read what it hands back like a report you have to defend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Job One: Find the Ceiling
&lt;/h2&gt;

&lt;p&gt;Run it twice before you depend on it.&lt;/p&gt;

&lt;p&gt;Level one: the simplest version of the task, answer you already know.&lt;/p&gt;

&lt;p&gt;Level two: same task, wrapped in the structure you actually plan to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Level 1 - simple, known answer
&lt;/span&gt;&lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7 x 8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# -&amp;gt; "56"   holds
&lt;/span&gt;
&lt;span class="c1"&gt;# Level 2 - same model, wrapped in tool-calling
&lt;/span&gt;&lt;span class="nf"&gt;run_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7 x 8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# -&amp;gt; calls tool "Math" (invented)
&lt;/span&gt;                               &lt;span class="c1"&gt;# -&amp;gt; confident answer, false mechanism
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reliability at level one tells you nothing about level two. If it holds at one and breaks at two, that gap is the ceiling.&lt;/p&gt;

&lt;p&gt;Build under it.&lt;/p&gt;

&lt;p&gt;Security already works this way. Burp Suite exists because nobody trusts what a browser reports at face value. An AI that invents a tool and a server that returns a clean response it should have rejected are the same failure in different clothes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Job Two: Read the Output Like a Report
&lt;/h2&gt;

&lt;p&gt;Everything it gives back goes through the same three categories.&lt;/p&gt;

&lt;p&gt;Which parts can you point at a source for. Which parts are reasonable but unverified. Which parts came from nowhere and got stated anyway.&lt;/p&gt;

&lt;p&gt;It won't mark them for you. One voice for all three.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Did With It
&lt;/h2&gt;

&lt;p&gt;I run two environments, one for hunting and one for building, carrying the same local AI layer so a tool written for one runs on the other unchanged.&lt;/p&gt;

&lt;p&gt;The tool that hallucinated got built, tested, and removed.&lt;/p&gt;

&lt;p&gt;I didn't remove the AI. Direct chat and single-file generation held up fine. Multi-step autonomy didn't. So the automation runs the rote weight, capturing findings, drafting from the ledger, ranking scan output, and stops at every point where being wrong costs something. Those points are mine.&lt;/p&gt;

&lt;p&gt;The ceiling test is what told me where to draw that line.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's in the Toolkit
&lt;/h2&gt;

&lt;p&gt;Twelve chapters, three parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part I&lt;/strong&gt; is how you think before touching anything. Treating the model as an opponent instead of an assistant. A six-step loop that takes a raw thought through capture, external testing, and defense before it earns a place anywhere. The ceiling test. A test for whether you needed to build a tool at all or whether a conversation with the right constraints already does the job. Learning a new team by what people actually own instead of what their title says. Compressing a concept to one sentence with no technical words. Then the three categories in full.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part II&lt;/strong&gt; is what to use and where to go. Real tool names by role: recon, intercept, pipeline, monitoring, and where the AI layer sits among them. A five-step certification path, ordered, prices and links included. Five prompts you paste your own situation into.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part III&lt;/strong&gt; is where each of these got tested and what it cost when it failed.&lt;/p&gt;

&lt;p&gt;The recon workflow the loadout compresses is in the Bug Bounty Starter Kit. The reasoning system behind the three categories is in the CIF. This one sits across both.&lt;/p&gt;




&lt;p&gt;Free preview covers the posture and the ceiling test. Enough to run on something today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tagzauthor.com/l/ai-cyber-preview" rel="noopener noreferrer"&gt;www.tagzauthor.com/l/ai-cyber-preview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Support TagzAuthor: &lt;a href="https://ko-fi.com/tagzauthor" rel="noopener noreferrer"&gt;ko-fi.com/tagzauthor&lt;/a&gt;&lt;br&gt;
My author page: &lt;a href="https://amazon.com/stores/author/B0DGDTFWZY" rel="noopener noreferrer"&gt;Amazon Bookstore&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cybersecurity</category>
      <category>beginners</category>
      <category>security</category>
    </item>
    <item>
      <title>Your Cybersecurity Report Gets Rejected. It's Not Because the Finding Is Wrong.</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Tue, 09 Jun 2026 15:31:16 +0000</pubDate>
      <link>https://dev.to/tagzauthor/your-cybersecurity-report-gets-rejected-its-not-because-the-finding-is-wrong-1fa0</link>
      <guid>https://dev.to/tagzauthor/your-cybersecurity-report-gets-rejected-its-not-because-the-finding-is-wrong-1fa0</guid>
      <description>&lt;h1&gt;
  
  
  Your Cybersecurity Report Gets Rejected. It's Not Because the Finding Is Wrong.
&lt;/h1&gt;

&lt;p&gt;The report comes back. No explanation at first — just a rejection.&lt;/p&gt;

&lt;p&gt;The finding was real. The vulnerability existed. The log proved it. But the report said "the attacker accessed the database" when all it could actually prove was "an authenticated session accessed the database at 2:14AM."&lt;/p&gt;

&lt;p&gt;One embedded assumption. That's all it takes.&lt;/p&gt;

&lt;p&gt;That gap — between knowing what happened and being able to say it in a way that holds up — is where most cybersecurity output breaks down. Not at the finding. At the reasoning.&lt;/p&gt;

&lt;p&gt;I'm a cybersecurity student who kept running into this pattern across bug bounty, lab work, and academic research. The finding was usually right. The structure around it wasn't. So I built a framework to fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem
&lt;/h2&gt;

&lt;p&gt;Most cybersecurity training teaches you what to look for. Very little teaches you how to reason about what you find.&lt;/p&gt;

&lt;p&gt;You end up with the right information and the wrong structure. Reports that don't survive review. Bug bounty findings marked N/A. Research proposals that collapse under questioning. All the same root cause — the reasoning wasn't made visible.&lt;/p&gt;

&lt;p&gt;The intelligence cycle has been around for decades. Proven, inferred, assumed — these aren't new ideas. What's missing is an operational version. Something you can actually run on a real problem, with AI prompts that execute each stage so the output is defensible the first time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fixed Version
&lt;/h2&gt;

&lt;p&gt;The broken report said: &lt;em&gt;"The attacker accessed the customer database."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The defensible version: &lt;em&gt;"An authenticated session accessed the customer database at 2:14AM. Based on IP geolocation and session timing, this is consistent with the observed threat actor pattern."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Same evidence. Completely different standing.&lt;/p&gt;

&lt;p&gt;The difference is one word: &lt;em&gt;consistent with&lt;/em&gt;. That's the line between a proven claim and an inferred one. Most people don't know they're crossing it until someone challenges the report.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The Cybersecurity Intelligence Framework is my attempt to make this operational.&lt;/p&gt;

&lt;p&gt;Five-stage intelligence cycle with a trigger question, real example, and AI prompt at each stage. Four reasoning modules — Strategic, Adaptive, Perceptual, Attribution — with a routing guide so you use the right lens for the right problem. An evidence discipline section that names the three categories every claim falls into and the five errors that kill reports. Four output templates with companion prompts. And a master prompt that takes any situation, routes it through the full framework, produces a first draft, and labels every inference and assumption explicitly.&lt;/p&gt;

&lt;p&gt;The AI handles the structure. You handle the accuracy. That division is the whole system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who It's Actually For
&lt;/h2&gt;

&lt;p&gt;Not just students. Anyone who needs to produce defensible cybersecurity output consistently — junior analysts writing first threat reports, bug bounty hunters whose findings keep getting marked informative, IT workers presenting security findings to management, researchers who need conclusions that survive peer review.&lt;/p&gt;

&lt;p&gt;The problem is universal. The domain just happens to be cybersecurity.&lt;/p&gt;




&lt;p&gt;Free preview is available — enough to understand the core problem and see the framework in action before committing to the full guide.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.tagzauthor.com/l/cyber-intel-preview" rel="noopener noreferrer"&gt;www.tagzauthor.com/l/cyber-intel-preview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More frameworks and guides coming. This is just the start.&lt;/p&gt;

&lt;p&gt;Support TagzAuthor: &lt;a href="//ko-fi.com/tagzauthor"&gt;ko-fi.com/tagzauthor&lt;/a&gt;&lt;br&gt;
My author page: &lt;a href="//amazon.com/stores/author/B0DGDTFWZY"&gt;Amazon Bookstore&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Finally Finished the Tool I Abandoned — Here's What GitHub Copilot Actually Did</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Sun, 07 Jun 2026 05:47:01 +0000</pubDate>
      <link>https://dev.to/tagzauthor/i-finally-finished-the-tool-i-abandoned-heres-what-github-copilot-actually-did-801</link>
      <guid>https://dev.to/tagzauthor/i-finally-finished-the-tool-i-abandoned-heres-what-github-copilot-actually-did-801</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Most people trying to record an audiobook fail before they ever hit record. Not because their voice is wrong or their book isn't ready, but because they lack a system for recording. They sit down, attempt a whole chapter, hit a wall twenty minutes in, and walk away with inconsistent audio that's harder to edit than it should be.&lt;/p&gt;

&lt;p&gt;ATTUNE structures the recording before it starts. Paste a chapter, get a set of 30-minute session windows with vocal load scoring, cold read risk flags, and a performance register on each one. Built for a phone in a quiet room — no studio, no equipment budget, no production team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisfnbzjadwhr1qiukbui.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%2Fisfnbzjadwhr1qiukbui.png" alt=" " width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjk7cc4idhrc9kynfua07.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%2Fjk7cc4idhrc9kynfua07.png" alt=" " width="799" height="225"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/FlowArchitect895/attune" rel="noopener noreferrer"&gt;github.com/FlowArchitect895/attune&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;The spec for this existed before the challenge. A detailed one — problem identified, features mapped, logic described. No code. Just a notes file that had been sitting there because there was always something more urgent.&lt;/p&gt;

&lt;p&gt;The Finish-Up-A-Thon was the forcing function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; A spec. A problem statement. No working tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknh5ixwwmckfiho8r5eo.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%2Fknh5ixwwmckfiho8r5eo.png" alt=" " width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; A working MVP with three features the original spec didn't include — Vocal Load Scoring, Cold Read Risk Detection, and Performance Register Analysis. Those weren't planned. They came out of actually building the thing and noticing what was missing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsnpfcybpl6lq26iy1or.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%2Ftsnpfcybpl6lq26iy1or.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweu0mmxz1j5n3gajf0mj.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%2Fweu0mmxz1j5n3gajf0mj.png" alt=" " width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Copilot didn't write this app. It extended it — three times, at three specific points where I knew what I needed but hadn't written it yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Export Plan
&lt;/h3&gt;

&lt;p&gt;First ask: generate a function that exports the session plan as a downloadable markdown file. Copilot scaffolded the entire thing — Blob creation, URL generation, auto-download. One prompt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07zfacjmhg3k24mlg34e.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%2F07zfacjmhg3k24mlg34e.png" alt=" " width="354" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frssieezw3l6mzor5dmgp.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%2Frssieezw3l6mzor5dmgp.png" alt=" " width="800" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cold Read Risk Detection
&lt;/h3&gt;

&lt;p&gt;This one wasn't in the original spec. The idea came mid-build: authors sight-reading dense sentences mid-session is where takes get ruined. Flag those sentences before recording starts.&lt;/p&gt;

&lt;p&gt;Copilot wrote the detection logic and integrated it into the existing analysis function. First pass was too aggressive — flagging short sentences that didn't need it. One refinement prompt fixed the thresholds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwny5vrwktspu73e1esf.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%2Fuwny5vrwktspu73e1esf.png" alt=" " width="394" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjhe1qzsitj9rggmdmoa.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%2Fjjhe1qzsitj9rggmdmoa.png" alt=" " width="353" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Register Detection
&lt;/h3&gt;

&lt;p&gt;The deepest one. Asked Copilot to analyze each session's dominant emotional register using keyword frequency — TENSION, GRIEF, INTROSPECTION, DIALOGUE, ACTION, EXPOSITION — and surface it as a badge with a one-line performance note.&lt;/p&gt;

&lt;p&gt;That single feature shifted what ATTUNE is. Not just a scheduler. A director.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0ghrjyxlv7u6sjjmgjy.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%2Fo0ghrjyxlv7u6sjjmgjy.png" alt=" " width="389" height="808"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Studio Anywhere Checklist
&lt;/h3&gt;

&lt;p&gt;Eight items. No professional equipment assumed. The checklist exists because the tool is built for people who don't have studios — which is most of the people who want to make audiobooks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30wn3h2vd5klgxi5ht2e.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%2F30wn3h2vd5klgxi5ht2e.png" alt=" " width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Progress Tracking
&lt;/h3&gt;

&lt;p&gt;Mark sessions done as you record. Watch the bar fill. No score, no gamification — just accumulation of real work completed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fomxd8irnxc6vp508u63v.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%2Fomxd8irnxc6vp508u63v.png" alt=" " width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cs6qg1h82q4qu7e7ubv.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%2F3cs6qg1h82q4qu7e7ubv.png" alt=" " width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>writing</category>
    </item>
    <item>
      <title>I Built a Tool That What Actually Happens When You Let an AI Agent Hunt Your Own Blind Spots</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Sun, 31 May 2026 03:31:32 +0000</pubDate>
      <link>https://dev.to/tagzauthor/i-built-a-tool-that-what-actually-happens-when-you-let-an-ai-agent-hunt-your-own-blind-spots-4nma</link>
      <guid>https://dev.to/tagzauthor/i-built-a-tool-that-what-actually-happens-when-you-let-an-ai-agent-hunt-your-own-blind-spots-4nma</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;: Write About Hermes Agent&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The Tool That Investigated Me While I Was Building It
&lt;/h1&gt;

&lt;p&gt;I didn't plan ECHO Hunt.&lt;/p&gt;

&lt;p&gt;It came out of a simple question I kept sitting with: when you build something with AI, did you actually learn anything — or did the AI just carry you through it and you called it progress?&lt;/p&gt;

&lt;p&gt;That question has weight when you're building alone. No CS degree, no bootcamp, no senior developer to tell you what you missed. Just you, an AI, and a string of errors that may or may not mean anything. That's how I build. That's how most people building with AI today build. And nobody has a tool that tells you the truth about what actually happened in a session.&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the idea actually came from
&lt;/h2&gt;

&lt;p&gt;Vibe coding is how I build. How most people build with AI now. You describe what you want, the AI generates it, you run it, fix errors, iterate. You ship something real. But there's a problem nobody talks about: you have no idea what you actually learned vs what the AI just did for you.&lt;/p&gt;

&lt;p&gt;The forensic framing came naturally. I study Digital Forensics. My research group spent months building an academic proposal on IoT cybersecurity challenges in the Caribbean. I know what it means to investigate something without the right tools, without the right lab, without the institutional support that makes forensic methodology accessible.&lt;/p&gt;

&lt;p&gt;That gap between what the framework assumes and what actually exists — that's the same gap between what vibe coding produces and what the builder actually retains.&lt;/p&gt;

&lt;p&gt;ECHO Hunt applies forensic investigation logic to a vibe coding session. Not as a metaphor. As a structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cognitive TTPs
&lt;/h2&gt;

&lt;p&gt;Before I built anything, I needed a framework for what "blind spots" actually means. I didn't want a vague "learning reflection" tool. I wanted something that could name what went wrong the way a forensic report names evidence.&lt;/p&gt;

&lt;p&gt;Four cognitive TTPs — Tactics, Techniques, and Procedures, borrowed directly from MITRE ATT&amp;amp;CK framing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Borrowed Confidence&lt;/strong&gt; — you accepted AI output without verifying it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shallow Resolution&lt;/strong&gt; — you fixed the error without understanding why it existed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Blindness&lt;/strong&gt; — you repeated the same error class multiple times without recognizing it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premature Exit&lt;/strong&gt; — you moved on before your understanding was solid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't personality judgments. They're patterns of behavior that appear in session logs. Observable. Huntable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Hermes Agent specifically
&lt;/h2&gt;

&lt;p&gt;The build needed something that could reason across an entire session log — not just summarize it, but investigate it. Form hypotheses before analyzing. Hunt each one against the evidence. Return structured output that the game layer could use without any additional AI calls during gameplay.&lt;/p&gt;

&lt;p&gt;That's an agentic task, not a prompt task. A single LLM call can summarize. An agent can investigate.&lt;/p&gt;

&lt;p&gt;Hermes Agent's skills system made this real. I created a custom skill called &lt;code&gt;echo-hunt&lt;/code&gt; — procedural memory that Hermes loads and executes as a reusable investigation procedure. One call via &lt;code&gt;hermes -z&lt;/code&gt; and the entire hunt runs: hypotheses formed, evidence collected, TTPs mapped, attribution challenges generated with locked correct answers and plausible distractors.&lt;/p&gt;

&lt;p&gt;Everything pre-computed before gameplay starts. Zero AI calls during the investigation. The game runs entirely on cached data.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part I didn't expect
&lt;/h2&gt;

&lt;p&gt;I built the game layer to eliminate hallucination on the Evidence Integrity score. The first version of ECHO had Hermes generating a number — and it kept changing on identical inputs. Meaningless.&lt;/p&gt;

&lt;p&gt;The fix was architectural. Remove the generated score entirely. Calculate it from player behavior instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each TTP attribution you get right or wrong&lt;/li&gt;
&lt;li&gt;Each pre-hunt declaration that matches or misses Hermes's findings&lt;/li&gt;
&lt;li&gt;Each confirmed finding weighted by severity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hermes provides the evidence. You interact with it. Your decisions produce the number.&lt;/p&gt;

&lt;p&gt;That shift — from AI-generated to player-computed — is what made ECHO Hunt honest. The score isn't Hermes's opinion of your session. It's a record of how accurately you read your own blind spots.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Hermes found about me
&lt;/h2&gt;

&lt;p&gt;I ran ECHO Hunt on the session where I built ECHO Hunt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shallow Resolution [MODERATE]:&lt;/strong&gt; Configuration issues were handled by repeatedly replacing files rather than analyzing why the specific settings were failing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Borrowed Confidence [HIGH]:&lt;/strong&gt; Acceptance of a large-scale UI rewrite immediately following a minor skill update, assuming the logic was correct without testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premature Exit [LOW]:&lt;/strong&gt; Using a wait-time heuristic to resolve a loading screen issue instead of implementing a proper readiness check.&lt;/p&gt;

&lt;p&gt;The confirmed finding that hit hardest:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"The sequence of 'still not working' → 'try changing format' → 'config is getting corrupted' → 'paste in a clean config' shows a lack of diagnostic precision."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's not a generated critique. That's evidence from my own session. I spent hours trying to get the Hermes gateway API server running on port 8642. Every attempt fixed the surface. None of them diagnosed the root cause. Eventually I pivoted to &lt;code&gt;hermes -z&lt;/code&gt; as a CLI approach — which worked immediately. Shallow Resolution, confirmed.&lt;/p&gt;

&lt;p&gt;The tool I built to catch blind spots caught mine. That's either ironic or exactly the point. Probably both.&lt;/p&gt;




&lt;h2&gt;
  
  
  The cultural layer
&lt;/h2&gt;

&lt;p&gt;There's no forensic lab in Jamaica built for this. No senior dev ecosystem, no bootcamp pipeline that hands you a structured environment and says "learn here." What exists is curiosity, whatever tools you can access, and the willingness to figure it out.&lt;/p&gt;

&lt;p&gt;That's just the reality. And it shaped everything about how ECHO Hunt was built and who it's for.&lt;/p&gt;

&lt;p&gt;The self-taught builder outside formal systems doesn't need another tutorial. They need something that tells them the truth about what happened in the session they just finished — not what the AI thinks they learned, but what the evidence shows. The gap between those two things is where real growth either happens or doesn't.&lt;/p&gt;

&lt;p&gt;ECHO Hunt exists in that gap. It treats your thinking like it matters enough to investigate. Not because you went to the right school or work at the right company — but because you showed up, built something, and deserve to know what you actually walked away with.&lt;/p&gt;

&lt;p&gt;That's what a tool for the Caribbean builder looks like. That's what I wanted to make real.&lt;/p&gt;




&lt;p&gt;🎥 &lt;a href="https://www.loom.com/share/43ddc4415759408fa705904d8abbbcf4" rel="noopener noreferrer"&gt;Watch the full demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/FlowArchitect895/echo-hunt" rel="noopener noreferrer"&gt;github.com/FlowArchitect895/echo-hunt&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a Cognitive Threat Hunter on Hermes Agent — It Analyzed the Session Where I Built It and Found Three Blind Spots</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Sun, 31 May 2026 02:59:39 +0000</pubDate>
      <link>https://dev.to/tagzauthor/i-built-a-cognitive-threat-hunter-on-hermes-agent-it-analyzed-the-session-where-i-built-it-and-28p1</link>
      <guid>https://dev.to/tagzauthor/i-built-a-cognitive-threat-hunter-on-hermes-agent-it-analyzed-the-session-where-i-built-it-and-28p1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;: Build With Hermes Agent&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;ECHO Hunt — a cognitive threat hunter for vibe coding sessions built on Hermes Agent.&lt;/p&gt;

&lt;p&gt;Vibe coding is how most people build with AI today. You describe what you want, the AI generates it, you run it, fix errors, iterate. It works. But did you actually learn anything, or did the AI just carry you through it?&lt;/p&gt;

&lt;p&gt;ECHO Hunt finds out. Paste your session log, declare your blind spots before the evidence arrives, then face what Hermes actually found.&lt;/p&gt;

&lt;p&gt;It's not a report generator. It's an investigation you participate in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0pw64pmw76dysilnkwf.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%2Fi0pw64pmw76dysilnkwf.png" alt=" " width="799" height="401"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🎥 &lt;a href="https://www.loom.com/share/43ddc4415759408fa705904d8abbbcf4" rel="noopener noreferrer"&gt;Watch the full demo&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/FlowArchitect895/echo-hunt" rel="noopener noreferrer"&gt;github.com/FlowArchitect895/echo-hunt&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hermes Agent + echo-hunt skill&lt;/li&gt;
&lt;li&gt;Node.js + Express&lt;/li&gt;
&lt;li&gt;Vanilla HTML/CSS/JS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Used Hermes Agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The echo-hunt skill
&lt;/h3&gt;

&lt;p&gt;Hermes Agent runs a custom skill called &lt;code&gt;echo-hunt&lt;/code&gt;. It takes a vibe coding session log and performs a cognitive forensic hunt — forming hypotheses before analyzing anything, hunting each one against the evidence, and mapping findings to four cognitive TTPs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Borrowed Confidence&lt;/strong&gt; — accepted AI output without verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shallow Resolution&lt;/strong&gt; — fixed the error, didn't understand why&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Blindness&lt;/strong&gt; — repeated the same error class without noticing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premature Exit&lt;/strong&gt; — moved on before understanding was solid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x0x7fpy1qild0sgtvxr.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%2F0x0x7fpy1qild0sgtvxr.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The architecture
&lt;/h3&gt;

&lt;p&gt;ECHO Hunt calls &lt;code&gt;hermes -z&lt;/code&gt; with the echo-hunt skill prompt. One call. Hermes pre-computes the entire investigation — hypotheses, findings, TTP classifications, attribution challenges with locked correct answers and plausible distractors. Zero API calls during gameplay. Everything runs on cached data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp08jkfc9tlz6dskqtqei.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%2Fp08jkfc9tlz6dskqtqei.png" alt=" " width="799" height="249"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The declaration layer
&lt;/h3&gt;

&lt;p&gt;Before Hermes hunts, you declare your blind spots. Three questions. You commit to answers before the evidence arrives. This is the adversarial layer — you vs your own perception of what happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpk71po1za7rf9l8p5m4.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%2Ftpk71po1za7rf9l8p5m4.png" alt=" " width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The confrontation layer
&lt;/h3&gt;

&lt;p&gt;Your declarations face what Hermes found. Three outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal&lt;/strong&gt; — you caught what Hermes caught&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ghost&lt;/strong&gt; — Hermes found something you missed entirely&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise&lt;/strong&gt; — you flagged something Hermes didn't&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fes57p8vsiegmyjotcqke.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%2Fes57p8vsiegmyjotcqke.png" alt=" " width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The challenge layer
&lt;/h3&gt;

&lt;p&gt;Each confirmed finding becomes a TTP attribution challenge. 4 options, 20-second timer. Wrong answer drops integrity 10%. Correct answer earns points. The timer is the pressure — forensic decisions don't wait.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8bh3gjux2nf7jqofpmm.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%2Fe8bh3gjux2nf7jqofpmm.png" alt=" " width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kyfdu0hqcmrujlss1v7.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%2F8kyfdu0hqcmrujlss1v7.png" alt=" " width="800" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmh6z365ykeqtslk2ouq.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%2Frmh6z365ykeqtslk2ouq.png" alt=" " width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The verdict
&lt;/h3&gt;

&lt;p&gt;The Evidence Integrity score is computed from actual player behavior — signals vs ghosts, correct vs wrong TTP attributions. Hermes doesn't generate the number. You produce it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8z2iziq7dzdmkbyseuyn.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%2F8z2iziq7dzdmkbyseuyn.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  What Hermes found about me
&lt;/h3&gt;

&lt;p&gt;I ran ECHO Hunt on the session where I built ECHO Hunt. Here's what it found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shallow Resolution [MODERATE]&lt;/strong&gt; — Configuration issues were handled by repeatedly replacing files rather than analyzing why the specific settings were failing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Borrowed Confidence [HIGH]&lt;/strong&gt; — Acceptance of a large-scale UI rewrite immediately following a minor skill update, assuming the logic was correct without testing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premature Exit [LOW]&lt;/strong&gt; — Using a wait-time heuristic to resolve a loading screen issue instead of implementing a proper readiness check&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The confirmed finding that hit hardest: &lt;em&gt;"The sequence of 'still not working' → 'try changing format' → 'config is getting corrupted' → 'paste in a clean config' shows a lack of diagnostic precision."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's not a generated critique. That's evidence from my own session, hunted by the tool I was building while I was building it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2qhg74ie9ybhemsnoad.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%2Fz2qhg74ie9ybhemsnoad.png" alt=" " width="799" height="474"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The Full Report
&lt;/h3&gt;

&lt;p&gt;The downloadable Cognitive Threat Report captures everything — pre-hunt declarations, hunt hypotheses, confirmed findings, TTPs with severity, genuine understanding moments, and next session focus. It's a real document, not a game summary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F079mi43m86htszlh302o.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%2F079mi43m86htszlh302o.png" alt=" " width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmu0uo2zixejyu0y3oa33.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%2Fmu0uo2zixejyu0y3oa33.png" alt=" " width="799" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What makes it different from a standard AI analysis: the pre-hunt declarations are locked in before Hermes runs. So the report shows not just what happened in the session, but the gap between what you thought happened and what the evidence shows. That delta is the most useful thing in it.&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>What Happens When the Breach Happens Somewhere the World Forgot to Defend</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Sun, 17 May 2026 04:36:09 +0000</pubDate>
      <link>https://dev.to/tagzauthor/what-happens-when-the-breach-happens-somewhere-the-world-forgot-to-defend-1fam</link>
      <guid>https://dev.to/tagzauthor/what-happens-when-the-breach-happens-somewhere-the-world-forgot-to-defend-1fam</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the Gemma 4 Challenge: Write About Gemma 4&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What Happens When the Breach Happens Somewhere the World Forgot to Defend
&lt;/h1&gt;

&lt;p&gt;I'm a 21-year-old Cybersecurity and Digital Forensics student at Caribbean Maritime University in Jamaica. My research group spent months building an academic proposal on IoT forensic challenges in the Caribbean — the gap in standards, the resource constraints, the fact that most forensic frameworks were designed for labs that don't exist here.&lt;/p&gt;

&lt;p&gt;That research sat in a document. It felt incomplete. Not wrong — just theoretical.&lt;/p&gt;

&lt;p&gt;Then I built Threat Trace in 12 days for the Gemma 4 Challenge and something clicked.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem I kept running into
&lt;/h2&gt;

&lt;p&gt;Caribbean institutions — hospitals, universities, government facilities — are deploying IoT devices at scale. Smart sensors, networked cameras, connected infrastructure. Most of it is third-party managed, under-resourced, and running firmware that hasn't been updated in years.&lt;/p&gt;

&lt;p&gt;When a breach happens, the forensic playbook assumes things that don't exist here. Dedicated forensic hardware. Large IT teams. Vendor support that shows up same-day. Regulatory frameworks that actually map to the local legal environment.&lt;/p&gt;

&lt;p&gt;None of that is guaranteed in Jamaica. Most of it isn't there at all.&lt;/p&gt;

&lt;p&gt;So when I started thinking about what to build for this challenge, I didn't want to build another generic demo. I wanted to build something that made the problem tangible — not a report you read and forget, but something you &lt;em&gt;feel&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a simulator and not a tool
&lt;/h2&gt;

&lt;p&gt;There's a difference between knowing forensic methodology and understanding why it matters.&lt;/p&gt;

&lt;p&gt;I've studied the 6-stage forensic process. I know what chain of custody means. But reading about it and &lt;em&gt;making a decision under pressure&lt;/em&gt; are different things. The second one sticks.&lt;/p&gt;

&lt;p&gt;I built Threat Trace so that when you choose to reboot a compromised sensor instead of isolating it first, you feel it. The integrity meter drops. The feedback tells you exactly what you just destroyed. And then you have to keep going with contaminated evidence.&lt;/p&gt;

&lt;p&gt;That's the lesson. Not a textbook explanation — the consequence.&lt;/p&gt;

&lt;p&gt;The game generates a full investigation from any IoT incident you describe. Gemma 4 31B reads your scenario and builds 6 forensic stages, each with real decision points, real evidence, and real consequences for wrong choices. At the end you download a forensic report — actual methodology, actual findings, usable outside the game.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I actually built it
&lt;/h2&gt;

&lt;p&gt;I didn't start with code. I started with a scenario.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"A smart water pressure sensor at a children's hospital in Mandeville began sending encrypted packets during maintenance windows — always 1AM-3AM, never consecutive nights. A nurse in the maternity ward noticed hot water pressure dropped every time the anomaly occurred."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wrote that prompt and fed it to Gemma 4 through the Google AI Studio API. What came back wasn't what I expected.&lt;/p&gt;

&lt;p&gt;Gemma didn't just map an attack technique. It identified a function in the generated firmware called &lt;code&gt;trigger_valve_bleed()&lt;/code&gt; — called immediately before &lt;code&gt;send_encrypted_payload()&lt;/code&gt;. The physical pressure drop wasn't a side effect. It was a signal. The attacker was using the hospital's water valves as an out-of-band heartbeat to confirm successful exfiltration to a local observer.&lt;/p&gt;

&lt;p&gt;I didn't tell Gemma to find that. It reasoned to it from context.&lt;/p&gt;

&lt;p&gt;It also caught that the non-consecutive timing was deliberate evasion of threshold monitors. And it noted that a nurse — not IT, not a SIEM alert — was the first line of detection. That detail is the most Caribbean thing in the whole report. And Gemma put it there.&lt;/p&gt;

&lt;p&gt;That's when I knew the model could carry this build.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture decision that made it free to run
&lt;/h2&gt;

&lt;p&gt;One API call per investigation. That's it.&lt;/p&gt;

&lt;p&gt;When you submit a scenario, Gemma generates everything upfront — all 6 stages, every choice, every consequence, every narrative, the full report. During gameplay there are zero API calls. Every response is instant because it's already computed.&lt;/p&gt;

&lt;p&gt;This matters because the communities this tool is meant for can't afford per-request costs at scale. Front-loading the generation makes free 24/7 deployment viable. Cached scenarios cost nothing to replay.&lt;/p&gt;

&lt;p&gt;The structured JSON output from Gemma 4 was critical here. The model's thinking mode can produce loose text that breaks parsing. Forcing the output format through the API config takes the parse failure rate from around 50% to near-perfect. The game state is deterministic — the correct answer is pre-computed, so scoring requires no AI at runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Gemma 4 31B specifically
&lt;/h2&gt;

&lt;p&gt;Three reasons that weren't negotiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context window.&lt;/strong&gt; IoT incidents don't happen in isolation. Logs from 12 sensors, network captures, firmware analysis, infrastructure context — it all needs to be in one prompt for the model to reason across it. Gemma 4 31B's 256K context window handles that. Most open models cap at 8K-32K. That's not enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output.&lt;/strong&gt; The game lives or dies on clean JSON. Gemma 4 delivers it when you configure the output correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open model.&lt;/strong&gt; The whole point of this build is accessibility. Using a closed API to solve an accessibility problem is a contradiction. Gemma is open. Anyone can run it locally, self-host it, extend it. That matters for the communities this is built for.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Caribbean context actually changes
&lt;/h2&gt;

&lt;p&gt;Most forensic simulators are built for abstract environments. Generic corporations, unnamed cities, fictional institutions.&lt;/p&gt;

&lt;p&gt;Every case Threat Trace generates is grounded in real Caribbean constraints — NWC managing critical hospital infrastructure remotely, university IT volunteers running forensic investigations with borrowed hardware, JCF Cybercrime Unit reporting requirements, the Jamaica Cybercrime Act.&lt;/p&gt;

&lt;p&gt;When Gemma generates a case set in Mandeville or St. Elizabeth, it doesn't just change the location. It changes the available resources, the institutional dynamics, the observation chain. The Mandeville hospital case had a nurse as the first line of detection because the IT team was small and overwhelmed. Gemma inferred that from the context I gave it.&lt;/p&gt;

&lt;p&gt;That specificity is what makes the tool feel real rather than academic.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually learned
&lt;/h2&gt;

&lt;p&gt;I started this as a student who'd written a research proposal about IoT forensics in the Caribbean. I finished it having built something that demonstrates the problem more clearly than the proposal did.&lt;/p&gt;

&lt;p&gt;The 40/60 score and 70% evidence integrity on my first run through my own simulator told me more about my actual forensic decision-making than any exam has.&lt;/p&gt;

&lt;p&gt;Gemma 4 didn't just power the build. It challenged me inside it.&lt;/p&gt;

&lt;p&gt;That's what an open model at this capability level makes possible — not just better apps, but tools that give real feedback to the people who need it most, running in environments that can't afford anything else.&lt;/p&gt;




&lt;p&gt;🎮 &lt;a href="https://threat-trace.onrender.com" rel="noopener noreferrer"&gt;Play Threat Trace →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/FlowArchitect895/Threat-Trace" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>I Built an IoT Forensic Investigation Simulator Powered by Gemma 4 — Paste Any Incident, Get a Full Case with Evidence, Decisions, and a Forensic Report</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Sat, 16 May 2026 07:00:53 +0000</pubDate>
      <link>https://dev.to/tagzauthor/i-built-an-iot-forensic-investigation-simulator-powered-by-gemma-4-paste-any-incident-get-a-full-239n</link>
      <guid>https://dev.to/tagzauthor/i-built-an-iot-forensic-investigation-simulator-powered-by-gemma-4-paste-any-incident-get-a-full-239n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the Gemma 4 Challenge: Build with Gemma 4&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built Threat Trace — an IoT forensic investigation simulator that takes any incident scenario and turns it into a playable 6-stage investigation, powered by Gemma 4 31B.&lt;/p&gt;

&lt;p&gt;You describe an incident. Gemma reads it and generates a complete forensic case — real evidence, real decision points, real consequences. Every stage puts you in front of a choice. Wrong calls contaminate your evidence or break chain of custody. At the end you get a downloadable forensic report you can actually use.&lt;/p&gt;

&lt;p&gt;This isn't a quiz. It's a training tool built for people who don't have access to expensive forensic labs — specifically designed around the Caribbean institutional context: small IT teams, limited hardware, JCF Cybercrime Unit reporting requirements, and the kinds of incidents that actually happen here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqavsdf6nkv54iv4inqs0.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%2Fqavsdf6nkv54iv4inqs0.png" alt="Threat Trace landing screen showing case title, score tracker, integrity meter, and the Mandeville Maternity Pressure Leak incident summary" width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🎮 &lt;a href="https://threat-trace.onrender.com" rel="noopener noreferrer"&gt;Play Threat Trace →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try the pre-loaded scenarios or paste your own IoT incident. Every input generates a unique case.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/FlowArchitect895/Threat-Trace" rel="noopener noreferrer"&gt;github.com/FlowArchitect895/Threat-Trace&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;I chose &lt;strong&gt;Gemma 4 31B Dense&lt;/strong&gt;. Here's why that was the only real option for this project.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture: Front-load everything
&lt;/h3&gt;

&lt;p&gt;Gemma does all the heavy work once — at generation. When you submit a scenario, one API call produces the entire investigation: all 6 stages, every choice, every consequence, every narrative, and the final report. During actual gameplay there are zero API calls. Every response is instant because it's already been computed.&lt;/p&gt;

&lt;p&gt;This makes free 24/7 deployment viable. Cached scenarios cost nothing to replay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftrxxipwy7qiop02c9tcj.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%2Ftrxxipwy7qiop02c9tcj.png" alt="Stage 1 of 6 — Identification. The hospital IT team is alerted by nursing staff. Evidence: NetFlow logs showing bursts of 512KB packets to a non-NWC IP address in Eastern Europe. Three choices presented to the investigator." width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why 31B Dense specifically
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;256K context window.&lt;/strong&gt; IoT incidents don't happen in isolation — they involve logs from multiple devices, network captures, firmware dumps, infrastructure context. I needed a model that could hold an entire incident in one prompt and reason across all of it. No other open model has that context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output reliability.&lt;/strong&gt; Gemma 4's thinking mode produces clean, parseable JSON when you force the output format correctly. Without it the parse failure rate is around 50%. With it — near perfect. The game state depends on deterministic output, so this wasn't optional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open model.&lt;/strong&gt; The whole point of this build is accessibility. Running on a closed API defeats that for the communities this tool is meant to serve.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Gemma actually does
&lt;/h3&gt;

&lt;p&gt;The depth surprised me. I threw this at it:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"A smart water pressure sensor at a children's hospital in Mandeville began sending encrypted packets during maintenance windows — always 1AM-3AM, never consecutive nights. A nurse in the maternity ward noticed hot water pressure dropped every time the anomaly occurred."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Gemma mapped it to &lt;strong&gt;T1041 — Exfiltration Over C2 Channel&lt;/strong&gt; and built the case around an Industrial IoT water pressure sensor. But it didn't stop at the attack technique. It identified that the pressure drop was caused by a function called &lt;code&gt;trigger_valve_bleed()&lt;/code&gt; — executed immediately before &lt;code&gt;send_encrypted_payload()&lt;/code&gt;. The physical action preceded the data transmission. That means the attacker was using valve actuation as an out-of-band heartbeat to confirm successful exfiltration to a local observer.&lt;/p&gt;

&lt;p&gt;It also caught that the non-consecutive timing wasn't random — it was deliberate evasion of basic threshold monitors. And it flagged the exfiltrated payload as internal VLAN mapping data, identifying the sensor as a pivot point for lateral movement, not the final target.&lt;/p&gt;

&lt;p&gt;A nurse found the breach. Not IT. Gemma put that in the analysis without being told to.&lt;/p&gt;

&lt;p&gt;That's adversarial reasoning. Not pattern matching.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswf3sj9d9s5tj0hhsgz2.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%2Fswf3sj9d9s5tj0hhsgz2.png" alt="Correct answer feedback — Stage 1. Implementing a mirrored SPAN port highlighted in green. Feedback reads: " width="799" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupu2tkhtq5z4iz7pd7lv.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%2Fupu2tkhtq5z4iz7pd7lv.png" alt="Incorrect answer feedback — Stage 2. " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Caribbean context layer
&lt;/h3&gt;

&lt;p&gt;This is what makes it different from a generic forensic simulator. Every generated case includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource constraints realistic to Jamaican institutions — the Mandeville case used university tools to compensate for limited forensic hardware budgets&lt;/li&gt;
&lt;li&gt;JCF Cybercrime Unit and Jamaica Cybercrime Act reporting requirements&lt;/li&gt;
&lt;li&gt;Third-party utility dependencies — NWC managing critical hospital infrastructure with no on-site visits in 8 months&lt;/li&gt;
&lt;li&gt;The human observation chain — a nurse, not a security system, was the first line of detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the most Caribbean thing in the report. And Gemma put it there without being told to.&lt;/p&gt;

&lt;p&gt;The downloadable report reflects all of this — not a game score, an actual forensic document.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flntqe29yqwkzo1d3n3td.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%2Flntqe29yqwkzo1d3n3td.png" alt="Forensic Investigation Report — top section. Shows incident summary, attack technique T1041, and device type: Industrial IoT Water Pressure Sensor." width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fint2fzami7h32jr3dfkr.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%2Fint2fzami7h32jr3dfkr.png" alt="Forensic Investigation Report — findings and Caribbean context. Documents the physical heartbeat mechanism, lateral movement campaign, and regional infrastructure challenges including NWC dependency and university tool partnerships. Score: 40/60 | Evidence Integrity: 70%" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Judging criteria mapped
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Intentional model selection&lt;/strong&gt; — 256K context for multi-artifact IoT scenarios, structured JSON for game state reliability, open model for the communities this serves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical implementation&lt;/strong&gt; — front-loaded generation, zero-cost runtime, structured output parsing, deterministic scoring with pre-computed consequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creativity&lt;/strong&gt; — IoT forensics as an interactive investigation with real physical consequence. A water pressure drop in a maternity ward as the first indicator of compromise. Caribbean context as a first-class feature, not an afterthought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usability&lt;/strong&gt; — three preloaded scenarios, open input for any incident, downloadable forensic report with real methodology output that investigators can actually use.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Most Beginners Approach Bug Bounty Completely Wrong</title>
      <dc:creator>Tariq Davis</dc:creator>
      <pubDate>Sat, 09 May 2026 01:24:17 +0000</pubDate>
      <link>https://dev.to/tagzauthor/most-beginners-approach-bug-bounty-completely-wrong-35oi</link>
      <guid>https://dev.to/tagzauthor/most-beginners-approach-bug-bounty-completely-wrong-35oi</guid>
      <description>&lt;h2&gt;
  
  
  &lt;u&gt;&lt;strong&gt;Bug Bounty Isn’t What You Think It Is&lt;/strong&gt;&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;By Tariq Davis&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m not a veteran bug bounty hunter.&lt;/p&gt;

&lt;p&gt;I’m a cybersecurity student who got curious about how people legally get paid to break systems. That curiosity pulled me into bug bounty, and the first thing I noticed was how messy the beginner information is.&lt;/p&gt;

&lt;p&gt;Most content either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;assumes you already know what you’re doing,&lt;/li&gt;
&lt;li&gt;or turns simple ideas into overly technical theory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I started building the kind of guide I wish I had when I began.&lt;/p&gt;

&lt;p&gt;No hype. No fake “make thousands overnight” promises.&lt;/p&gt;

&lt;p&gt;Just the actual framework.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;What Bug Bounty Actually Is&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bug bounty programs are simple in concept:&lt;/p&gt;

&lt;p&gt;Companies pay independent researchers to find and responsibly disclose vulnerabilities in their systems.&lt;/p&gt;

&lt;p&gt;You:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test systems that are in scope,&lt;/li&gt;
&lt;li&gt;find a vulnerability,&lt;/li&gt;
&lt;li&gt;write a report,&lt;/li&gt;
&lt;li&gt;submit it,&lt;/li&gt;
&lt;li&gt;and get paid if it’s valid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the model.&lt;/p&gt;

&lt;p&gt;What makes it interesting is the incentive structure behind it.&lt;/p&gt;

&lt;p&gt;The company wants weaknesses discovered before malicious actors find them. You get rewarded for helping expose those weaknesses legally and responsibly.&lt;/p&gt;

&lt;p&gt;It’s one of the few spaces where the attacker mindset and business incentives genuinely align.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;The Severity Ladder Beginners Misunderstand&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lot of beginners enter bug bounty thinking about massive payouts immediately.&lt;/p&gt;

&lt;p&gt;That mindset usually kills consistency before it even starts.&lt;/p&gt;

&lt;p&gt;Here’s the reality:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;P1 — Critical&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Remote code execution. Full account takeover. Large-scale compromise.&lt;/p&gt;

&lt;p&gt;Huge payouts.&lt;br&gt;
Not beginner territory.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;P2 — High&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authentication bypasses, major exposure issues, serious privilege escalation.&lt;/p&gt;

&lt;p&gt;Possible later on.&lt;br&gt;
Still difficult.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;P3 — Medium&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IDORs. Stored XSS. CSRF.&lt;/p&gt;

&lt;p&gt;This is where beginners should realistically focus.&lt;/p&gt;

&lt;p&gt;Real vulnerabilities. Real learning. Real payouts.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;P4 — Low&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Information disclosure. Open redirects. Missing security headers.&lt;/p&gt;

&lt;p&gt;A lot of first accepted reports land here.&lt;/p&gt;

&lt;p&gt;And honestly? That’s fine.&lt;/p&gt;

&lt;p&gt;A P4 still proves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your process worked,&lt;/li&gt;
&lt;li&gt;your report was accepted,&lt;/li&gt;
&lt;li&gt;and you successfully navigated a real security workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters more than chasing criticals on day one.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;The Real Skill Isn’t “Finding Bugs”&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the part most beginner content misses completely.&lt;/p&gt;

&lt;p&gt;Bug bounty isn’t just about running tools and hoping something appears.&lt;/p&gt;

&lt;p&gt;The real skill is learning how to understand systems.&lt;/p&gt;

&lt;p&gt;The best researchers spend huge amounts of time on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recon,&lt;/li&gt;
&lt;li&gt;mapping attack surfaces,&lt;/li&gt;
&lt;li&gt;identifying patterns,&lt;/li&gt;
&lt;li&gt;and understanding how applications behave.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re not just searching for vulnerabilities.&lt;/p&gt;

&lt;p&gt;You’re building a map.&lt;/p&gt;

&lt;p&gt;And once the map becomes clearer, the weaknesses become easier to notice.&lt;/p&gt;

&lt;p&gt;That shift in perspective changes everything.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;Why Most Beginners Burn Out&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lot of people approach bug bounty like a lottery system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;random target,&lt;/li&gt;
&lt;li&gt;random tools,&lt;/li&gt;
&lt;li&gt;random expectations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then they quit after finding nothing for weeks.&lt;/p&gt;

&lt;p&gt;But bug bounty is closer to pattern recognition than gambling.&lt;/p&gt;

&lt;p&gt;The early stage is mostly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;learning systems,&lt;/li&gt;
&lt;li&gt;improving observation,&lt;/li&gt;
&lt;li&gt;documenting behavior,&lt;/li&gt;
&lt;li&gt;and building methodology.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That foundation matters more than flashy payouts.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;Final Thoughts&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The free preview of the Bug Bounty Starter Kit was designed specifically for beginners who want a grounded introduction without the noise.&lt;/p&gt;

&lt;p&gt;It covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what bug bounty actually is,&lt;/li&gt;
&lt;li&gt;how severity works,&lt;/li&gt;
&lt;li&gt;and where beginners realistically belong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full guide expands from there into tooling, recon workflows, reporting structure, and practical execution.&lt;/p&gt;

&lt;p&gt;Free preview of the Bug Bounty Starter Kit:&lt;br&gt;
&lt;a href="https://www.tagzauthor.com/l/bugbounty-preview" rel="noopener noreferrer"&gt;https://www.tagzauthor.com/l/bugbounty-preview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More cybersecurity frameworks and beginner-focused guides are coming soon.&lt;/p&gt;

&lt;p&gt;Support TagzAuthor: &lt;a href="//ko-fi.com/tagzauthor"&gt;ko-fi.com/tagzauthor&lt;/a&gt;&lt;br&gt;
My author page: &lt;a href="//amazon.com/stores/author/B0DGDTFWZY"&gt;Amazon Bookstore&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>beginners</category>
      <category>security</category>
      <category>hacking</category>
    </item>
  </channel>
</rss>
