<?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: Shiva Preetham</title>
    <description>The latest articles on DEV Community by Shiva Preetham (@shiva_preetham).</description>
    <link>https://dev.to/shiva_preetham</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%2F4231784%2Ff8826ec0-0fc6-4a91-8a29-b7d0f12d48d0.png</url>
      <title>DEV Community: Shiva Preetham</title>
      <link>https://dev.to/shiva_preetham</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shiva_preetham"/>
    <language>en</language>
    <item>
      <title>I Built a Support-to-Engineering Pipeline with 3 AI Agents and 2 Human Approvals on Switch</title>
      <dc:creator>Shiva Preetham</dc:creator>
      <pubDate>Sat, 07 Nov 2026 09:20:14 +0000</pubDate>
      <link>https://dev.to/shiva_preetham/i-built-a-support-to-engineering-pipeline-with-3-ai-agents-and-2-human-approvals-on-switch-4hk0</link>
      <guid>https://dev.to/shiva_preetham/i-built-a-support-to-engineering-pipeline-with-3-ai-agents-and-2-human-approvals-on-switch-4hk0</guid>
      <description>&lt;p&gt;Every software company loses days at the same hand-off. A customer writes &lt;em&gt;"I think I was overcharged."&lt;/em&gt; Support can't tell if it's a bug, so they paste it into an engineering channel. Engineering asks for the order details again, someone eventually reproduces it, fixes it, gets it reviewed and merges it, and nobody tells support, so the customer never hears back.&lt;/p&gt;

&lt;p&gt;The work takes minutes. The waiting between people takes days.&lt;/p&gt;

&lt;p&gt;For the &lt;strong&gt;Flip the Switch Hackathon&lt;/strong&gt; I built &lt;strong&gt;Support-to-Ship Bridge&lt;/strong&gt;: three AI agents and the people on two teams close that loop together in team chat, connected by &lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;Switch&lt;/a&gt;. People only make the two decisions that matter: &lt;strong&gt;merge the fix&lt;/strong&gt; and &lt;strong&gt;send the customer reply&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Everything in the video is a real, unscripted run. This post explains how it's built, step by step, including the mistakes I made as a first-time Switch user, so you can skip them.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Switch, in one paragraph
&lt;/h2&gt;

&lt;p&gt;Switch is open-source infrastructure that puts AI agents into the chat app your team already uses (Slack, Teams, Discord, Telegram or Mattermost) as members of &lt;strong&gt;rooms&lt;/strong&gt;. A room is a channel with a briefing that every agent reads, documents, roles and links to other rooms. People and agents talk with &lt;code&gt;@mentions&lt;/code&gt;. When an agent needs permission for something, it &lt;strong&gt;asks in the room&lt;/strong&gt;, and a person approves or declines. You run it with &lt;strong&gt;Switch Console&lt;/strong&gt;, a desktop app that can start a local Switch server and a bundled Mattermost for you, so you don't need Slack admin rights to try it.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#shoplite-support room                    #shoplite-engineering room
──────────────────────                    ──────────────────────────
1. Support person pastes a ticket
2. shoplite-support agent reproduces it
   against the pricing policy ──escalate──▶ 3. shoplite-fixer: branch, failing
                                              regression test, smallest fix
                                           4. shoplite-reviewer: checks the diff
                                              against the policy → APPROVED
                                           5. Engineer: Switch "Permission needed"
                                              for git merge → Allow once
6. shoplite-support drafts the reply  ◀──fixed + merged──
   with the exact refund
7. Support person: Switch "Permission
   needed" to send → Allow once
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "product" is a tiny checkout pricing service with two planted bugs: tax charged before the coupon, and free shipping that starts &lt;em&gt;above&lt;/em&gt; $50 instead of &lt;em&gt;at&lt;/em&gt; $50. The tests pass at the start because they don't cover either bug, so the agents have to find them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A real run (ticket T-1042):&lt;/strong&gt; a customer used &lt;code&gt;SAVE20&lt;/code&gt; on a $120 jacket and was charged $8.70 tax.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Support agent:&lt;/strong&gt; "Actual: tax $8.70, total $104.70 (tax charged on the pre-discount $120). Policy: $96 × 7.25% = $6.96, total $102.96. This is a bug. Escalating."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixer:&lt;/strong&gt; wrote a regression test that failed (8.7 vs 6.96), made a one-line fix, 7/7 tests pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewer:&lt;/strong&gt; approved. &lt;strong&gt;Without being asked,&lt;/strong&gt; it also flagged the second planted bug in the shipping rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Me:&lt;/strong&gt; clicked &lt;strong&gt;Allow once&lt;/strong&gt; on the merge, then &lt;strong&gt;Allow once&lt;/strong&gt; on the reply with a &lt;strong&gt;$1.74 refund&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to build it (first-time Switch user edition)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install the pieces
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Desktop&lt;/strong&gt;. Switch Console uses it for the bundled Mattermost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch Console&lt;/strong&gt;, from the &lt;a href="https://github.com/sandbox-quantum/switch/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An agent CLI, signed in.&lt;/strong&gt; I used &lt;strong&gt;Claude Code&lt;/strong&gt;: run &lt;code&gt;claude&lt;/code&gt;, then &lt;code&gt;/login&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Switch Console: &lt;strong&gt;Get started → On this computer → Start&lt;/strong&gt;. Wait for "Local server is running".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Link your chat account.&lt;/strong&gt; Go to &lt;strong&gt;Home → Messaging apps → Mattermost → Link → This is me&lt;/strong&gt;. Without this, your agents won't answer your messages. To open Mattermost in the browser, use &lt;strong&gt;⋮ → Sign-in details…&lt;/strong&gt; on the same row.&lt;/p&gt;

&lt;p&gt;⚠️ Switch Console reads your &lt;code&gt;PATH&lt;/code&gt; once, at startup. If you install or sign in to an agent CLI while it's open, quit and reopen the Console.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Give the agents a shared workspace
&lt;/h3&gt;

&lt;p&gt;All three agents work in one git repo, so the fixer's branch is visible to the reviewer. A setup script copies the demo app into &lt;code&gt;~/switch-demo/shoplite&lt;/code&gt; and runs &lt;code&gt;git init&lt;/code&gt;. Running it again resets everything before a demo.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create the agents
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Your Agents → +&lt;/strong&gt; in Switch Console. For each agent: a name (it's addressed by this, e.g. &lt;code&gt;@shoplite-fixer&lt;/code&gt;), a description, instructions, &lt;strong&gt;Run location: This computer&lt;/strong&gt;, &lt;strong&gt;Provider: Claude Code&lt;/strong&gt;, and the workspace as its directory.&lt;/p&gt;

&lt;p&gt;The instructions do most of the work. Here's the core of the fixer's:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;When @shoplite-support escalates a bug:
1. Say in one line what you are about to check.
2. Create a branch from main: git checkout -b fix/&amp;lt;ticket id&amp;gt;.
3. Write a failing regression test that encodes the policy line, run node --test to show it fails.
4. Make the smallest fix in src/ that makes it pass. Run node --test.
5. Commit, then hand off to @shoplite-reviewer: branch, root cause, diff stat, test summary.
6. When the reviewer approves, ask the room "Merge fix/&amp;lt;id&amp;gt; into main?" and wait for a clear yes.
Never push, never rewrite history. Never report a result you did not run.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agents hand work to each other with a plain &lt;code&gt;@mention&lt;/code&gt;. There's no separate task protocol to learn.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Create the rooms with a template
&lt;/h3&gt;

&lt;p&gt;Switch templates are YAML. One document created both rooms, the link between them, a room document, roles and the kickoff messages:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;bridge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;bridge&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$first&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;group&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;ShopLite support-to-ship&lt;/span&gt;
&lt;span class="na"&gt;rooms&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;shoplite-support&lt;/span&gt;
    &lt;span class="na"&gt;bridge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{bridge}"&lt;/span&gt;
    &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shoplite-support"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{$creator}"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;Support staff paste customer tickets here. @shoplite-support answers&lt;/span&gt;
      &lt;span class="s"&gt;how-to questions and escalates pricing bugs to shoplite-engineering.&lt;/span&gt;
      &lt;span class="s"&gt;Nothing is sent to a customer without a person approving it here.&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;escalation-checklist&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ticket id, customer's words, repro command, actual vs expected, policy line&lt;/span&gt;
    &lt;span class="na"&gt;kickoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@shoplite-support&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hi.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Introduce&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;yourself&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;one&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;line."&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;shoplite-engineering&lt;/span&gt;
    &lt;span class="na"&gt;bridge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{bridge}"&lt;/span&gt;
    &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shoplite-support"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shoplite-fixer"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shoplite-reviewer"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{$creator}"&lt;/span&gt;&lt;span class="pi"&gt;]&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="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;reviewer&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;Review fixes against the policy.&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;exclusive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;merge-captain&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;The one agent allowed to merge.&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;exclusive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;true&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;kickoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@shoplite-fixer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;@shoplite-reviewer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hi.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;One&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;line&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;each."&lt;/span&gt;
&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;shoplite-support&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;shoplite-engineering&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;escalate pricing bugs&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Templates → Import template&lt;/strong&gt;, paste it, then &lt;strong&gt;Use → Create all&lt;/strong&gt;. The &lt;code&gt;kickoff&lt;/code&gt; matters: agents only start working when a message addresses them, so the kickoff makes the rooms come alive straight away.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Make the human approvals real, not just a polite prompt
&lt;/h3&gt;

&lt;p&gt;This is my favourite part. Telling an agent "ask before merging" in its instructions is a request, not a guarantee. Instead, the workspace has a Claude Code permission file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ask"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash(git merge:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(node scripts/send-reply.js:*)"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bash(git push:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git reset --hard:*)"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the fixer runs &lt;code&gt;git merge&lt;/code&gt;, Claude Code needs permission, and &lt;strong&gt;Switch posts it in the room&lt;/strong&gt;: &lt;em&gt;Permission needed · request A1&lt;/em&gt;, with &lt;strong&gt;Allow once / Allow for this session / Decline&lt;/strong&gt;. A plain &lt;code&gt;yes&lt;/code&gt; or &lt;code&gt;no&lt;/code&gt; reply works too. Switch records who approved ("Chosen by @user from Mattermost"). The customer reply works the same way: the "send" step is a script on the &lt;em&gt;ask&lt;/em&gt; list, so the support person's &lt;strong&gt;Allow once&lt;/strong&gt; literally is the send button.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 The request is posted &lt;strong&gt;in a thread&lt;/strong&gt;. If an agent seems stuck, open the "N replies" link under the latest message.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Gotchas I hit (so you don't have to)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your model must handle tool calls well.&lt;/strong&gt; Switch agents reply by calling a &lt;code&gt;post_message&lt;/code&gt; tool. Their final text isn't shown to anyone. I first tried a free model through OpenRouter, and the agent showed "Thinking…" and then nothing. The session log said &lt;em&gt;"The model's tool call could not be parsed."&lt;/em&gt; Switching to a Claude model fixed it immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On Windows, create agents from "Your Agents", not from a template.&lt;/strong&gt; In Switch Console 0.40.1 on Windows, the template form showed every provider as &lt;em&gt;"Not supported here"&lt;/em&gt; (tooltip: &lt;em&gt;"SDK sessions require a POSIX SSH execution host"&lt;/em&gt;), while &lt;strong&gt;Your Agents → +&lt;/strong&gt; on the same machine worked fine. So I create the agents by hand and use a rooms-only template. On macOS or Linux, one template can create agents &lt;em&gt;and&lt;/em&gt; rooms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Room creation can outlive the Console's timeout.&lt;/strong&gt; Each Mattermost room took about 15 seconds. The Console said &lt;em&gt;"Could not reach the server… Nothing was created"&lt;/em&gt;, but both rooms had been created. &lt;strong&gt;Check Your Rooms before you retry&lt;/strong&gt;, or you'll get duplicates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want a Linux agent host on a Windows PC?&lt;/strong&gt; WSL works as a Switch remote host, but the agent controller in WSL has to reach the local server, which listens only on &lt;code&gt;127.0.0.1&lt;/code&gt;. Enable &lt;code&gt;networkingMode=mirrored&lt;/code&gt; in &lt;code&gt;.wslconfig&lt;/code&gt;. Also make sure non-interactive SSH sessions can find a current Node.js and the &lt;code&gt;claude&lt;/code&gt; CLI, because &lt;code&gt;~/.local/bin&lt;/code&gt; isn't on their &lt;code&gt;PATH&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Approval policies by role, so only the &lt;code&gt;merge-captain&lt;/code&gt; holder or named engineers can approve a merge.&lt;/li&gt;
&lt;li&gt;A help-desk connector (Zendesk or Intercom), so tickets arrive in the support room without anyone pasting them.&lt;/li&gt;
&lt;li&gt;Scheduled check-ins: "@shoplite-support, list tickets waiting on a customer reply" every morning.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Everything is on GitHub: the demo app, agent instructions, both templates, setup scripts, and the script that edited the demo video.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/Shiva-Preetham/Flip-the-Switch-Hackathon" rel="noopener noreferrer"&gt;github.com/Shiva-Preetham/Flip-the-Switch-Hackathon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built for the &lt;a href="https://www.wemakedevs.org/hackathons/switch" rel="noopener noreferrer"&gt;Flip the Switch Hackathon&lt;/a&gt; by WeMakeDevs × DevTools Academy × Switch. #HowISwitch&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
