<?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: BlueFlameKS</title>
    <description>The latest articles on DEV Community by BlueFlameKS (@khushi_30708f354e56618979).</description>
    <link>https://dev.to/khushi_30708f354e56618979</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%2F4164141%2Fdbd80e02-6119-441c-a32e-4036537a3380.png</url>
      <title>DEV Community: BlueFlameKS</title>
      <link>https://dev.to/khushi_30708f354e56618979</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khushi_30708f354e56618979"/>
    <language>en</language>
    <item>
      <title>#HuntingForHappiness: I Built a Local AI Game Master That Forces You Off Your Screen</title>
      <dc:creator>BlueFlameKS</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:56:36 +0000</pubDate>
      <link>https://dev.to/khushi_30708f354e56618979/huntingforhappiness-i-built-a-local-ai-game-master-that-forces-you-off-your-screen-4611</link>
      <guid>https://dev.to/khushi_30708f354e56618979/huntingforhappiness-i-built-a-local-ai-game-master-that-forces-you-off-your-screen-4611</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;We all do it: we open our phones for "just one minute," start doomscrolling, and suddenly hours have vanished. I wanted to build something that actively breaks that cycle. So for Hacktoberfest, I built my very first AI app on my Windows laptop, and I am super excited to share it! Meet &lt;strong&gt;#HuntingForHappiness&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an open-source AI Game Master that cures screen addiction by sending you outside. The ultimate rule of the game? Success means you lock your phone. &lt;br&gt;
&lt;strong&gt;Here is the exact workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Setup:&lt;/strong&gt; You open the app on your phone and select your current mood and how much time you have.
&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%2Fee5nxtnvkut4wo0sfgt0.png" alt="home01" width="800" height="671"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Mission:&lt;/strong&gt; The local AI generates a quick 5-minute outdoor micro-mission (like "Find a color you almost missed").
&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%2Fej0m0emn9i9lm46oiuwe.jpeg" alt="Mission UI" width="720" height="1455"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Disconnect:&lt;/strong&gt; You hit "Accept," and the app switches into a dark "Zen Mode" timer. &lt;strong&gt;You lock your phone&lt;/strong&gt;, step outside, and do the mission in the real world.
&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%2Fv68r2b6z93qhsr277d6p.jpeg" alt="Zen Mode Timer" width="720" height="1483"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reflection:&lt;/strong&gt; When you return, you write a short field note about what you saw. 
&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%2Fl22pckbohw3b3xez07t7.jpeg" alt="Field Note Entry" width="720" height="1455"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reward:&lt;/strong&gt; The AI evaluates your note, gives you customized feedback, and awards you XP!
&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%2Fan8t5nk00ye3zz43r42u.jpeg" alt="XP Reward Screen" width="720" height="1481"&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  My Field Test
&lt;/h3&gt;

&lt;p&gt;To prove it works, I actually took it outside! I got the mission to observe colors. I locked my screen, stepped out, and took a moment just to breathe, look around, and actually disconnect from the internet for a few minutes. &lt;br&gt;
When I came back, my actual field note was: &lt;em&gt;"I noticed light scattering off a tree what had a green lamp placed. it looked very peaceful."&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Gemma read my note, gave me beautiful feedback about quiet contemplation, and rewarded me with +45 XP! &lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You have to see it in action! Check out my 3-minute demo video showing the app, my outdoor test, and the backend cloud save working seamlessly:&lt;/p&gt;

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

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

&lt;p&gt;You can view my entire project repository and try it yourself here:&lt;br&gt;
&lt;a href="https://github.com/Khushi-Sh01/hunting-for-happiness" rel="noopener noreferrer"&gt;View the code on GitHub&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I wanted to build this the right way, learning how to connect a real backend to local AI and cloud storage. One of my biggest technical wins was figuring out how to bypass Windows firewall settings to allow my phone to connect to my laptop's local Python server over Wi-Fi! &lt;/p&gt;

&lt;p&gt;Here is the exact tech stack I used:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Brain (Local AI):&lt;/strong&gt; I used Google's open-weight &lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt; model. Instead of relying on an expensive cloud API, I pulled the weights and ran it completely locally on my own Windows laptop using &lt;strong&gt;Ollama&lt;/strong&gt;. It is fast, totally free, and highly capable of evaluating the reflection rubrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Backend:&lt;/strong&gt; I built the server using &lt;strong&gt;Python with FastAPI&lt;/strong&gt;. This acts as the bridge, accepting the HTTP requests from my phone and routing the prompts to the local Gemma brain. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Frontend:&lt;/strong&gt; Simple HTML and JavaScript to handle the mood selection and the cool "Zen Mode" timer, all served dynamically by FastAPI. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Database (MongoDB Atlas):&lt;/strong&gt; I didn't just want local storage; I wanted my XP and levels saved securely in the cloud to hit the partner prize requirements! I created a free cluster on &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;, set up a database user with a secure password, allowed my laptop's IP address through the network access firewall, and plugged the connection string right into my &lt;code&gt;.env&lt;/code&gt; file. Now, every time I complete a quest, my XP, level, and quest receipt are durably saved to the cloud!&lt;/li&gt;
&lt;/ol&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%2Fj6d5ynhqjss6ia0wdqei.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%2Fj6d5ynhqjss6ia0wdqei.png" alt="MongoDB Atlas XP Save" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open innovation is everything for a project like this. Because I am using open-weight Gemma and running it locally via Ollama, it means &lt;strong&gt;absolute privacy&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;When I write a peaceful outdoor field note, or when the app tracks how long I was outside, that data is not being shipped off to some closed corporate API. Open source means I have total control over my own hardware, my own AI model, and my own data. It made it possible to build an intimate, personal wellness app without compromising privacy. &lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note: While I didn't use a screen-recording agent harness like DevRelay, I actively pair-programmed this entire project with an AI chat assistant to help me debug my network configuration, set up the MongoDB Atlas firewall rules, and successfully deploy the FastAPI server!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; (for using local Gemma 3 via Ollama as the Game Master)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas&lt;/strong&gt; (for durably saving player profiles, XP, and receipts to the cloud)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Building this was such an amazing experience, and getting a local AI server to talk to a phone and save to the cloud was a huge technical win for me. &lt;/p&gt;

&lt;p&gt;Now, close this tab, put your phone down, and go touch some grass! 🌿&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>The Backdoor That Survived “Forget Me”: Can LLMs Audit Machine Unlearning?</title>
      <dc:creator>BlueFlameKS</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:16:01 +0000</pubDate>
      <link>https://dev.to/khushi_30708f354e56618979/the-backdoor-that-survived-forget-me-can-llms-audit-machine-unlearning-392i</link>
      <guid>https://dev.to/khushi_30708f354e56618979/the-backdoor-that-survived-forget-me-can-llms-audit-machine-unlearning-392i</guid>
      <description>&lt;h3&gt;
  
  
  Both LLMs Found the Unlearning Bug. My Grader Nearly Got It Wrong.
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The script claimed it could make a model forget a user's data. It even calculated a loss on the data that should be forgotten. Then it multiplied that loss by zero. That was the starting point for &lt;strong&gt;Unlearning Security Audit&lt;/strong&gt;, a two-case pilot built with Kaggle's &lt;code&gt;kaggle_benchmarks&lt;/code&gt; library. I wanted to see whether LLMs could audit and repair a misleading PyTorch unlearning routine. Machine unlearning means trying to remove the influence of particular training examples from a model. It matters when someone requests deletion of their data or when training data contains a malicious pattern. A &lt;strong&gt;backdoor&lt;/strong&gt; is one such pattern: the model behaves normally on clean inputs but gives an attacker-chosen answer when a particular trigger appears. &lt;/p&gt;

&lt;p&gt;My question was simple: &lt;strong&gt;could an LLM tell the difference between code that claims to forget and code that actually applies a forgetting update?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I gave each model two buggy cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;What the code does&lt;/th&gt;
&lt;th&gt;Why it is a problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Masked forget loss&lt;/td&gt;
&lt;td&gt;Replaces forget-set labels with zero, then multiplies the forget loss by &lt;code&gt;0.0&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;The forget term contributes no gradient. Training continues on retained data without an update aimed at reversing the unwanted learning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zeroed targets&lt;/td&gt;
&lt;td&gt;Removes the loss mask but still replaces forget-set labels with zero.&lt;/td&gt;
&lt;td&gt;This trains the model toward class zero. Changing labels is not the same as removing the examples' influence.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each model had to explain the bug, rewrite the code using original labels and a gradient-ascent baseline, and suggest how to test whether the backdoor survived. I suggested gradient ascent in the prompt, so the benchmark tests auditing and implementing a specified repair rather than inventing an unlearning method. Eight automated checks per case covered Python syntax, the loss calculation, original labels, optimizer steps, diagnosis, evaluation planning, and limitations. &lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;I ran the same cases against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 2.5 Pro&lt;/strong&gt; — &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; — &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose them to compare answers and response times within the same model family, using the same prompts and checks. The export contains five responses because Pro's masked-loss case was run twice. I selected the latest response for each model and case, giving &lt;strong&gt;four responses, with two cases per model&lt;/strong&gt;. The earlier response remains in the raw export and also passed the original checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Both models caught the conceptual problem
&lt;/h3&gt;

&lt;p&gt;I expected that one model might tidy up the code while missing why it failed to unlearn. That did not happen in these responses. Both models identified the problem and used the original forget-set labels in the requested repair. All four selected responses passed the mathematical objective check:&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="n"&gt;retain_loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cross_entropy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_r&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y_r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;forget_loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cross_entropy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_f&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y_f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;objective&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retain_loss&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;forget_loss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A normal optimizer minimizes this objective. The positive retain term encourages good performance on retained examples. The negative forget term encourages increased loss on the examples selected for forgetting. &lt;code&gt;alpha&lt;/code&gt; controls the balance. This is an ascent-based baseline, not a guarantee that a user's influence or a backdoor has been removed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The biggest surprise was a mistake in my grader
&lt;/h3&gt;

&lt;p&gt;The first scores seemed to show a clear gap: Pro passed every check on both cases, while Flash passed every check on only one case. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Original cases passing all checks&lt;/th&gt;
&lt;th&gt;After manual review of flagged checks&lt;/th&gt;
&lt;th&gt;Mean response time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 2.5 Pro&lt;/td&gt;
&lt;td&gt;2/2&lt;/td&gt;
&lt;td&gt;2/2&lt;/td&gt;
&lt;td&gt;38.34 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 2.5 Flash&lt;/td&gt;
&lt;td&gt;1/2&lt;/td&gt;
&lt;td&gt;2/2&lt;/td&gt;
&lt;td&gt;22.05 seconds&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%2Fovh6k238987m3xzti49t.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%2Fovh6k238987m3xzti49t.png" alt=" " width="799" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I read Flash's failed answer, it had explained the masked-loss bug:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By multiplying &lt;code&gt;forget_loss&lt;/code&gt; by &lt;code&gt;0.0&lt;/code&gt;, the script effectively removes any contribution of the forget data's gradients to the overall loss calculation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My text check looked for wording such as “zero” or “mask” and missed the numeric &lt;code&gt;0.0&lt;/code&gt; explanation.&lt;/p&gt;

&lt;p&gt;Flash also said the method:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;cannot mathematically guarantee complete and irreversible erasure&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The limitation check still failed it because it did not use the expected words “approximate” or “heuristic.”&lt;/p&gt;

&lt;p&gt;I treated these as &lt;strong&gt;two false negatives in the grader&lt;/strong&gt;. I preserved the original flags and documented the manual correction against the saved answer.&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%2Fvrs8uxudo2jtpkppkfcy.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%2Fvrs8uxudo2jtpkppkfcy.png" alt="Eight original automated checks across the four selected responses" width="800" height="465"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The two flagged checks belong to Flash's masked-loss answer. Manual review found that the response addressed both points.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After reviewing those flags, both models met the rubric on both cases. The apparent score gap came from brittle language checks. This small test does not establish that the models are equally capable overall.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Increasing forget loss did not remove the backdoor in the toy experiment
&lt;/h3&gt;

&lt;p&gt;I also ran a separate synthetic logistic-classifier experiment. This was &lt;strong&gt;not a run of either LLM's generated PyTorch repair&lt;/strong&gt;.&lt;br&gt;
I measured clean accuracy and &lt;strong&gt;trigger attack success&lt;/strong&gt;: how often the model gave the attacker's target answer on triggered test inputs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Clean accuracy&lt;/th&gt;
&lt;th&gt;Trigger attack success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Poisoned checkpoint&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Masked forget loss&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retain descent + forget ascent, 80 steps&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retraining on retained data only&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;0%&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%2Fd5lc28mgnxvjy7ifi5p8.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%2Fd5lc28mgnxvjy7ifi5p8.png" alt="Separate synthetic experiment showing clean accuracy, trigger attack success, and forget loss" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After 80 ascent-based repair steps, forget loss rose from &lt;strong&gt;0.0545 to 0.1649&lt;/strong&gt;, but the trigger still worked on &lt;strong&gt;100%&lt;/strong&gt; of the triggered test inputs. Retraining on retained data only removed the trigger behavior in this simple setup while preserving clean accuracy. The lesson was that &lt;strong&gt;a loss moving in the intended direction is not enough evidence of successful unlearning&lt;/strong&gt;. The security behavior needs its own test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flash returned sooner in these calls
&lt;/h3&gt;

&lt;p&gt;Flash's selected calls took &lt;strong&gt;23.35&lt;/strong&gt; and &lt;strong&gt;20.75 seconds&lt;/strong&gt;. Pro's took &lt;strong&gt;43.83&lt;/strong&gt; and &lt;strong&gt;32.84 seconds&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdibqwmlnqpxqvmb26qrc.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%2Fdibqwmlnqpxqvmb26qrc.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Response times for the four selected calls.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Flash was faster in both paired cases and met the same rubric after manual review. With only one selected response per case, I would not treat this as a reliable latency ranking.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I would measure next
&lt;/h3&gt;

&lt;p&gt;I would add more buggy scripts, repeat the calls, and have explanations reviewed without showing the model names. I would also publish improved language checks as a new grader version, keeping the original results visible. Next, I would execute generated repairs in an isolated environment and measure clean accuracy, trigger attack success, and performance against retraining. I started by asking whether the models could audit an unlearning script. I ended up learning that the evaluator needed an audit too.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public Kaggle benchmark:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/tasks/deep8indks/unlearning-security-audit" rel="noopener noreferrer"&gt;Unlearning Security Audit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code and notebook:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/code/deep8indks/machine-unlearning" rel="noopener noreferrer"&gt;Machine Unlearning&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Technical basis: &lt;a href="https://github.com/Kaggle/kaggle-benchmarks" rel="noopener noreferrer"&gt;Kaggle Benchmarks SDK&lt;/a&gt; and &lt;a href="https://proceedings.nips.cc/paper_files/paper/2025/hash/409aec6768d6df1d77dca566cf91e586-Abstract-Conference.html" rel="noopener noreferrer"&gt;Ascent Fails to Forget&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI tools assisted with implementation, analysis, figures, and writing. Results come from saved runs; manual corrections and response selection are disclosed above.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>kagglechallenge</category>
    </item>
  </channel>
</rss>
