<?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: Romeet Chatterjee</title>
    <description>The latest articles on DEV Community by Romeet Chatterjee (@romeet9).</description>
    <link>https://dev.to/romeet9</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%2F4231833%2Ff934f318-888d-487c-8d3c-174088b662c4.png</url>
      <title>DEV Community: Romeet Chatterjee</title>
      <link>https://dev.to/romeet9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/romeet9"/>
    <language>en</language>
    <item>
      <title>I put a design team of four agents in a Slack room: a first-timer's guide to Switch</title>
      <dc:creator>Romeet Chatterjee</dc:creator>
      <pubDate>Sat, 07 Nov 2026 09:51:49 +0000</pubDate>
      <link>https://dev.to/romeet9/i-put-a-design-team-of-four-agents-in-a-slack-room-a-first-timers-guide-to-switch-37nf</link>
      <guid>https://dev.to/romeet9/i-put-a-design-team-of-four-agents-in-a-slack-room-a-first-timers-guide-to-switch-37nf</guid>
      <description>&lt;p&gt;I'm a product designer. When a PRD lands, what I want is not a pretty mockup. I want genuinely different options, side by side, with someone honest pointing out what's wrong with each, before I spend a day pushing pixels.&lt;/p&gt;

&lt;p&gt;That conversation already happens in team chat. So for the Flip the Switch hackathon I built &lt;strong&gt;Switchboard Studio&lt;/strong&gt;: you post a brief in a chat room, and four AI agents (a brief agent, a designer, a critic and a keeper) turn it into Figma variants, a measured critique, a recommendation and a logged decision. You make the decision. This post covers why I built it in chat, what Switch is for a first-timer, how to set it up step by step, and the gotchas that cost me time.&lt;/p&gt;

&lt;p&gt;Here's the whole thing in 80 seconds:&lt;/p&gt;

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

&lt;p&gt;Want the full walkthrough in a real Slack room? &lt;strong&gt;&lt;a href="https://www.loom.com/share/4af7911170fb4fa693c37cfc68f69172" rel="noopener noreferrer"&gt;Watch the 4-minute demo&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/romeet9/switchboard-studio" rel="noopener noreferrer"&gt;Get the code on GitHub&lt;/a&gt;&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%2F8h3mhgb90fua84nsdhv4.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%2F8h3mhgb90fua84nsdhv4.png" alt="Variant A posted in the Slack thread, with a State / What it shows table and one screenshot per state" width="799" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why design ideation belongs in team chat
&lt;/h2&gt;

&lt;p&gt;Design options get killed by process, not taste. A mockup lives in a Figma file, feedback lives in a thread, the decision lives in someone's head. Putting ideation where the conversation already is makes the options and the decision sit in the same place. Everyone can see what was asked, what was proposed and why one direction won.&lt;/p&gt;

&lt;p&gt;It also forces useful constraints. Chat has no custom buttons, so every step has to be a sentence a person could type: "@weft-designer B + open the list as a table". That turned out to be a feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Switch is, for a first-timer
&lt;/h2&gt;

&lt;p&gt;Switch gives AI agents a place in the tools your team already uses. Four ideas are enough to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rooms.&lt;/strong&gt; A room is a chat channel that agents and people share. You talk to agents the way you talk to colleagues, in threads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents as teammates.&lt;/strong&gt; An agent is a coding agent (here, Claude Code) with a name, a description, instructions and a working directory. It answers when you @mention it. It has its own folder and its own tools, such as the Figma MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch Console.&lt;/strong&gt; A desktop app that runs a Switch server for you in Docker, shows your agents and rooms, and is where you manage everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templates.&lt;/strong&gt; A YAML file that describes agents plus a room (roles, documents, aliases and a kickoff message). Import it, fill in a short form, click create, and the whole team exists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Templates are the reason this is shareable. My entire product is one YAML file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set it up: step by step
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before you start&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You need&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker Desktop, running&lt;/td&gt;
&lt;td&gt;Console runs the Switch server in it&lt;/td&gt;
&lt;td&gt;Whale icon in the menu bar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code, signed in&lt;/td&gt;
&lt;td&gt;The runtime behind every agent&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;claude --version&lt;/code&gt;, then &lt;code&gt;claude&lt;/code&gt; once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch Console (I used 0.40.1)&lt;/td&gt;
&lt;td&gt;Runs the server, agents and rooms&lt;/td&gt;
&lt;td&gt;Opens to "Setting up Switch"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A Figma account with your design system published&lt;/td&gt;
&lt;td&gt;The designer builds only from it&lt;/td&gt;
&lt;td&gt;Library shows under Assets → Libraries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node 20+ (optional)&lt;/td&gt;
&lt;td&gt;For the &lt;code&gt;studio&lt;/code&gt; CLI and its tests&lt;/td&gt;
&lt;td&gt;&lt;code&gt;node --version&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Time: about 20 minutes for setup, then a few minutes per brief. Cost: free apart from your Claude plan; nothing runs in the cloud. I built this on macOS. On Windows, use WSL and follow the &lt;a href="https://docs.switchagents.ai/switch-rooms/getting-started" rel="noopener noreferrer"&gt;Switch docs&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Start a local server
&lt;/h3&gt;

&lt;p&gt;Open Switch Console. On the "Setting up Switch" checklist click &lt;strong&gt;Get started&lt;/strong&gt;, then &lt;strong&gt;Add a server&lt;/strong&gt;. Choose &lt;strong&gt;On this computer&lt;/strong&gt; and click &lt;strong&gt;Start&lt;/strong&gt;. Console starts the Switch server, Postgres, a gateway and a local Mattermost in Docker, makes an admin account and signs you in. Wait for "Local server is running", then &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pick Claude Code as the provider
&lt;/h3&gt;

&lt;p&gt;At "How'd you like to power switch-buddy?" choose &lt;strong&gt;Claude Code&lt;/strong&gt;. The line under it must say "Signed in". You can re-check any time in Settings, Agent providers. If it says "CLI not installed", quit Console with Cmd+Q (closing the window doesn't quit it) and reopen so it re-reads your PATH.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Link your account
&lt;/h3&gt;

&lt;p&gt;This is the step everyone misses. By default agents answer only their owner, and Switch has to know which chat account is you. Go to Server Home, then &lt;strong&gt;Messaging apps&lt;/strong&gt;, find the Mattermost row, and click &lt;strong&gt;Link&lt;/strong&gt;, then &lt;strong&gt;This is me&lt;/strong&gt;. If you skip it, agents silently ignore you.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Enable "Can manage agents" (optional)
&lt;/h3&gt;

&lt;p&gt;Only needed if you want an agent to create agents or rooms for you. Open the agent under &lt;strong&gt;Your Agents&lt;/strong&gt;, then General, and toggle &lt;strong&gt;Can manage agents&lt;/strong&gt;. You don't need it to run a template yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Import the template
&lt;/h3&gt;

&lt;p&gt;In the sidebar open &lt;strong&gt;Templates&lt;/strong&gt;, click &lt;strong&gt;Import template&lt;/strong&gt; and paste the YAML (or load the saved file). Open it and click &lt;strong&gt;Use&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Fill in the params
&lt;/h3&gt;

&lt;p&gt;The form is generated from the template's &lt;code&gt;params:&lt;/code&gt;. Mine looks like this:&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;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;team&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;string&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix for every name this creates (agents and room).&lt;/span&gt;
    &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[a-z][a-z0-9-]*"&lt;/span&gt;
  &lt;span class="na"&gt;working_file_key&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;string&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Working Figma file key&lt;/span&gt;
    &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[0-9a-zA-Z]+"&lt;/span&gt;
    &lt;span class="na"&gt;required&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;directory&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;directory&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Each agent's working directory, a folder of its own.&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{$agents_dir}/{agent}"&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;advanced&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter a team name (for example &lt;code&gt;studio&lt;/code&gt;), paste the file key of a blank Figma file that has your design system library enabled, and click &lt;strong&gt;Create agent and room&lt;/strong&gt;. You get &lt;code&gt;studio-brief&lt;/code&gt;, &lt;code&gt;studio-designer&lt;/code&gt;, &lt;code&gt;studio-critic&lt;/code&gt;, &lt;code&gt;studio-keeper&lt;/code&gt; and a room, with a kickoff message in it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3opnmlbkzks94zkehmpf.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%2F3opnmlbkzks94zkehmpf.png" alt="Switch Console showing the four Switchboard agents running on this computer" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Symlink the designer's rules
&lt;/h3&gt;

&lt;p&gt;The designer's standing Figma rules live in the repo's &lt;code&gt;CLAUDE.md&lt;/code&gt;. Claude Code reads a &lt;code&gt;CLAUDE.md&lt;/code&gt; in its working directory at the start of every session, so put the file there. Find the directory on the designer's agent page, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /path/to/switchboard-studio/CLAUDE.md /path/to/agents/studio-designer/CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A symlink means a change to the rules in the repo reaches the agent immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Driving it from Slack
&lt;/h2&gt;

&lt;p&gt;Once the one-time setup is done, I never open a terminal. The agents run a small tested CLI on the host and post the results back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@weft-brief status&lt;/code&gt; runs the health check.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@weft-designer list&lt;/code&gt; shows every brief, variant and state with a Figma link.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@weft-designer export B state a&lt;/code&gt; posts the PNGs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@weft-critic lint B&lt;/code&gt; posts the measured design-system report.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@weft-brief &amp;lt;brief&amp;gt;&lt;/code&gt; starts a new brief, and &lt;code&gt;!reset&lt;/code&gt; starts fresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Designing four agents (and why the human approves)
&lt;/h2&gt;

&lt;p&gt;Each agent is a block of instructions in the template. The brief agent never designs; the designer never judges its own work; the critic never edits Figma; the keeper only writes things down. Clear roles keep each prompt short and each failure traceable.&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;agents&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{team}-brief"&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Turns a PM's product brief into a complete, structured design brief&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;anyone&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{provider}"&lt;/span&gt;
    &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{directory}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The brief agent asks at most four numbered questions, each with a proposed default, so I can answer &lt;code&gt;go&lt;/code&gt; or override one, like &lt;code&gt;2 30s&lt;/code&gt;. On my run it asked how flagged invoices behave in bulk, how long the undo window is, whether to show who raised each invoice, and how many variants to build.&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%2Fxb05irkhb25jyjdxvnfv.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%2Fxb05irkhb25jyjdxvnfv.png" alt="The brief agent's four questions, each with a default" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After I replied &lt;code&gt;go&lt;/code&gt;, it posted the finished brief as a Field / Value table, marking every assumption so I could see what was its call and what was mine, and handed it to the designer.&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%2F59hv4elidrfhsad3bnl3.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%2F59hv4elidrfhsad3bnl3.png" alt="The structured design brief, with assumptions marked" width="799" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The designer builds variants that must differ in structure, not colour. By default that's three: &lt;strong&gt;A Familiar&lt;/strong&gt;, &lt;strong&gt;B Focused&lt;/strong&gt; and &lt;strong&gt;C Ambitious&lt;/strong&gt;. For this run I asked for two to keep it fast: &lt;strong&gt;A&lt;/strong&gt;, a 12-row table with a bulk bar that totals each currency, and &lt;strong&gt;B&lt;/strong&gt;, a summary card with one big "Approve 57 invoices" button over a pre-selected queue, with flagged invoices on their own tab. It uses only the published design system and posts one message per variant, with one PNG per state.&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%2F159dm7q3xx6cwd6cp1ng.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%2F159dm7q3xx6cwd6cp1ng.png" alt="The designer's kickoff: it confirms the hand-off and lists the two directions" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The room also defines roles, and this is the part I care about most:&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="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;approver&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;&amp;gt;-&lt;/span&gt;
    &lt;span class="s"&gt;You are the human gate. Agents recommend; only you decide. Nothing in&lt;/span&gt;
    &lt;span class="s"&gt;this room is final until you say so in words.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agents never say "final" or "approved" about a design. A designer's job is judgment, and I did not want to outsource it. I wanted to compress the boring part.&lt;/p&gt;

&lt;p&gt;Here's what it actually built in Figma, straight from the exports it posted to the thread:&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%2Fsb5sn3teosjlf82x1z89.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%2Fsb5sn3teosjlf82x1z89.png" alt="Variant A, state a: 57 selected, 6 flagged skipped" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8zg1ojq1f9di6j238ls.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%2Fb8zg1ojq1f9di6j238ls.png" alt="Variant A, state b: 6 flagged left, with the undo pop-up" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhn5duml51sc4lt2z8y3i.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%2Fhn5duml51sc4lt2z8y3i.png" alt="Variant B, state a: summary card and one big approve button" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdr39tscl732cvsl1pbzu.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%2Fdr39tscl732cvsl1pbzu.png" alt="Variant B, state b: the flagged tab, with the undo pop-up" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the critic caught
&lt;/h2&gt;

&lt;p&gt;The critic posts a scorecard (brief fit, accessibility and design-system adherence, each out of 5). It was more useful than I expected, because it measures instead of opining. It runs &lt;code&gt;studio lint&lt;/code&gt; against the Figma file and quotes the numbers: A was 97% bound to variables, B 100%, both 100% on text styles and library components, with zero contrast failures.&lt;/p&gt;

&lt;p&gt;It also checked its own tool. Lint flagged two unbound corner radii on A, so the critic opened the frame in Figma, found they were bound after all, and called them false positives in the thread. Then it listed what to fix first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Loom's Table is fixed at 6 rows&lt;/strong&gt;, so A had to build its own from Table Header Row and Table Row. That's a real gap in the design system, not a designer mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B's big button sits over a 6-row page&lt;/strong&gt;, so you'd approve 57 invoices while seeing 6. That's exactly the "approve blind" the brief warned against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row checkboxes are 14 to 16 px&lt;/strong&gt;, under the 24 px desktop target.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ejrxufuwq13snzeaygz.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%2F3ejrxufuwq13snzeaygz.png" alt="The critic's scorecard: a Variant / Fit / A11y / Loom / Risk table and a Fix first table" width="800" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It recommended A, then handed the decision back to me with the exact reply to send. Choosing is one line in the thread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@weft-designer A + make the whole checkbox cell clickable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The designer then makes &lt;strong&gt;A v2&lt;/strong&gt; next to the original (it never overwrites), posts only the changed states, and pings the critic for a delta review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The keeper remembers why
&lt;/h2&gt;

&lt;p&gt;Decisions get lost faster than designs. The keeper is the quietest agent in the room: at each milestone (brief set, variants up, recommendation, my choice, each new version) the others ping it, it logs the event and replies "Logged." A month later, &lt;code&gt;@weft-keeper why prd-214&lt;/code&gt; returns the whole trail: what the critic recommended, what I chose in my own words, and which version came out of it. It also saves that trail as a "Decision log" room document, so it outlives the thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  If an agent doesn't answer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Silence after you @mention an agent&lt;/td&gt;
&lt;td&gt;Your chat account isn't linked&lt;/td&gt;
&lt;td&gt;Server Home → Messaging apps → Link → This is me&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Silence, and the agent shows offline&lt;/td&gt;
&lt;td&gt;Console was closed with Cmd+Q, or the Mac slept&lt;/td&gt;
&lt;td&gt;Reopen Console and keep the Mac awake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Nothing happened" on the very first message&lt;/td&gt;
&lt;td&gt;The Switch server hadn't started yet&lt;/td&gt;
&lt;td&gt;Wait for "Local server is running", then retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The agent replies but can't reach Figma&lt;/td&gt;
&lt;td&gt;The Figma MCP isn't connected for Claude Code&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;studio doctor&lt;/code&gt;, or &lt;code&gt;@weft-brief status&lt;/code&gt; in chat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two agents overwrite each other's files&lt;/td&gt;
&lt;td&gt;They share one working directory&lt;/td&gt;
&lt;td&gt;Keep the default &lt;code&gt;{$agents_dir}/{agent}&lt;/code&gt; directory param&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A message gets ignored&lt;/td&gt;
&lt;td&gt;It didn't @mention anyone&lt;/td&gt;
&lt;td&gt;Always mention the agent you're talking to&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Gotchas I learned the hard way
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Directory param is one value for all agents.&lt;/strong&gt; If you set a plain folder, all four agents share it. Keep the default &lt;code&gt;{$agents_dir}/{agent}&lt;/code&gt; so each gets its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mention agents or they ignore you.&lt;/strong&gt; Unmentioned messages are skipped. The template's kickoff and handoffs all &lt;code&gt;@mention&lt;/code&gt;, and so should you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Link your account.&lt;/strong&gt; Not linked means the agent silently ignores you, with no error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent names can't be reused.&lt;/strong&gt; Names are immutable. To move from Mattermost to Slack I re-ran the template under a new team name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export screen frames, not wrappers.&lt;/strong&gt; The designer exports each state's screen frame at 2x. Exporting the wrapper puts titles and captions into the image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No custom buttons.&lt;/strong&gt; Chat messages can't carry your own buttons, so choices are @mention replies: "Reply @weft-designer A to take this forward". It is simple and works in Slack and Mattermost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also: Console must stay open and your Mac awake for local agents to answer, and Cmd+Q ends the sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Connect more of a team's rooms: a PM, a designer and an engineer sharing one thread.&lt;/li&gt;
&lt;li&gt;Let the critic check against real analytics, not just heuristics.&lt;/li&gt;
&lt;li&gt;Add an agent that turns the chosen variant into a handoff spec for engineering.&lt;/li&gt;
&lt;li&gt;Run it in Slack for real workflows with a connected Slack workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switch made the hard part (rooms, identities, and agents answering in the tools people already use) a configuration problem. That let me spend my time on the design question: how do you keep the human in charge while the agents do the legwork?&lt;/p&gt;

&lt;p&gt;The repo, with the template, is at &lt;a href="https://github.com/romeet9/switchboard-studio" rel="noopener noreferrer"&gt;https://github.com/romeet9/switchboard-studio&lt;/a&gt;. If you try it, tell me what the critic caught on your brief. #HowISwitch&lt;/p&gt;

</description>
      <category>howiswitch</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>design</category>
    </item>
  </channel>
</rss>
