<?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: Emani Sai Shanmukha Srinivas</title>
    <description>The latest articles on DEV Community by Emani Sai Shanmukha Srinivas (@solomon1029).</description>
    <link>https://dev.to/solomon1029</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3779934%2F2362f993-d0c5-410f-8dd1-2c42b67ad8c6.png</url>
      <title>DEV Community: Emani Sai Shanmukha Srinivas</title>
      <link>https://dev.to/solomon1029</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solomon1029"/>
    <language>en</language>
    <item>
      <title>Supercharging ThreatOps: Why Google Cloud's Agentic AI Defense Changes the SOC Game</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Wed, 29 Apr 2026 03:24:58 +0000</pubDate>
      <link>https://dev.to/solomon1029/supercharging-threatops-why-google-clouds-agentic-ai-defense-changes-the-soc-game-58e3</link>
      <guid>https://dev.to/solomon1029/supercharging-threatops-why-google-clouds-agentic-ai-defense-changes-the-soc-game-58e3</guid>
      <description>&lt;p&gt;Tuning into the Google Cloud NEXT '26 keynotes this week felt like watching the future of security operations unfold in real-time. From Thomas Kurian's opening keynote on April 22 to the deep-dives in the Developer Keynote on April 23, the focus was unmistakable: the era of AI experimentation is over, and the Agentic Enterprise is officially here.  While the new Cloud Storage Rapid (hitting 15 TB/s) and the staggering scale of the new TPU 8t processors were impressive, the announcements that completely captured my attention were the launch of the Gemini Enterprise Agent Platform (the heavy-hitting evolution of Vertex AI) and the new Agentic AI Defense capabilities.  Here is my take on what these updates mean for developers building next-generation security tools, and how they perfectly align with the architecture of modern real-time SOC dashboards. The Shift to Autonomous Security Agents The most significant takeaway for security developers is Google's push towards autonomous agents for Threat Hunting and Detection Engineering. The introduction of tools like the Dark Web Intelligence agent, powered by the latest Gemini 3.1 Pro models, represents a massive leap in how we parse external events.  For developers, the new Agent Studio and Agent Development Kit (ADK) mean we are no longer just sending zero-shot prompts to an API; we are defining graph-based frameworks where specialized sub-agents collaborate to solve complex, multi-step problems in isolated, secure sandboxes.  Evolving the ThreatOps Architecture. When architecting ThreatOps, the primary goal was to create a real-time SOC dashboard that could autonomously handle threat classification and map incidents directly to the MITRE ATT&amp;amp;CK framework. The existing ingestion pipeline relies heavily on Databricks for stream processing, with the Gemini API generating the ML scoring baselines. However, orchestrating complex reasoning across high-velocity threat data can be a massive bottleneck. The announcements from Next '26 provide the exact native building blocks needed to evolve this kind of architecture : Sub-Second Inference with TPU 8i: Real-time threat classification requires absolute minimal latency. The new 8th-generation TPU 8i chips—optimized specifically for inference and reinforcement learning with their Boardfly topology—mean that ML scoring baselines can evaluate potential breaches and execute logic virtually instantaneously.  From APIs to Agentic Workflows: By migrating the current Gemini API integration over to the newly unified Gemini Enterprise Agent Platform, standard threat classification logic can be upgraded into a dedicated Detection Engineering agent. This allows the system to actively query enterprise databases like AlloyDB for historical context, maintaining a long-term understanding of previous attack patterns via the new Agent Memory Bank feature. Proactive Counter-Intelligence: Integrating the new Agent Security dashboard (powered by Security Command Center) means the platform can automatically map relationships between active agents and underlying models to scan for vulnerabilities, creating a closed-loop, proactive defense system. The Verdict: Beyond Surface-Level Automation. We are officially moving past the "reading the docs" phase of generative AI. The real power unveiled at Google Cloud NEXT '26 isn't just that the models are smarter; it's that the infrastructure is finally built to support multi-step, autonomous reasoning securely and at scale. For any developer building security pipelines, threat matrices, or enterprise dashboards, the Gemini Enterprise Agent Platform isn't just a rebrand of Vertex AI—it is a completely new paradigm for defensive engineering. I can't wait to refactor the pipeline and let these new agents loose on the data streams.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>EcoSentinel: An Agentic AI Auditor for Earth Day 🌍</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:04:47 +0000</pubDate>
      <link>https://dev.to/solomon1029/ecosentinel-an-agentic-ai-auditor-for-earth-day-43j5</link>
      <guid>https://dev.to/solomon1029/ecosentinel-an-agentic-ai-auditor-for-earth-day-43j5</guid>
      <description>&lt;p&gt;What I Built&lt;br&gt;
EcoSentinel is an autonomous, multimodal environmental monitoring agent. It is designed to act as a "Security Operations Center (SOC) for the Planet," using vision-language models to analyze ecological data—ranging from satellite imagery to local photos of industrial waste—and generate structured remediation plans.&lt;/p&gt;

&lt;p&gt;The core objective was to move beyond static data visualization and create an agent that can "see" environmental degradation, reason about regulatory compliance, and remember the history of a specific location to track its recovery over time.&lt;/p&gt;

&lt;p&gt;Demo link - &lt;a href="https://ai.studio/apps/45fd3395-6b00-4e5a-bb79-ea18db599750" rel="noopener noreferrer"&gt;https://ai.studio/apps/45fd3395-6b00-4e5a-bb79-ea18db599750&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test it you can try this&lt;/p&gt;

&lt;p&gt;Sector: Gran Chaco, Paraguay&lt;br&gt;
Coordinates: -21.432658, -59.578124&lt;/p&gt;

&lt;p&gt;Use the image below for the visual analysis&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%2F02tgxoqwu3oaxx8t1f49.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02tgxoqwu3oaxx8t1f49.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo of the same&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%2Fr4fuvg61uz3zssauszix.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%2Fr4fuvg61uz3zssauszix.png" alt=" " width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
How I Built It&lt;br&gt;
The project is built on an Agentic Workflow that prioritizes perception, memory, and verifiable identity:&lt;/p&gt;

&lt;p&gt;Multimodal Perception (Google Gemini 1.5 Flash): I used Gemini 1.5 Flash via Google AI Studio to process high-resolution images. The model identifies environmental "threats" (e.g., deforestation, oil spills, or illegal dumping) and maps them against ecological standards.&lt;/p&gt;

&lt;p&gt;Long-Term Memory (Backboard): To ensure the agent isn't just reacting to a single moment in time, I integrated Backboard. This allows EcoSentinel to store past audit results, enabling "Temporal Awareness." It can compare a new image of a site to one from six months ago to verify if restoration efforts are actually working.&lt;/p&gt;

&lt;p&gt;Agent Identity (Auth0 for Agents): To prevent spoofed reports and ensure accountability, I implemented Auth0 for Agents. Every audit report generated by EcoSentinel is cryptographically signed with a unique machine-identity, making the data trustworthy for regulatory bodies.&lt;/p&gt;

&lt;p&gt;Structured Reasoning: The agent doesn't just return text; it outputs structured JSON. This allows the data to be instantly piped into a dashboard or used to trigger automated alerts for environmental agencies.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;br&gt;
Best Use of Google Gemini: Leveraged Gemini 1.5 Flash for its massive context window and multimodal capabilities to analyze complex environmental imagery and output structured audit data.&lt;/p&gt;

&lt;p&gt;Best Use of Backboard: Integrated Backboard to give the agent persistent memory across sessions, allowing it to track ecological site history.&lt;/p&gt;

&lt;p&gt;Best Use of Auth0 for Agents: Used Auth0 to provide a verifiable identity for the AI agent, ensuring that every environmental report is authenticated and auditable.&lt;/p&gt;

&lt;p&gt;Created for the Weekend Challenge: Earth Day Edition 2026.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built a Tool That Automatically Roasts Your Teammate Every Time They Use AI or Lose a Hackathon</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Sat, 11 Apr 2026 13:49:18 +0000</pubDate>
      <link>https://dev.to/solomon1029/i-built-a-tool-that-automatically-roasts-your-teammate-every-time-they-use-ai-or-lose-a-hackathon-5c0h</link>
      <guid>https://dev.to/solomon1029/i-built-a-tool-that-automatically-roasts-your-teammate-every-time-they-use-ai-or-lose-a-hackathon-5c0h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;dave-watch&lt;/code&gt; — a CLI tool that sits in the background, monitors your repo for AI-generated code commits and your team's hackathon history, and fires a personalised roast notification every single time Dave (or whoever your Dave is) does either of those things.&lt;/p&gt;

&lt;p&gt;Did Dave just push a commit where every function has a docstring that starts with "Certainly!"? &lt;strong&gt;Roasted.&lt;/strong&gt;&lt;br&gt;
Did Dave's team just come last in a 48-hour hackathon where the only other team was two sleep-deprived undergrads? &lt;strong&gt;Absolutely roasted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The notifications look like this:&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dave-watch &lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dave@company.com"&lt;/span&gt; &lt;span class="nt"&gt;--hackathon-feed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devpost

👀 dave-watch is running. Watching Dave.
   &lt;span class="o"&gt;(&lt;/span&gt;Dave does not know he is being watched.&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;This will not take long.&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;09:14] ✅ No activity. Dave is &lt;span class="k"&gt;in &lt;/span&gt;a meeting explaining
           why last sprint&lt;span class="s1"&gt;'s tickets aren'&lt;/span&gt;t &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;09:47] 🚨 AI COMMIT DETECTED
        Commit: &lt;span class="s2"&gt;"refactor user service (cleanup)"&lt;/span&gt;
        Author: Dave &amp;lt;dave@company.com&amp;gt;
        Red flags found: 7
          • Docstring begins with &lt;span class="s2"&gt;"Certainly! Here's the..."&lt;/span&gt;
          • 3 nested try/catch blocks that all &lt;span class="k"&gt;do &lt;/span&gt;the same thing
          • A comment that says &lt;span class="s2"&gt;"This is O(n log n) I think"&lt;/span&gt;
          • Variable: &lt;span class="s1"&gt;'optimized_and_clean_final_v2_FINAL'&lt;/span&gt;
          • Dave pushed this 4 minutes after opening the file

        🎤 ROAST: &lt;span class="s2"&gt;"Dave asked an AI to write his code,
                   then asked a different AI to review it,
                   then asked Slack to explain the review.
                   Dave is a middle manager who learned to git push."&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;11:30] 🚨 HACKATHON RESULT DETECTED
        Event:     HackIndia Regional 2025
        Teams:     18
        Dave&lt;span class="s1"&gt;'s team placed: 17th
        Team above Dave: A solo 19-year-old who built
                         a Chrome extension that makes
                         fonts slightly more italic.
        Dave'&lt;/span&gt;s post-mortem: &lt;span class="s2"&gt;"We were too ambitious"&lt;/span&gt;

        🎤 ROAST: &lt;span class="s2"&gt;"Dave's team had 4 people, a Figma file
                   with 38 screens, and a microservices
                   architecture for an app that showed
                   the weather. They did not show the weather.
                   They showed a loading spinner. For 3 minutes.
                   Then the tab crashed."&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;14:02] ✅ No activity. Dave is on LinkedIn writing a post
           about &lt;span class="s1"&gt;'lessons learned'&lt;/span&gt; from the hackathon.
           Dave has used the phrase &lt;span class="s1"&gt;'fail forward'&lt;/span&gt; twice.
           Dave is not failing forward. Dave is failing sideways.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# dave-watch.py
# Requirements: git, python3, devpost scraper, zero mercy
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;

&lt;span class="n"&gt;AI_TELLS&lt;/span&gt; &lt;span class="o"&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;Certainly! Here&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;As an AI language model&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;I hope this helps!&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;Here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the refactored&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;optimized_and_clean_final&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;# This function does&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# nobody writes this naturally
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;handle error here&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;TODO: fix this later&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;it works on my machine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;HACKATHON_ROASTS&lt;/span&gt; &lt;span class="o"&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;Dave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s team had a pitch deck with 22 slides. Slide 1 was the title. Slide 22 was &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Thank You&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. The 20 slides in between were the vision. There was no product.&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;Dave came to the hackathon with a pre-built template, renamed the variables, and called it a pivot. The judges called it something else.&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;Dave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s README had a &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Getting Started&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; section. Step 1 was &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Install Node.js&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. There was no Step 2. The app did not start.&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;Dave lost to a team who had never coded before. Their app crashed on launch. The judges said it had &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;more soul&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&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;Dave described his tech stack as &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scalable, cloud-native, and AI-powered&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. It was a Google Form connected to a spreadsheet.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;AI_ROASTS&lt;/span&gt; &lt;span class="o"&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;Dave has not written an original line of code since 2023. This is not an insult. This is a git log.&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;Dave uses AI to write the code, AI to review the code, and AI to explain the code to himself. Dave is a project manager now. Dave does not know this.&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;Dave copied the AI output, ran it, it failed, pasted the error back into the AI, copied the fix, and called this &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;debugging&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. Dave has been doing this for 4 hours. Dave will not read the error message himself.&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;Dave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s variable names are full sentences. This is because he copied the AI explanation and forgot to stop copying.&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;The AI wrote a comment saying &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;you may want to handle this edge case&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. Dave deleted the comment. Dave did not handle the edge case.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_latest_commit_for_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&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;git&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;log&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;-1&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;--author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--pretty=format:%H&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;-p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;
    &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;AI_TELLS&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👀 dave-watch is running. Watching &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   (They do not know they are being watched.)&lt;/span&gt;&lt;span class="sh"&gt;"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   (This will not take long.)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;seen_commits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;check_latest_commit_for_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;commit_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&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;git&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;log&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;-1&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;--author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--pretty=format:%H&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;stdout&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;commit_hash&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen_commits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;seen_commits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;commit_hash&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚨 AI COMMIT DETECTED&lt;/span&gt;&lt;span class="sh"&gt;"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Red flags: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;   🎤 ROAST: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AI_ROASTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dave@company.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&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;check_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tech stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3 (for the git log parsing and general Dave surveillance)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;subprocess&lt;/code&gt; (to run git commands with the energy of someone filing a formal complaint)&lt;/li&gt;
&lt;li&gt;A curated list of AI tells scraped from three months of reviewing Dave's PRs&lt;/li&gt;
&lt;li&gt;Devpost's public results pages (parsed manually, with increasing personal investment)&lt;/li&gt;
&lt;li&gt;Anger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dave pushed a PR. The first line of every function was a docstring that began with "Certainly!". I approved it anyway. I think about this every day.&lt;/li&gt;
&lt;li&gt;Dave entered HackIndia Regional. Dave's team had a Notion doc with 6 pages of planning. Dave's team had zero pages of working code at submission time. Dave's team submitted the Notion doc.&lt;/li&gt;
&lt;li&gt;I built this tool.&lt;/li&gt;
&lt;li&gt;The tool works. Dave does not know it exists.&lt;/li&gt;
&lt;li&gt;Dave has triggered it 11 times this week. It is Wednesday.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Known issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tool has no off switch, which feels appropriate.&lt;/li&gt;
&lt;li&gt;It will also flag your own commits if you've ever copied from an AI. You have. I have. We don't talk about this.&lt;/li&gt;
&lt;li&gt;The hackathon scraper breaks if Dave doesn't enter under his real name. Dave once entered a hackathon as "DaVinci_Codes". The scraper found him anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Community Favorite&lt;/strong&gt; — because every team has a Dave. You read this and you thought of your Dave. You smiled a specific smile. This tool is for you.&lt;/p&gt;

&lt;p&gt;Also: HTTP 418. I am a teapot. Dave is also a teapot. Dave does not know he is a teapot.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>devchallenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
