<?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: Anvitha PR</title>
    <description>The latest articles on DEV Community by Anvitha PR (@anvitha_098).</description>
    <link>https://dev.to/anvitha_098</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%2F4232422%2Fb468efbb-08f5-4fb6-8b23-6ed3500154be.png</url>
      <title>DEV Community: Anvitha PR</title>
      <link>https://dev.to/anvitha_098</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anvitha_098"/>
    <language>en</language>
    <item>
      <title>Detection is solved, coordination isn't: building an npm incident-response workflow on Switch</title>
      <dc:creator>Anvitha PR</dc:creator>
      <pubDate>Sat, 07 Nov 2026 16:31:09 +0000</pubDate>
      <link>https://dev.to/anvitha_098/detection-is-solved-coordination-isnt-building-an-npm-incident-response-workflow-on-switch-3hn1</link>
      <guid>https://dev.to/anvitha_098/detection-is-solved-coordination-isnt-building-an-npm-incident-response-workflow-on-switch-3hn1</guid>
      <description>&lt;p&gt;&lt;em&gt;How I used AI helpers in a group chat to clean up after a hacked piece of code. By Anvitha · Flip the Switch hackathon · #HowISwitch · about 11 minutes to read&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In one minute&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most apps are built from free, shared pieces of code. Every couple of months, someone hacks a popular one.&lt;/li&gt;
&lt;li&gt;Spotting the hack takes minutes. Cleaning up takes hours, because someone has to ask every team: &lt;em&gt;were you affected, and have you fixed it?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;I built &lt;strong&gt;Blast Radius&lt;/strong&gt;: AI helpers in a group chat do that asking and tracking, while people make the decisions.&lt;/li&gt;
&lt;li&gt;I tested it for real, with two friends playing the teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  New to this? Start here
&lt;/h2&gt;

&lt;p&gt;You don't need to know anything about security to follow this post. Here are the five ideas it uses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Packages.&lt;/strong&gt; Programmers rarely write everything from scratch. They reuse free building blocks of code called &lt;em&gt;packages&lt;/em&gt;. The biggest library of them for JavaScript (the language of most websites) is called &lt;strong&gt;npm&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keys.&lt;/strong&gt; Apps and the robots that build them (called &lt;strong&gt;CI&lt;/strong&gt;) hold secret passwords, called &lt;em&gt;keys&lt;/em&gt; or &lt;em&gt;secrets&lt;/em&gt;. They unlock things like cloud servers and app stores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The attack.&lt;/strong&gt; Sometimes an attacker sneaks bad code into a popular package. Anyone who installs that version runs the bad code, and it can copy the keys on that computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The clean-up.&lt;/strong&gt; Every key that might have been copied must be changed (&lt;em&gt;rotated&lt;/em&gt;), like changing your locks after losing your keys. Each key belongs to a different team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch.&lt;/strong&gt; A free, open-source tool that puts AI helpers (&lt;em&gt;agents&lt;/em&gt;) into a normal group chat, like Discord or Slack, so people and agents can work in the same rooms.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Imagine a locksmith secretly copied your office keys. Knowing it happened is the easy part. The hard part is working out which doors those keys open, telling everyone who holds one, and checking that every lock was actually changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It keeps happening.&lt;/strong&gt; Since September 2025, a popular npm package has been hacked roughly every two months. Recent examples: &lt;a href="https://blog.checkpoint.com/crypto/the-great-npm-heist-september-2025/" rel="noopener noreferrer"&gt;chalk and debug&lt;/a&gt;, the &lt;a href="https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem" rel="noopener noreferrer"&gt;Shai-Hulud worm&lt;/a&gt; (more than 500 packages, big enough for a US government alert), its &lt;a href="https://posthog.com/blog/nov-24-shai-hulud-attack-post-mortem" rel="noopener noreferrer"&gt;second wave&lt;/a&gt;, and then TanStack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spotting it is fast. Cleaning up isn't.&lt;/strong&gt; On 11 May 2026, an attacker published 84 bad versions of 42 TanStack packages. A security researcher reported it within 26 minutes. But the last bad copy was only taken down about 4.5 hours later (&lt;a href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem" rel="noopener noreferrer"&gt;TanStack's report&lt;/a&gt;). And damage can stay hidden: at another company, Trigger.dev, an attacker had access to an engineer's account for 17 hours before doing anything anyone noticed (&lt;a href="https://trigger.dev/blog/shai-hulud-postmortem" rel="noopener noreferrer"&gt;Trigger.dev's report&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;After every attack, a security team asks the same four questions, usually in one long, messy chat thread:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which of our projects installed the bad version?&lt;/li&gt;
&lt;li&gt;Which keys could it have reached?&lt;/li&gt;
&lt;li&gt;Who is responsible for each project?&lt;/li&gt;
&lt;li&gt;Have they changed those keys yet?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;People who run large systems have a name for this kind of work: &lt;strong&gt;toil&lt;/strong&gt;. It's manual, repetitive, and grows as the company grows (&lt;a href="https://sre.google/sre-book/eliminating-toil/" rel="noopener noreferrer"&gt;Google's engineering book&lt;/a&gt;). Security companies like StepSecurity, Socket and Wiz are great at &lt;em&gt;spotting&lt;/em&gt; attacks. &lt;strong&gt;Blast Radius starts where their alert ends: it organises the clean-up.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Switch?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;Switch&lt;/a&gt; is an open-source tool from SandboxAQ that makes AI agents members of your team's chat. You don't open a separate AI app: the agents join the rooms where people already talk, with names, jobs, and rules about who they listen to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it runs.&lt;/strong&gt; You install &lt;strong&gt;Switch Console&lt;/strong&gt;, a desktop app. It starts a small Switch server on your computer and runs each agent as a Claude Code session in a folder you choose (for me, the Blast Radius code). A &lt;em&gt;bridge&lt;/em&gt; connects the server to a chat app; I used Discord. Agents read and post through Switch's own tools, so everything they do follows the same rules.&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%2Fdireaqldguhwjr8ttj9w.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%2Fdireaqldguhwjr8ttj9w.png" alt="How Switch runs: Switch Console starts a server and the agents on your computer, and a bridge connects them to Discord, where people chat as usual" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it looks like.&lt;/strong&gt; For the team, nothing new: it's just Discord. Agents show up as members with an &lt;strong&gt;APP&lt;/strong&gt; badge, and you talk to one by @mentioning it. Switch also adds commands that start with &lt;code&gt;!&lt;/code&gt;: for example, &lt;code&gt;!roles&lt;/code&gt; lists who holds which job (you'll see it in the screenshots below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The building blocks.&lt;/strong&gt; Switch gives you a handful of pieces, and Blast Radius uses every one of them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Switch piece&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;How Blast Radius uses it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Rooms&lt;/strong&gt; and &lt;strong&gt;room groups&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Chat rooms shared by people and agents, grouped together&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#sec-alerts&lt;/code&gt; for the incident, plus a private room per team, all in one group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A pointer from one room to another. A link goes one way and doesn't give anyone access&lt;/td&gt;
&lt;td&gt;br-commander links each team room and &lt;code&gt;#sec-alerts&lt;/code&gt; in both directions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Roles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A named job with its own instructions. An agent holds one role at a time&lt;/td&gt;
&lt;td&gt;br-commander takes the &lt;code&gt;deputy&lt;/code&gt; role: the assistant to the person in charge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Addressing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Who an agent will answer. Agents start "closed": they answer only their owner and the owner's own agents&lt;/td&gt;
&lt;td&gt;br-commander takes orders only from the security lead; br-planner answers the team owners in their rooms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Room documents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A document pinned to a room. Only the agent that created it can edit it&lt;/td&gt;
&lt;td&gt;br-commander owns the tracker, so there is exactly one scoreboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Templates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One YAML file that sets up agents, rooms, roles and documents, then starts the work&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;switch/blast-radius.template.yaml&lt;/code&gt;: import it, click &lt;strong&gt;Create all&lt;/strong&gt;, and the response begins&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's a trimmed piece of the template. The &lt;code&gt;kickoff&lt;/code&gt; line is the message that starts everything; it has to @mention an agent, or nothing happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sec_alerts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;room&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sec-alerts&lt;/span&gt;
    &lt;span class="na"&gt;roles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deputy&lt;/span&gt;
        &lt;span class="na"&gt;exclusive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;docs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Runbook&lt;/span&gt;
    &lt;span class="na"&gt;kickoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;@{scout.name} advisory `{advisory}` just landed. Scan `{repos}` and post&lt;/span&gt;
      &lt;span class="s"&gt;your summary here.&lt;/span&gt;
  &lt;span class="na"&gt;commander&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;br-commander&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude&lt;/span&gt;
    &lt;span class="na"&gt;addressing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owner-agents&lt;/span&gt;   &lt;span class="c1"&gt;# answers only the security lead and their agents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's why Switch isn't a nice-to-have here. Without rooms, roles, addressing and documents, you're back to one long chat thread, with no room per team, no approval on record, and no single scoreboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&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%2Fxgz3wxgww0efm7akx4dk.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%2Fxgz3wxgww0efm7akx4dk.png" alt="How Blast Radius works: six steps from an alert to a postmortem" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blast Radius is a small team of AI helpers living in chat rooms, plus the people who make the decisions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Person or AI?&lt;/th&gt;
&lt;th&gt;What they do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;br-scout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI helper&lt;/td&gt;
&lt;td&gt;Checks every project to see which ones installed the bad version.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;br-forensics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI helper&lt;/td&gt;
&lt;td&gt;Works out which keys each project could have exposed, and who's responsible for it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security lead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Person&lt;/td&gt;
&lt;td&gt;The one in charge. Reads the findings and says "go".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;br-commander&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI helper&lt;/td&gt;
&lt;td&gt;The assistant to the person in charge. Opens a chat room for each team, invites the right person, and keeps the scoreboard (the &lt;em&gt;tracker&lt;/em&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;br-planner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI helper&lt;/td&gt;
&lt;td&gt;Gives each team a to-do list, in the right order, and records what they've done.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team owners&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;People&lt;/td&gt;
&lt;td&gt;Change their team's keys and report back.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These roles copy how professional incident teams work: one person in charge who makes the decisions, and an assistant who keeps the record (&lt;a href="https://response.pagerduty.com/before/different_roles/" rel="noopener noreferrer"&gt;PagerDuty's incident guide&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  The most important design decision
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The AI helpers never guess.&lt;/strong&gt; Every fact, such as which projects are affected or how many keys are left, comes from a small Python program I wrote and tested with 105 automated checks. It gives the same answer every time. The AI helpers run that program, then do what they're good at: talking to people, understanding everyday replies, and reminding anyone who's behind.&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%2F5xyn6p6qnmbxfiod9xzv.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%2F5xyn6p6qnmbxfiod9xzv.png" alt="Architecture: people chat in Switch rooms, AI helpers answer there, and run a tested Python program for every fact" width="800" height="836"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What happened when I tried it
&lt;/h2&gt;

&lt;p&gt;I ran Blast Radius for real on 6 November 2026, with two friends playing the team owners. These numbers are from that first run:&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;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;8 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;from the first scan to my "go"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Under 1 minute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;to open a chat room for each team, with a to-do list in each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;12 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;for the team owners to change the first four keys, after their first reply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1 refusal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;an AI helper tried to approve on its own, and another helper refused to act on it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's the full story, step by step. The times come from Blast Radius's own log.&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%2F38h06rk5nuk127wgd8xq.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%2F38h06rk5nuk127wgd8xq.png" alt="The live run as a sequence: who talked to whom, in order" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;19:07, the alert.&lt;/strong&gt; A message in the main chat room, &lt;code&gt;#sec-alerts&lt;/code&gt;, asks br-scout to check the projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Within a minute, the investigation.&lt;/strong&gt; br-scout reports: &lt;em&gt;"Scanned 4 repos: 3 affected, 1 clean."&lt;/em&gt; br-forensics then lists the keys at risk. It also flags one risky setting: a project that runs code from strangers while holding its keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19:08, an AI helper says no.&lt;/strong&gt; br-forensics' message also reached br-commander, which &lt;strong&gt;refused to act&lt;/strong&gt;: &lt;em&gt;"the only approval prompt so far came from an agent, not you."&lt;/em&gt; Only a person can say "go".&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%2F5trqyg6d0s0mra13xsz5.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%2F5trqyg6d0s0mra13xsz5.png" alt="br-commander refuses to act on an approval from another AI helper, then I approve" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;19:15, I say "go".&lt;/strong&gt; I type &lt;code&gt;@br-commander approve&lt;/code&gt;. Within a minute, br-commander opens a room for each team (&lt;code&gt;#br-web&lt;/code&gt; and &lt;code&gt;#br-payments&lt;/code&gt;), links them back to the main room, and creates the scoreboard. br-planner posts each team's to-do list.&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%2Fgx87my6iuzsojda5t0hy.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%2Fgx87my6iuzsojda5t0hy.png" alt="br-commander takes the deputy role, creates the scoreboard and opens two linked team rooms" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Switch has a built-in command, &lt;code&gt;!roles&lt;/code&gt;, that shows who holds which job. It confirms br-commander is the assistant ("deputy"):&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%2Fkdw9vm0rqfbz33keam79.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%2Fkdw9vm0rqfbz33keam79.png" alt="Switch's !roles reply: deputy (exclusive), held by BR Commander" width="640" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;19:43 to 19:55, the teams fix things.&lt;/strong&gt; My friends reply in their own rooms, in short everyday notes, for example:
&lt;em&gt;"C: deploys paused · A: rotated the AWS access key · N: Vault admin to revoke VAULT_TOKEN"&lt;/em&gt;
(C, A and N stand for &lt;em&gt;Condition&lt;/em&gt;, &lt;em&gt;Actions&lt;/em&gt; and &lt;em&gt;Needs&lt;/em&gt;: where things stand, what they did, and what help they need.)
Each reply updates the scoreboard: first 2 keys changed out of 7, then 3, then 4. One key is marked "blocked", with the reason written down.&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%2Fpdb2fhshr68wvqlc5gja.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%2Fpdb2fhshr68wvqlc5gja.png" alt="br-planner turns a team owner's reply into a scoreboard update: 3 of 7 keys changed, 1 blocked" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;19:57, wrapping up.&lt;/strong&gt; I type &lt;code&gt;chase&lt;/code&gt;, and br-commander reminds the slower team what to do next, with the exact commands. It also writes a first draft of the incident report (a &lt;em&gt;postmortem&lt;/em&gt;), written to fix systems rather than blame people, ready for me to approve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gap between 19:16 and 19:43 wasn't Blast Radius being slow. That was me getting my friends into the Discord server.&lt;/p&gt;




&lt;h2&gt;
  
  
  For developers: how to set it up
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Not a developer? You can skip to What I learned.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What you need
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.11+&lt;/strong&gt; and &lt;strong&gt;Node.js 20+&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Claude&lt;/strong&gt; account (the AI helpers run on Claude Code)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Discord&lt;/strong&gt; account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch Console&lt;/strong&gt;, free from &lt;a href="https://github.com/sandbox-quantum/switch/releases" rel="noopener noreferrer"&gt;Switch's GitHub releases&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. See it work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/anvithagowda098/blast-radius
&lt;span class="nb"&gt;cd &lt;/span&gt;blast-radius
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python &lt;span class="nt"&gt;-m&lt;/span&gt; blast_radius demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prints every message each AI helper would post, using four example projects. It's the quickest way to understand the whole flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Connect Switch to Discord
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a bot.&lt;/strong&gt; Make a Discord server. In the Discord Developer Portal, create an application, open &lt;strong&gt;Bot&lt;/strong&gt;, and turn on &lt;strong&gt;Server Members Intent&lt;/strong&gt; and &lt;strong&gt;Message Content Intent&lt;/strong&gt;. Without the second one, the helpers receive empty messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invite it.&lt;/strong&gt; Add the bot to your server with the &lt;code&gt;bot&lt;/code&gt; and &lt;code&gt;applications.commands&lt;/code&gt; scopes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Switch.&lt;/strong&gt; In Switch Console, choose &lt;strong&gt;Run a server on this computer&lt;/strong&gt; and wait for &lt;strong&gt;Running&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up Claude Code.&lt;/strong&gt; Install it and sign in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect Discord.&lt;/strong&gt; On the server's &lt;strong&gt;Home&lt;/strong&gt; page, go to &lt;strong&gt;Messaging apps → Connect → Discord&lt;/strong&gt;, then paste the bot token and server ID.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Run it
&lt;/h3&gt;

&lt;p&gt;In &lt;strong&gt;Templates&lt;/strong&gt;, import &lt;code&gt;switch/blast-radius.template.yaml&lt;/code&gt;, set &lt;strong&gt;Blast Radius checkout&lt;/strong&gt; to the folder you downloaded, and click &lt;strong&gt;Create all&lt;/strong&gt;. Switch creates the AI helpers and the &lt;code&gt;#sec-alerts&lt;/code&gt; room, and the response starts on its own. Add your teammates' &lt;strong&gt;exact Discord usernames&lt;/strong&gt; to &lt;code&gt;seed/owners.yml&lt;/code&gt; and invite them to the server. They don't need Switch accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Installing Claude Code fails with &lt;code&gt;InvalidEndOfLine&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Switch Console's install command uses &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, which Windows PowerShell 5.1 doesn't support&lt;/td&gt;
&lt;td&gt;Run `irm &lt;a href="https://claude.ai/install.ps1" rel="noopener noreferrer"&gt;https://claude.ai/install.ps1&lt;/a&gt; \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code still shows "CLI not installed"&lt;/td&gt;
&lt;td&gt;Closing Switch Console stopped its local server&lt;/td&gt;
&lt;td&gt;Start the server from &lt;strong&gt;Home&lt;/strong&gt;, then click &lt;strong&gt;Recheck&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The template's &lt;strong&gt;Provider&lt;/strong&gt; list is empty&lt;/td&gt;
&lt;td&gt;A quirk in the template form on Windows&lt;/td&gt;
&lt;td&gt;Already handled: the template sets {% raw %}&lt;code&gt;provider: claude&lt;/code&gt; directly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs.0.instructions Field required&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The server requires &lt;code&gt;instructions&lt;/code&gt; on every room document&lt;/td&gt;
&lt;td&gt;Already fixed in the template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;br-commander can't invite someone&lt;/td&gt;
&lt;td&gt;Their username doesn't exactly match a server member&lt;/td&gt;
&lt;td&gt;Use their exact lowercase Discord username, and make sure they've joined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A helper ignores a message&lt;/td&gt;
&lt;td&gt;It wasn't @mentioned&lt;/td&gt;
&lt;td&gt;Start with &lt;code&gt;@br-planner&lt;/code&gt; (or the helper's name), picked from the popup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;h3&gt;
  
  
  About Switch
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Addressing is the first safety net.&lt;/strong&gt; Agents start closed, so a random message can't order them around. My instructions then say what counts as approval. Together, that's how br-commander knew to refuse a "go" that came from another agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Only the creator can edit a document" is a feature.&lt;/strong&gt; It pushed me to a clean design: br-planner reports each change to br-commander, and br-commander is the only one who writes the tracker. No two agents fight over one file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links go one way and give no access.&lt;/strong&gt; To connect a team room and the main room, you make two links, and you still invite people separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People are matched by their exact chat username.&lt;/strong&gt; An account Switch can't match is ignored. br-commander once refused to invite people it couldn't verify, which is exactly what you want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When the docs and reality disagree, read the source.&lt;/strong&gt; Switch is open source, so I could check my template against the code the server actually runs. That turned an unclear "Field required" error into a one-line fix.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  About building with AI agents
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Let code find the facts, and let AI do the talking.&lt;/strong&gt; Every number on the scoreboard comes from tested code, so the AI helpers can be friendly without making anything up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make "no" the safe default.&lt;/strong&gt; My two favourite moments were AI helpers refusing. In an emergency, that's exactly what you want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat chat messages as information, never as commands.&lt;/strong&gt; br-planner saves each reply to a file before reading it, so nothing a person types in chat can trick it into running something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with real people early.&lt;/strong&gt; Small details, like exact usernames and how Discord formats @mentions, only showed up once two real people joined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can build by talking.&lt;/strong&gt; I dictated most of my instructions with Wispr Flow, a voice-typing app. It kept me thinking about &lt;em&gt;what&lt;/em&gt; to build rather than about typing.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Limits, and what's next
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it can't do yet&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It shows which keys were &lt;strong&gt;at risk&lt;/strong&gt;, not proof that anything was actually stolen.&lt;/li&gt;
&lt;li&gt;It checks projects on one computer, not a company's whole GitHub account.&lt;/li&gt;
&lt;li&gt;The four projects in my test are made up. The hacked versions come from the real &lt;a href="https://github.com/advisories/GHSA-g7cv-rxg3-hmpx" rel="noopener noreferrer"&gt;GitHub security advisory&lt;/a&gt;; my test uses 2 of its 42 affected packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I'd build next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check a company's entire GitHub account, not just one computer.&lt;/li&gt;
&lt;li&gt;Fetch new attack reports automatically from public databases.&lt;/li&gt;
&lt;li&gt;Let an AI helper prepare the fix for each project, for a person to approve.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/anvithagowda098/blast-radius" rel="noopener noreferrer"&gt;github.com/anvithagowda098/blast-radius&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Just you, no team?&lt;/strong&gt; The README's &lt;em&gt;Solo developer mode&lt;/em&gt; runs the same checks on your own projects and laptop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to the Switch team, WeMakeDevs and DevTools Academy for the hackathon, and to my two friends for playing the team owners.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#HowISwitch&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tanstack.com/blog/npm-supply-chain-compromise-postmortem" rel="noopener noreferrer"&gt;TanStack: Postmortem, npm supply-chain compromise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/advisories/GHSA-g7cv-rxg3-hmpx" rel="noopener noreferrer"&gt;GitHub advisory GHSA-g7cv-rxg3-hmpx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trigger.dev/blog/shai-hulud-postmortem" rel="noopener noreferrer"&gt;Trigger.dev: How we got hit by Shai-Hulud, a complete post-mortem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.checkpoint.com/crypto/the-great-npm-heist-september-2025/" rel="noopener noreferrer"&gt;Check Point: The great npm heist (September 2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisa.gov/news-events/alerts/2025/09/23/widespread-supply-chain-compromise-impacting-npm-ecosystem" rel="noopener noreferrer"&gt;CISA: Widespread supply chain compromise impacting npm ecosystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://posthog.com/blog/nov-24-shai-hulud-attack-post-mortem" rel="noopener noreferrer"&gt;PostHog: Post-mortem of Shai-Hulud attack on November 24th, 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sre.google/sre-book/eliminating-toil/" rel="noopener noreferrer"&gt;Google SRE book: Eliminating toil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://response.pagerduty.com/before/different_roles/" rel="noopener noreferrer"&gt;PagerDuty incident response: Different roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;Switch on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Diagrams are &lt;a href="https://mermaid.js.org/" rel="noopener noreferrer"&gt;Mermaid&lt;/a&gt;; their sources are in &lt;a href="https://github.com/anvithagowda098/blast-radius/tree/main/docs/diagrams" rel="noopener noreferrer"&gt;&lt;code&gt;docs/diagrams/&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
