<?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: AKSHITH JOBIRIN S</title>
    <description>The latest articles on DEV Community by AKSHITH JOBIRIN S (@akshith07).</description>
    <link>https://dev.to/akshith07</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%2F4232282%2F34f42bd1-76a1-4e01-8001-4e3ccb16ef64.jpg</url>
      <title>DEV Community: AKSHITH JOBIRIN S</title>
      <link>https://dev.to/akshith07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akshith07"/>
    <language>en</language>
    <item>
      <title>We put an AI project manager in our team chat, built on Switch</title>
      <dc:creator>AKSHITH JOBIRIN S</dc:creator>
      <pubDate>Sat, 07 Nov 2026 14:35:03 +0000</pubDate>
      <link>https://dev.to/akshith07/we-put-an-ai-project-manager-in-our-team-chat-built-on-switch-8l9</link>
      <guid>https://dev.to/akshith07/we-put-an-ai-project-manager-in-our-team-chat-built-on-switch-8l9</guid>
      <description>&lt;p&gt;&lt;em&gt;By Akshith and Felix · Flip the Switch Hackathon, Track 01: Best Business Workflow&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Small teams rarely have a project manager. Someone still has to break down&lt;br&gt;
work, decide who owns what, chase updates, notice blockers and write the&lt;br&gt;
status report, so it ends up being a developer, in between writing code.&lt;/p&gt;

&lt;p&gt;For the Flip the Switch hackathon we built &lt;strong&gt;Foreman&lt;/strong&gt;: four AI agents that&lt;br&gt;
live in our team chat and do that coordination with us, through&lt;br&gt;
&lt;a href="https://docs.switchagents.ai" rel="noopener noreferrer"&gt;Switch&lt;/a&gt;. In one day it went from an idea to a&lt;br&gt;
working multi-project setup, with a live dashboard and real email&lt;br&gt;
notifications.&lt;/p&gt;

&lt;p&gt;This post covers how it works, how we set up Switch, and the problems we hit&lt;br&gt;
along the way. If you're trying Switch for the first time, the last section&lt;br&gt;
might save you an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/akshith-07/foreman-ai-pm" rel="noopener noreferrer"&gt;https://github.com/akshith-07/foreman-ai-pm&lt;/a&gt; · &lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://youtu.be/oSAtZTSXuw8" rel="noopener noreferrer"&gt;https://youtu.be/oSAtZTSXuw8&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
    &lt;iframe src="https://www.youtube.com/embed/oSAtZTSXuw8" width="710" height="399"&gt;
  &lt;/iframe&gt;

&lt;/h2&gt;
&lt;h2&gt;
  
  
  The idea: one room, four specialists, humans in charge
&lt;/h2&gt;

&lt;p&gt;We started with a bigger plan (four agents plus a full project-management&lt;br&gt;
web app) and cut it down hard. The rule we settled on: &lt;strong&gt;every change&lt;br&gt;
happens in the chat room, and a human approves every assignment.&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;Agent&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@foreman-pm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates projects, breaks requests into tasks, applies human decisions, answers "what's blocking the release?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@foreman-assigner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Picks an owner for each task from skills and workload across all projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@foreman-tracker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Records progress and blockers, and escalates blockers to the PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@foreman-reporter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes standups, weekly and portfolio reports&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A typical exchange in the room goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Akshith:&lt;/strong&gt; &lt;code&gt;@foreman-pm Invoicely needs Google OAuth login by Friday.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The PM creates four tasks and hands off: &lt;code&gt;@foreman-assigner please propose owners for INV-4…INV-7.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The Assigner replies with an owner and a reason for each task ("Felix,
React and login flows, 3 open tasks across projects").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Akshith:&lt;/strong&gt; &lt;code&gt;@foreman-pm approve&lt;/code&gt;. Each owner gets an email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Felix,&lt;/strong&gt; from his own laptop: &lt;code&gt;@foreman-tracker I'm blocked, the Google callback URL isn't configured.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The Tracker marks it blocked and hands it to the PM, which finds the
existing config task (owned by Diego) instead of creating a duplicate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Akshith:&lt;/strong&gt; &lt;code&gt;@foreman-pm How are all our projects doing, and is anyone overloaded?&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The handoffs between agents are the part that needs Switch. Without it,&lt;br&gt;
this would be four chatbots in four terminals that can't see each other or&lt;br&gt;
the team.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Switch fits in
&lt;/h2&gt;

&lt;p&gt;Here's what we actually used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Switch Console&lt;/strong&gt; → &lt;strong&gt;Get started → On this computer&lt;/strong&gt;. This runs a
local Switch server plus a &lt;strong&gt;bundled Mattermost&lt;/strong&gt;, so we didn't need a
Slack workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four agents&lt;/strong&gt;, all on &lt;strong&gt;Codex&lt;/strong&gt; (the ChatGPT-signed-in CLI), each
registered under &lt;strong&gt;Your Agents → Add agent&lt;/strong&gt; with its &lt;strong&gt;Directory&lt;/strong&gt; set to
our repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One room&lt;/strong&gt; (&lt;code&gt;foreman-demo&lt;/code&gt;) containing the four agents and the humans,
plus room instructions that every agent reads when it joins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who can talk to your agent → Anyone&lt;/strong&gt;, so Felix, whose chat account
isn't linked to a Switch user, could instruct the agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three Switch features shaped the design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agents only respond when @mentioned.&lt;/strong&gt; That's a built-in way to prevent
loops. We added one rule on top: &lt;em&gt;only @mention another agent when you're
handing it work, never to say thanks.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each agent has a fixed working directory.&lt;/strong&gt; We keep all the behavior in
the repo. In Switch, each agent's instructions are just two lines: &lt;em&gt;"read
&lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;agents/pm.md&lt;/code&gt; and follow them."&lt;/em&gt; That meant we changed
the prompts many times during the day without retyping anything into
Switch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex reads &lt;code&gt;AGENTS.md&lt;/code&gt; automatically.&lt;/strong&gt; That's where our shared rules
live: the roster, who hands off to whom, and the hard limits.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  The agents don't edit files; they call a tool
&lt;/h2&gt;

&lt;p&gt;The most important design decision: &lt;strong&gt;agents never hand-edit the board.&lt;/strong&gt;&lt;br&gt;
Each project is a JSON file (&lt;code&gt;projects/inv.json&lt;/code&gt;), and the only way to&lt;br&gt;
change one is &lt;code&gt;scripts/board.py&lt;/code&gt;, a small CLI that uses only the Python&lt;br&gt;
standard library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 scripts/board.py add &lt;span class="nt"&gt;-p&lt;/span&gt; INV &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Google OAuth backend"&lt;/span&gt; &lt;span class="nt"&gt;--epic&lt;/span&gt; Auth &lt;span class="nt"&gt;--priority&lt;/span&gt; high &lt;span class="nt"&gt;--due&lt;/span&gt; 2026-11-13 &lt;span class="nt"&gt;--by&lt;/span&gt; foreman-pm
python3 scripts/board.py assign INV-4 aisha &lt;span class="nt"&gt;--reason&lt;/span&gt; &lt;span class="s2"&gt;"OAuth skills, lowest load"&lt;/span&gt; &lt;span class="nt"&gt;--by&lt;/span&gt; foreman-assigner
python3 scripts/board.py approve INV-4 &lt;span class="nt"&gt;--by&lt;/span&gt; akshith
python3 scripts/board.py block INV-5 &lt;span class="s2"&gt;"callback URL missing"&lt;/span&gt; &lt;span class="nt"&gt;--by&lt;/span&gt; felix
python3 scripts/board.py portfolio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI enforces rules the prompt only asks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks start as &lt;code&gt;proposed&lt;/code&gt;, and can't be started until a human approves them.&lt;/li&gt;
&lt;li&gt;A task can't be approved without an owner.&lt;/li&gt;
&lt;li&gt;Only members of a project's team can own its tasks.&lt;/li&gt;
&lt;li&gt;Nobody can be removed from a team while they still own open work.&lt;/li&gt;
&lt;li&gt;Every change records who made it and when.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prompt says "only humans approve", and the code makes sure of it. On&lt;br&gt;
the first test run, the PM created a duplicate task. We fixed it twice: a&lt;br&gt;
"check before you add" rule in &lt;code&gt;AGENTS.md&lt;/code&gt;, and a &lt;code&gt;cancel&lt;/code&gt; command for&lt;br&gt;
proposed tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Emails the model can't invent
&lt;/h2&gt;

&lt;p&gt;We wanted owners emailed when their task is approved, and the manager when&lt;br&gt;
work is done. The key choice: &lt;strong&gt;emails are triggered by board events in&lt;br&gt;
code, never written by the model.&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;Event&lt;/th&gt;
&lt;th&gt;Who's emailed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A human approves a task&lt;/td&gt;
&lt;td&gt;the owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A task is marked done&lt;/td&gt;
&lt;td&gt;the manager (owner in cc)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The last task in a project is done (the project becomes &lt;strong&gt;Completed&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;the manager and the whole team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Someone joins a project&lt;/td&gt;
&lt;td&gt;the new member&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By default every email is saved as a &lt;code&gt;.eml&lt;/code&gt; file in &lt;code&gt;outbox/&lt;/code&gt;. With a&lt;br&gt;
&lt;code&gt;.env&lt;/code&gt; file, it's sent over SMTP. For the demo we used a local&lt;br&gt;
&lt;a href="https://mailpit.axllent.org" rel="noopener noreferrer"&gt;Mailpit&lt;/a&gt; inbox, so the emails are real but&lt;br&gt;
nothing leaves the laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;scripts/dashboard.py&lt;/code&gt; serves a small HTML, CSS and JS page (no framework,&lt;br&gt;
no build step) that polls the boards every two seconds. It has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an &lt;strong&gt;All projects&lt;/strong&gt; view with a health card per project and workload
across projects;&lt;/li&gt;
&lt;li&gt;a per-project &lt;strong&gt;Kanban board&lt;/strong&gt;, where cards slide to their new column when
an agent moves them;&lt;/li&gt;
&lt;li&gt;an &lt;strong&gt;Agents panel&lt;/strong&gt; that lights up whichever agent just acted;&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;Notifications&lt;/strong&gt; panel showing each email and whether it was sent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dashboard is read-only. If you want to change something, you say it in&lt;br&gt;
the room.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke, and how we fixed it
&lt;/h2&gt;

&lt;p&gt;This is the part we'd have wanted to read before starting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. "The local command/tool host is unavailable."&lt;/strong&gt;&lt;br&gt;
Our first agent reply couldn't run any shell command. Codex runs commands&lt;br&gt;
through a helper binary, &lt;code&gt;codex-code-mode-host&lt;/code&gt;. Ours had been moved to the&lt;br&gt;
Trash by accident, and once restored, macOS Gatekeeper blocked it ("Apple&lt;br&gt;
could not verify…").&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; System Settings → Privacy &amp;amp; Security → &lt;strong&gt;Open Anyway&lt;/strong&gt;. Then&lt;br&gt;
&lt;strong&gt;fully quit and reopen Switch Console.&lt;/strong&gt; Switch keeps long-running Codex&lt;br&gt;
processes, and those stay broken until they restart. Testing with&lt;br&gt;
&lt;code&gt;codex exec&lt;/code&gt; in a terminal is a quick way to tell a Codex problem from a&lt;br&gt;
Switch problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. "I only take instructions from my owner."&lt;/strong&gt;&lt;br&gt;
Felix's first message was refused. A new agent defaults to &lt;strong&gt;Me and my&lt;br&gt;
agents&lt;/strong&gt;, and Felix's Mattermost account wasn't linked to a Switch user.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; set &lt;strong&gt;Who can talk to your agent&lt;/strong&gt; to &lt;strong&gt;Anyone&lt;/strong&gt; on each agent.&lt;br&gt;
According to the docs, that includes chat users without a linked account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Emails failed with "Operation not permitted."&lt;/strong&gt;&lt;br&gt;
The agents run in Codex's sandbox, which has no network access, even to&lt;br&gt;
&lt;code&gt;127.0.0.1&lt;/code&gt;. That's a good default, so we kept it.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; the agents only &lt;em&gt;queue&lt;/em&gt; emails, and the dashboard server (outside&lt;br&gt;
the sandbox) runs a small &lt;strong&gt;mail relay&lt;/strong&gt; that sends queued emails every&lt;br&gt;
three seconds. Safety stayed intact and the emails still go out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Teammate on another laptop.&lt;/strong&gt;&lt;br&gt;
The bundled Mattermost only listens on &lt;code&gt;localhost&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Fix:&lt;/strong&gt; &lt;a href="https://tailscale.com" rel="noopener noreferrer"&gt;Tailscale&lt;/a&gt; and one command,&lt;br&gt;
&lt;code&gt;tailscale serve --bg &amp;lt;mattermost-port&amp;gt;&lt;/code&gt;. Felix got a private HTTPS address&lt;br&gt;
that only our Tailscale network can reach. (Use &lt;code&gt;serve&lt;/code&gt;, not &lt;code&gt;funnel&lt;/code&gt;, which&lt;br&gt;
makes it public.)&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model is the easy part.&lt;/strong&gt; Most of the work was in tool boundaries,
approvals, state and the audit trail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce rules in code, not only in prompts.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep prompts in the repo&lt;/strong&gt; and point the agents at them. It made fast
changes painless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most agent failures were environmental:&lt;/strong&gt; a quarantined binary, a
sandbox without network, a stale session. Reproduce the problem outside
the platform first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with the smallest working version, then grow it.&lt;/strong&gt; We went from 2
agents to 4, and from one project to many, only after each step worked
end to end.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Everything is in the repo, including a 20-minute setup guide and a full&lt;br&gt;
test plan: &lt;a href="https://github.com/akshith-07/foreman-ai-pm" rel="noopener noreferrer"&gt;https://github.com/akshith-07/foreman-ai-pm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to Switch, WeMakeDevs and DevTools Academy for the hackathon. This&lt;br&gt;
was a fun way to learn how much coordination agents can take on when they&lt;br&gt;
share a room with the team.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>openso</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
